![Exim-bedingte Logik](https://rvso.com/image/747348/Exim-bedingte%20Logik.png)
Ich versuche, Exim dazu zu bringen, die Domänen ausgehender und eingehender E-Mails anhand einer Domänenliste zu überprüfen. Wenn die Absenderadresse der ausgehenden E-Mail und die Empfänger-/CC-/BCC-Adresse der eingehenden E-Mail nicht in der Liste der lokalen Domänen enthalten sind, möchte ich die Nachricht ablehnen/verwerfen. Nachfolgend finden Sie mein Ergebnis, das im Abschnitt „acl_not_smpt“ aufgeführt ist:
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
Aber ich erhalte den folgenden Fehler in meinem Exim-Protokoll:
unbekannte Bedingung "if" innerhalb der "and{...}"-Bedingung
Bin mit der Exim-Syntax noch sehr vertraut, für jede Hilfe wäre ich dankbar.
Antwort1
Die zweite if
ist falsch und eigentlich auch nicht nötig: Die and
Bedingungen können jede beliebige Boolesche Funktion verwenden (vgl.Expansionsbedingungen), während $if
ein String zurückgegeben wird (vgl.ErweiterungselementeUndExpansionsbetreiber). Es gibt auch einige zusätzliche }
. Eine Arbeitsbedingung wird:
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}}\
}}\
}}
Diese Bedingung weist einige Fehler auf: Es wird nicht auf mehrere Empfänger und From:
Adressen geprüft.
Beachten Sie auch, dass dieacl_not_smtpACL wird nur ausgeführt, wenn ein (lokaler) Benutzer exim4 mit demOption -bm oder -bS. Das bedeutet, dass Ihre ACL lokale Benutzer daran hindert, ausgehende E-Mails zu senden.
Wenn Sie dies tun möchten, kann Ihr Ausdruck vereinfacht werden:
Die Überprüfung des
From:
Headers kann effektiver durchgeführt werden, indem Eximsvertrauenswürdige Benutzer.Anstatt separat nach
To:
,Cc:
und zu suchenBcc:
, können Sie die Variable verwenden$recipients
, die alle in einer,
separaten Zeichenfolge enthält.
All dies läuft auf zwei ACL-Strophen hinaus:
accept
condition = ${if forall {<,${recipients}}\
{match_domain{${domain:${item}}}{+local_domains}}\
}
deny
Im Allgemeinen können Sie Ihre Zeichenfolgenerweiterungen und Nicht- SMTP
ACLs debuggen, indem Sie eine E-Mail erstellen (oder speichern) (sagen wir an email.eml
) und Folgendes ausführen:
exim4 -d-all+acl+expand -bm -t < email.eml
als Root (Warnung: hierdurch wird ein echter E-Mail-Versand versucht), während zur Überprüfung nur der Erweiterungen Folgendes ausgeführt wird:
exim4 -bem email.eml