Lógica condicional Exim

Lógica condicional Exim

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 ifes incorrecta y de hecho no la necesitas: las andcondiciones pueden usar cualquier función booleana (cf.condiciones de expansión), mientras que $ifdevuelve 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:y Bcc:, puede usar la $recipientsvariable 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 SMTPACL 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

información relacionada