Exim-bedingte Logik

Exim-bedingte Logik

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 ifist falsch und eigentlich auch nicht nötig: Die andBedingungen können jede beliebige Boolesche Funktion verwenden (vgl.Expansionsbedingungen), während $ifein 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 suchen Bcc:, 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- SMTPACLs 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

verwandte Informationen