Routing eingehender E-Mails in PHP
Der E-Mail-Versand ist sicherlich die bekannteste Funktion für Nutzer von Mailgun. Mailgun bietet jedoch weit mehr als nur den Versand von E-Mails und das Tracking von Analysen. Wenn mich jemand fragt, was ich an Mailgun am meisten schätze, antworte ich fast immer, wie intuitiv und gut dokumentiert die API ist. Es gibt jedoch eine bestimmte Funktion, von der ich gerne erzähle: das System für das Routing und Parsing eingehender E-Mails, im Control Panel auch als „Routes“ bekannt.
Mit dem Routing eingehender E-Mails richten Sie Mailgun so ein, dass es E-Mails in Ihrem Namen empfängt. Richten Sie es für eine gesamte Domain oder eine Subdomain Ihrer Wahl ein. Ich empfehle die Nutzung einer Subdomain, da sich jeweils nur ein Dienst für den Empfang Ihrer E-Mails einrichten lässt.
Das bedeutet, dass Sie Ihren E-Mail-Client und die Inbound-Funktion von Mailgun nicht auf derselben Domain nutzen können. Aus diesem Grund sieht mein Setup wie folgt aus:
- orlando@domain.com: Diese nutze ich mit einem normalen E-Mail-Client
- robots@inbound.domain.com: wickelt andere E-Mail-Workflows über die Inbound-API von Mailgun ab.
Sobald eine E-Mail empfangen wird, bietet Mailgun verschiedene Möglichkeiten: sie an einen anderen Endpunkt Ihrer Wahl senden, an eine andere E-Mail-Adresse umleiten oder speichern, um sie später zu verarbeiten.
Großartig Wofür nutze ich das?
Alle Anhänge verarbeiten
Stellen Sie sich vor, Sie entwickeln mithilfe von E-Mails eine App, die Anhänge empfängt und automatisch an Ihr Online-Speicherkonto (wie Dropbox, Google Drive oder Ähnliches) sendet.
Was wäre, wenn diese E-Mail versteht, von wem die Anhänge stammen, was sie enthalten, und sie entsprechend sortiert?
Gute Nachrichten: Mit dem E-Mail-Routing von Mailgun ist genau das möglich.
Dazu legen Sie einen Filter für eine Domain oder Subdomain fest. Besuchen Sie für den Einstieg die Routes im Control Panel. Denken Sie daran, die DNS-Einstellungen Ihrer Domain entsprechend zu ändern, damit Ihre MX-Einträge auf Mailgun verweisen.
Eine Route besteht aus einem Filter, einer Aktion, einer Beschreibung, damit leichter verständlich ist, was die Route tut, und einer Priorität.
Ein Filter entspricht einem der folgenden Typen:
match_recipient(pattern): Hierbei ist das Muster (pattern) ein regulärer Ausdruck einer E-Mail-Adressematch_header(header, pattern): Hierbei ist die Kopfzeile eine (MIME-Kopfzeile) und das Muster ein regulärer Ausdruckcatch_all(): normalerweise die niedrigste Priorität, da jede eingehende E-Mail weitergeleitet wird
Legen Sie den obigen Filter fest, um Aktionen dynamisch auszuführen. Wenn der Filter mit einer angegebenen Adresse übereinstimmt, wird eine entsprechende Aktion ausgelöst. Eine Liste der Aktionen finden Sie unten. Denken Sie daran, dass jederzeit mehrere Aktionen gleichzeitig möglich sind:
Forward(): leitet die E-Mail an eine andere E-Mail-Adresse oder URL weiterStore(): speichert die übereinstimmende E-Mail auf dem Server von Mailgun für bis zu 3 Tage zur späteren oder verzögerten Nutzung.Stop(): hält die Aktionskette einfach an. Dies ist erforderlich, um zu verhindern, dass die Nachricht durch andere Aktionen weiter verarbeitet wird. (Darauf gehen wir später genauer ein)
Priorisieren Sie Routes, indem Sie ihnen eine entsprechende Priorität zuweisen.
- Niedrige Zahl = Hohe Priorität
- Hohe Zahl = Niedrige Priorität
Routes mit derselben Priorität werden basierend auf dem Erstellungsdatum priorisiert.
Nachdem Sie das DNS Ihrer Domain oder Subdomain eingerichtet haben, um E-Mails wie in der Dokumentation beschrieben an Mailgun weiterzuleiten , und zwar mit den Einstellungen auf Ihrer Domain-Seite , beginnt der spaßige Teil.
Erstellen, Bearbeiten und Löschen von Routes in PHP
Nach der Installation der PHP-Bibliothek erstellen wir eine neue Datei namens createRoutes.php
post("routes", array(
'priority' => $CONST_PRIORITY,
'expression' => 'match_recipient("'. $CONST_RECIPIENTEXP.'")',
'action' => array('forward("'.$CONST_FORWARDTO.'")', 'stop()'),
'description' => $CONST_DESCRIPTION
));
?>
Wie wäre es, alle Routes aufzulisten, um programmatisch zu prüfen, welche Sie bereits erstellt haben, und diese schließlich zu bearbeiten?
get(
"routes", array('skip' => 0, 'limit' => 10)
);
#Let's print some output, ofcourse you can iterate the object $result to find more information regarding the routes!
print "<strong>The whole object:</strong>";
print "<br>";
print_r($result);
print "<br>";
print "<strong>The expression assigned to the first route:</strong>";
print "<br>";
print $result->http_response_body->items[0]->expression;
print "<br>";
?>
Zu diesem Zeitpunkt haben wir erfolgreich eine Route erstellt.
Jedes Mal, wenn Mailgun eine E-Mail von jemandem mit *@sampleprovider.com empfängt, erfasst Mailgun die Nachricht und sendet einen Webhook mit dem Inhalt an http://samplewebsite.com/webhook.
Auf meiner Seite (unter der Annahme, dass http://samplewebsite.com/webhook mein Server ist) möchte ich nun den Inhalt des Webhooks erfassen, der gesendet wird, sobald ein Filter eine eingehende E-Mail abfängt.
Mailgun sendet verschiedene Arten von Kopfzeilen. Die meisten sind unten aufgeführt:
Content-Type
Date
From
In-Reply-To
Message-Id
Mime-Version
Received
References
Subject
To
X-Envelope-From
X-Mailgun-Incoming
X-Received
body-html
body-plain
domain
from
message-headers
message-url
recipient
sender
signature
stripped-html
stripped-signature
stripped-text
subject
timestamp
token
Nehmen wir an, wir möchten den Textkörper der Nachricht ohne HTML, Zeilenumbrüche und Returns in eine Datei schreiben.
Der folgende Code wird von PHP ausgeführt, sobald der von Mailgun gesendete Webhook eingeht. Er schreibt den Inhalt des Anfragetextkörpers (in diesem Fall habe ich stripped-text gewählt, es hätte aber auch jeder andere der oben genannten sein können) in eine Datei namens output.txt
Wie Sie sehen, sind die Möglichkeiten hier endlos.
Wenn Sie mehr über die Funktionen für das Routing eingehender E-Mails erfahren möchten, lesen Sie die Dokumentationsseite oder stellen Sie Ihre Fragen bzw. kommentieren Sie hier oder auf Twitter.
Viel Spaß beim Versenden.