![Lógica condicional Exim](https://rvso.com/image/747348/L%C3%B3gica%20condicional%20Exim.png)
Estoy intentando que exim verifique el dominio de los correos entrantes y salientes con una lista de dominios. Si la dirección DE del correo saliente y la dirección DE/CC/CCO del correo entrante no están en la lista de dominios locales, quiero rechazar/descartar el mensaje. A continuación se muestra lo que se me ocurrió, ubicado en la sección "acl_not_smpt":
discard
condition = ${if and {{! match_domain{${domain:${address:$h_from:}}}{+local_domains}}\
{if or {\
{! match_domain{${domain:${address:$h_to:}}}{+local_domains}}}\
{! match_domain{${domain:${address:$h_cc:}}}{+local_domains}}}\
{! match_domain{${domain:${address:$h_bcc:}}}{+local_domains}}}\
}\
}\
}\
message = Mail discarded for spoofing
Pero recibo el siguiente error en mi registro de exim:
condición desconocida "si" dentro de la condición "y{...}"
Muy nuevo en la sintaxis de exim, se agradece algo de ayuda.
Respuesta1
La segunda if
es incorrecta y de hecho no la necesitas: las and
condiciones pueden usar cualquier función booleana (cf.condiciones de expansión), mientras que $if
devuelve una cadena (cf.artículos de expansiónyoperadores de expansión). También hay algunos adicionales }
. Una condición de trabajo se convierte en:
condition = ${if and {\
{!match_domain{${domain:${address:$h_from:}}}{+local_domains}}\
{ or {\
{! match_domain{${domain:${address:$h_to:}}}{+local_domains}}\
{! match_domain{${domain:${address:$h_cc:}}}{+local_domains}}\
{! match_domain{${domain:${address:$h_bcc:}}}{+local_domains}}\
}}\
}}
Esta condición tiene algunos errores: no busca múltiples destinatarios y From:
direcciones.
Observar también que elacl_not_smtpACL se ejecuta solo cuando un usuario (local) invoca exim4 con el-bm o -bS opción. Eso significa que su ACL impedirá que los usuarios locales envíen correo saliente.
Si eso es lo que quieres hacer, entonces tu expresión se puede simplificar:
La verificación del
From:
encabezado se puede realizar de manera más efectiva configurando Exim.usuarios de confianza.En lugar de verificar por separado
To:
,Cc:
yBcc:
, puede usar la$recipients
variable que los contiene todos en una,
cadena separada.
Todo esto equivale a dos estrofas de ACL:
accept
condition = ${if forall {<,${recipients}}\
{match_domain{${domain:${item}}}{+local_domains}}\
}
deny
En general, puede depurar sus expansiones de cadena y no SMTP
ACL creando (o guardando) y enviando un correo electrónico (digamos a email.eml
) y ejecutando:
exim4 -d-all+acl+expand -bm -t < email.eml
como raíz (advertencia: esto intentará una entrega de correo electrónico real), mientras que para verificar solo las expansiones ejecute:
exim4 -bem email.eml