![Lógica condicional Exim](https://rvso.com/image/747348/L%C3%B3gica%20condicional%20Exim.png)
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 if
está incorreta e na verdade você não precisa dela: as and
condições podem usar qualquer função booleana (cf.condições de expansão), while $if
retorna 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:
eBcc:
, você pode usar a$recipients
variá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 SMTP
ACLs 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