Lógica condicional Exim

Lógica condicional Exim

Estou tentando fazer com que o exim verifique o domínio dos e-mails enviados e recebidos em uma lista de domínios. Se o endereço FROM do e-mail de saída e o endereço TO/CC/BCC do e-mail recebido não estiverem na lista de domínios locais, desejo rejeitar/descartar a mensagem. Abaixo está o que eu descobri, colocado na seção "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

Mas estou recebendo o erro abaixo no meu log exim:

condição desconhecida "se" dentro da condição "e{...}"

Muito novo na sintaxe do exim, alguma ajuda será apreciada.

Responder1

A segunda ifestá incorreta e na verdade você não precisa dela: as andcondições podem usar qualquer função booleana (cf.condições de expansão), while $ifretorna uma string (cf.itens de expansãoeoperadores de expansão). Existem também alguns adicionais }. Uma condição de trabalho torna-se:

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 condição tem alguns bugs: ela não verifica múltiplos destinatários e From:endereços.

Observe também que oacl_not_smtpACL é executada somente quando um usuário (local) invoca o exim4 com oOpção -bm ou -bS. Isso significa que sua ACL impedirá que usuários locais enviem mensagens.

Se é isso que você deseja fazer, sua expressão pode ser simplificada:

  • A verificação do From:cabeçalho pode ser feita de forma mais eficaz configurando o Eximusuários confiáveis.

  • Em vez de verificar separadamente To:, Cc:e Bcc:, você pode usar a $recipientsvariável, que contém todos eles em uma ,string separada.

Tudo isso equivale a duas sub-rotinas da ACL:

  accept
    condition = ${if forall {<,${recipients}}\
                  {match_domain{${domain:${item}}}{+local_domains}}\
                }
  deny

Em geral, você pode depurar suas expansões de string e não SMTPACLs criando (ou salvando) um e-mail (digamos para email.eml) e executando:

exim4 -d-all+acl+expand -bm -t < email.eml

como raiz (aviso: isso tentará uma entrega de e-mail real), enquanto para verificar apenas as expansões execute:

exim4 -bem email.eml

informação relacionada