Email

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.
Bild für 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-Adresse
  • match_header(header, pattern): Hierbei ist die Kopfzeile eine (MIME-Kopfzeile) und das Muster ein regulärer Ausdruck
  • catch_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 weiter
  • Store(): 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.