So leiten Sie eingehende E-Mails mit Exim an Ihre Anwendung weiter

0
60
dwori/Shutterstock.com

Exim ist ein beliebter Message Transfer Agent (MTA) für Unix-Systeme. Es bietet eine Vielzahl von Routen- und Transportmöglichkeiten. In diesem Artikel zeigen wir, wie Sie mit Exim eingehende E-Mails in Ihr eigenes Skript umleiten.

Wir gehen davon aus, dass Sie bereits über einen funktionierenden Exim-Server verfügen, der’ ;s in der Lage, E-Mails zu empfangen. Das offizielle Wiki bietet informative Anleitungen, wenn Sie mit einer Neuinstallation bei Null anfangen.

Exim-Konfiguration verwalten

Die verfügbaren Konfigurationsansätze variieren je nach Betriebssystemverteilung. Eine aus dem Quellcode erstellte Exim-Installation verwendet src/configure.default als Konfigurationsdatei.

Die Datei für Exim, die von einem Paketmanager installiert wird, ist normalerweise /etc/exim/config oder /etc/exim.conf. Sie können den derzeit verwendeten Pfad finden, indem Sie exim -bP configure_file ausführen.

Debian-basierte Betriebssysteme haben ein etwas komplizierteres System. Es gibt zwei mögliche Konfigurationsmethoden: eine einzelne Datei, /etc/exim4/exim4.conf.template, oder geteilte Konfigurationsdateien innerhalb von /etc/exim4/conf.d. Sie müssen update-exim4.conf ausführen, nachdem Sie Änderungen vorgenommen haben. Dadurch wird eine einzelne zusammengeführte Datei erstellt, die tatsächlich von Exim gelesen wird.

Werbung

Exim sollte jedes Mal neu gestartet werden, wenn Sie seine Konfiguration ändern. Führen Sie den Dienst exim4 restart aus, um Ihre Änderungen zu übernehmen.

Erstellen eines Routers

Der erste Schritt, um E-Mails an Ihre Anwendung zu senden, besteht darin, einen benutzerdefinierten Router zu definieren. Router gleichen eingehende E-Mails mit einer Reihe von Bedingungen ab, um den zu verwendenden Zustellmechanismus zu bestimmen.

Router werden in der Reihenfolge verarbeitet, in der sie in der Konfigurationsdatei zu finden sind. Alle Router über Ihrem in der Datei könnten zuerst mit eingehenden E-Mails übereinstimmen.

Fügen Sie Ihren Router zu Ihrer Konfigurationsdatei im Abschnitt ROUTERS CONFIGURATION hinzu. Wenn Sie die geteilte Debian-Konfiguration verwenden, können Sie stattdessen eine neue Datei in /etc/exim4/conf.d/routers erstellen. Router werden bei diesem Ansatz in alphabetischer Reihenfolge kombiniert.

Hier ein Beispiel-Router:

example_router: driver = accept domains = example.com transport = example_transport

This ist ein einfacher Router, der mit jeder an example.com gesendeten E-Mail übereinstimmt. Wenn eine Übereinstimmung verarbeitet wird, akzeptiert Exim die Nachricht und liefert sie mit dem Transport example_transport aus. Wir erstellen dies als nächstes.

Erstellen eines Transports

Sobald eine E-Mail von einem Router akzeptiert wurde, wird sie von einem Transportunternehmen zugestellt. Transporte sind für die Implementierung der Nachrichtenzustellungsroutine verantwortlich. Verschiedene Treiber können per SMTP über das Internet gesendet, an einen lokalen Unix-Benutzer übertragen oder in eine Datei geschrieben werden.

Werbung

Wenn Sie einen benutzerdefinierten Transport basierend auf einem integrierten Treiber erstellen, können Sie passende E-Mails senden zu Ihrer eigenen Bewerbung. Sie können dann jede E-Mail einzeln außerhalb von Exim bearbeiten.

Im Gegensatz zu Routern spielt die Reihenfolge der Transporte keine Rolle. Jede eingehende E-Mail wird dem einzelnen Transport zugeordnet, der vom Router angegeben wird, der sie akzeptiert. Fügen Sie Ihren Transport an einer beliebigen Stelle im Abschnitt TRANSPORTKONFIGURATION Ihrer Exim-Datei hinzu. Debian-Benutzer mit aktivierter Split-Konfiguration können eine Datei in /etc/exim4/conf.d/transports erstellen.

Hier ein Transport, der ein PHP-Skript aufruft:

example_transport: driver = pipe command = /usr/bin/php /var/www/html/handle_incoming_email.php user = www-data group = www-data

In Kombination mit dem obigen Beispielrouter wird jede an @example.com gesendete E-Mail an handle_incoming_email.php gesendet. Exim liefert die gesamte E-Mail im RFC-konformen Format als Standardeingabe für den Befehl, damit Sie sie in Ihrer Programmiersprache lesen können.

//E-Mail-Inhalt von Standardeingabe in PHP abrufen $email = fopen(&quot ;php://stdin", "r");   //An: user@example.com //Betreff: Demo-E-Mail ////Dies ist eine E-Mail.

Der Transport wird mit dem Pipe Driver konfiguriert. Dies verwendet eine Unix-Pipe, um die eingehende E-Mail an Ihren Befehl zu senden. Der Befehl wird als der von Ihnen angegebene Benutzer und die von Ihnen angegebene Gruppe ausgeführt.

Verwenden von Umgebungsvariablen

Exim setzt mehrere Umgebungsvariablen, bevor Ihr Befehl ausgeführt wird. Diese können verwendet werden, um auf Informationen über die Nachricht zuzugreifen, ohne das vollständige E-Mail-Format analysieren zu müssen.

Verfügbare Variablen umfassen:

  • DOMAIN – Die Domain, an die die eingehende E-Mail gesendet wurde.
  • MESSAGE_ID – Die interne ID von Exim, die die E-Mail repräsentiert.
  • EMPFÄNGER – Die E-Mail-Adresse, an die die Nachricht gesendet wurde.
  • SENDER – Die E-Mail-Adresse, von der die Nachricht stammt.

Sie können der Umgebung des Befehls zusätzliche Variablen hinzufügen, indem Sie die Umgebungsoption in Ihrem Transport festlegen. Dies akzeptiert eine durch Kommas getrennte Liste von Schlüssel-Wert-Paaren:

example_transport: environment = foo=bar,demo=example

Rückgabewerte

Ihr Befehl sollte mit einem 0-Statuscode beendet werden, um eine erfolgreiche Zustellung zu bestätigen. Ein Exit-Code ungleich Null wird als fehlgeschlagene Zustellung interpretiert. Der Absender erhält eine Bounce-Nachricht.

Werbung

Dieses Verhalten wird deaktiviert, indem Sie die Option ignore_status in Ihrem Transport festlegen. Exim behandelt dann Statuscodes ungleich null als erfolgreich.

Darüber hinaus können Sie die Option temp_errors verwenden, um Skript-Exit-Codes zu definieren, die anzeigen, dass ein Fehler aufgetreten ist, der jedoch voraussichtlich temporär ist. Wenn Exim einen dieser Statuscodes sieht, wird die Nachrichtenzustellung verzögert und später erneut versucht.

Der Inhalt von Bounce-Nachrichten kann mit der Option return_fail_output angepasst werden. Wenn dies auf “true” gesetzt ist, fügt Exim den Inhalt der Standardausgabe Ihres Skripts in seine Bounce-E-Mail ein. Der Mechanismus erleichtert die Verwendung Ihres Anwendungscodes, um personalisierte Bounce-Antworten an Absender zu senden.

Befehlsaufruf

Exim ruft Ihren Befehl normalerweise direkt aus dem Transport auf. Wenn Sie die Option use_shell setzen, wird der Befehl stattdessen an /bin/sh übergeben. Dies kann in Szenarien nützlich sein, in denen Ihr Skript erfordert, dass eine vollständige Shell-Umgebung verfügbar ist.

Bei der Standardkonfiguration wird die Befehlsausführung nach einer Stunde abgebrochen. Ein Timeout wird als Übermittlungsfehler behandelt. Der Befehl wird beendet und eine Bounce-Nachricht an den Absender zurückgesendet. Die Zeitüberschreitung kann mit der Zeitüberschreitungseinstellung angepasst werden. Wenn Sie zusätzlich die Option timeout_defer setzen, werden Timeouts als temporäre Fehler behandelt, was einen weiteren Zustellversuch nach einer Verzögerung ermöglicht.

example_transport: timeout = 5m timeout_defer Werbung

Sie sollten auch berücksichtigen, dass Ihr Skript möglicherweise ausgeführt wird gleichzeitig, wenn mehrere E-Mails gleichzeitig eingehen. Ihre Bewerbung sollte dieser Möglichkeit standhalten können. Sperrsysteme, die nur eine Instanz gleichzeitig ausführen lassen, sollten für Ihr E-Mail-Verarbeitungsskript deaktiviert werden.

Schlussfolgerung

Exim lässt sich einfach so konfigurieren, dass eingehende E-Mails an Ihre eigenen weitergeleitet werden Anwendung. Ein einfaches Setup, das alle empfangenen Nachrichten leitet, kann mit einem einfachen Router erreicht werden, der mit dem Pipe-Treiber an einen Transport gekoppelt ist.

Sie müssen als Teil Ihrer Anwendung eine Binärdatei bereitstellen, die eine E-Mail über die Standardeingabe akzeptiert. Die Binärdatei wird von Exim immer dann aufgerufen, wenn eine neue Nachricht empfangen wird. Sie sollten die E-Mail dann auf standardkonforme Weise parsen, um den für Ihr System relevanten Nachrichtentext und Nachrichtenkopf herauszuziehen.