So empfangen Sie E-Mails mit dem Flask Framework für Python

Veröffentlicht: 2020-04-30

Während es im Internet viele Tutorials zum Versenden von E-Mails gibt, gibt es nur sehr wenig darüber, wie man eine Anwendung konfiguriert, um sie zu empfangen und zu verarbeiten. Dies ist eine Aufgabe, die unglaublich schwierig sein kann, wenn Sie versuchen, alles selbst einzurichten, aber es ist so einfach wie das Empfangen einer Webanfrage, wenn Sie die Inbound Parse -Funktion von Twilio SendGrid verwenden .

In diesem kurzen Tutorial erfahren Sie, wie Sie Twilio SendGrid Ihre E-Mails mithilfe von Python und dem Flask-Webframework direkt an Ihre Webanwendung weiterleiten lassen.

Anforderungen

Dies sind die Voraussetzungen, um dieses Tutorial abzuschließen:

  • Python 3: Wenn Ihr Betriebssystem keinen Python 3-Interpreter bereitstellt, können Sie zu python.org gehen, um ein Installationsprogramm herunterzuladen.
  • Ein Twilio SendGrid-Konto: Wenn Sie neu bei Twilio SendGrid sind, können Sie ein kostenloses Konto erstellen , mit dem Sie für immer 100 E-Mails pro Tag senden können.
  • Eine Domain, auf der Sie E-Mails erhalten: In diesem Artikel verwende ich yourdomainhere.com . Sie müssen ihn durch Ihren eigenen Domainnamen ersetzen.
  • ngrok : Wir verwenden dieses praktische Dienstprogramm, um die lokal auf Ihrem Computer ausgeführte Flask-Anwendung mit einer öffentlichen URL zu verbinden, an die SendGrid Anfragen senden kann. Dies ist für die Entwicklungsversion der Anwendung erforderlich, da sich Ihr Computer wahrscheinlich hinter einem Router oder einer Firewall befindet und daher nicht direkt über das Internet erreichbar ist. Wenn Sie ngrok nicht installiert haben, können Sie eine Kopie für Windows, MacOS oder Linux herunterladen .

Domänenauthentifizierung

Bevor Twilio SendGrid E-Mails auf Ihrer Domain akzeptieren kann, müssen Sie es authentifizieren , damit Twilio SendGrid weiß, dass die Domain unter Ihrer Kontrolle steht.

Initiieren Sie die Domänenauthentifizierung

Um Ihre Domain zu authentifizieren, melden Sie sich bei Ihrem SendGrid -Konto an und öffnen Sie in der linken Navigationsleiste „Einstellungen“, um dann Senderauthentifizierung auszuwählen .

Klicken Sie auf der Seite „ Absenderauthentifizierung “ im Abschnitt „Domain-Authentifizierung“ auf die Schaltfläche „Erste Schritte“.

Sie werden aufgefordert, Ihren DNS-Anbieter auszuwählen, der in den meisten Fällen dieselbe Firma ist, von der Sie Ihre Domain gekauft haben. Wenn Ihr DNS-Anbieter nicht in der Liste erscheint oder Sie nicht wissen, wer er ist, wählen Sie einfach „Ich bin mir nicht sicher“.

Sie werden dann gefragt, ob Sie Links, die in ausgehenden E-Mails erscheinen, mit Branding versehen möchten. Dies ist kein Thema, mit dem wir uns derzeit befassen, also wählen Sie „Nein“. Sie können diese Option zu einem späteren Zeitpunkt aktivieren, wenn Sie sie verwenden möchten.

Klicken Sie auf die Schaltfläche „Weiter“, um zur nächsten Seite zu gelangen.

Auf der folgenden Seite werden Sie aufgefordert, Ihren Domainnamen anzugeben. Ich habe yourdomainhere.com eingegeben , und Sie müssen die Domain eingeben, die Sie verwenden möchten. Im Abschnitt „Erweiterte Einstellungen“ müssen Sie nichts ändern.

Klicken Sie auf die Schaltfläche „Weiter“, um fortzufahren.

Auf der Seite werden nun 3 neue DNS-Einträge angezeigt, die Sie Ihrer Domänenkonfiguration hinzufügen müssen, jeweils mit einem Typ, einem Hostnamen und einem Wert. Zu Ihrer Bequemlichkeit können der Host und die Werte alle in die Zwischenablage kopiert werden. Unten sehen Sie die Einstellungen, die ich erhalten habe. Ihre werden ähnlich sein, aber mit Ihrem eigenen Domainnamen darin:

Hinzufügen von DNS-Einträgen zu Ihrer Domain

Der nächste Schritt wird je nach DNS-Anbieter unterschiedlich sein. Besuchen Sie die Konfigurationsseite Ihrer Domain und finden Sie heraus, wo die DNS-Einstellungen bearbeitet werden.

Die folgenden Screenshots gelten für Google Domains . Im folgenden Bild können Sie sehen, wie ich den ersten der drei DNS-Einträge hinzugefügt habe. Beachten Sie, dass die 3 Datensätze mit den Namen @, ftp und www Datensätze nichts mit diesem Tutorial zu tun haben und bereits auf meiner Domain festgelegt wurden.

Achten Sie darauf, wie Sie den Namen des DNS-Eintrags eingeben. Während einige Anbieter einen vollqualifizierten Namen für Ihre DNS-Einträge erwarten, wie von SendGrid gezeigt, erwarten andere nur den Teil vor dem Domänennamen. Beispielsweise musste der Eintrag, den SendGrid als em3329.yourdomainhere.com anzeigte, als em3329 in Google Domains eingegeben werden . Überprüfen Sie Ihre anderen DNS-Einträge und geben Sie diese neuen Einträge konsequent ein.

So sahen die 3 neuen DNS-Einträge aus, nachdem ich sie eingegeben hatte:

Domain-Verifizierung

Gehen Sie nun zurück zur SendGrid- Absenderauthentifizierungsseite , auf der Ihre Domain als ausstehend angezeigt wird. Klicken Sie darauf, um mit dem Authentifizierungsprozess fortzufahren.

Auf dem nächsten Bildschirm sehen Sie die 3 DNS-Einträge. Klicken Sie oben rechts auf der Seite auf die Schaltfläche „Verifizieren“, damit SendGrid Ihre DNS-Einträge abruft und bestätigt, dass Sie die angeforderten Einträge hinzugefügt haben.

Wenn SendGrid Ihre Domain verifizieren kann, erhalten Sie die Meldung „Es hat funktioniert!“. Seite:

Wenn SendGrid Ihre DNS-Einträge hingegen nicht verifizieren kann, müssen Sie es später erneut versuchen. Jedes Mal, wenn DNS-Änderungen vorgenommen werden, dauert es einige Zeit, bis die Änderungen über DNS-Server weitergegeben werden. Ein Fehler direkt nach dem Bearbeiten Ihrer DNS-Einträge bedeutet nur, dass Sie ihm etwas mehr Zeit geben müssen, bevor Sie erneut auf die Schaltfläche „Verifizieren“ klicken. Beachten Sie, dass es bis zu 48 Stunden dauern kann, bis DNS vollständig verbreitet ist, obwohl es normalerweise viel weniger Zeit in Anspruch nimmt.

Sobald Sie das "Es hat funktioniert!" Seite sind Sie auf dem besten Weg, E-Mails zu erhalten, die in Ihrer Flask-Webanwendung gepostet werden.

Eine Flask-E-Mail-Anwendung

Jetzt können wir eine einfache Flask-Webanwendung schreiben, in der SendGrid unsere E-Mails weiterleiten kann.

Erstellen Sie eine virtuelle Python-Umgebung

Gemäß den Best Practices von Python werden wir ein separates Verzeichnis für unser Projekt erstellen und darin eine virtuelle Umgebung erstellen . Wir werden dann das Flask-Framework darauf installieren.

Wenn Sie ein Unix- oder Mac OS-System verwenden, öffnen Sie ein Terminal und geben Sie die folgenden Befehle ein, um die oben beschriebenen Aufgaben auszuführen:

Wenn Sie dem Lernprogramm unter Windows folgen, geben Sie die folgenden Befehle in ein Eingabeaufforderungsfenster ein:

Eine eingehende E-Mail-Route

Lassen Sie uns nun eine Flask-Anwendung schreiben, die eingehende E-Mails empfängt. Der Code für die vollständige Anwendung ist unten dargestellt. Fügen Sie diesen Code in eine Datei namens app.py ein .

Die Anwendung hat nur eine Webroute, die mit der /email- URL verbunden ist. Wir lassen SendGrid diese Route aufrufen, um eingehende E-Mails an uns weiterzuleiten. Die von ihnen gesendete Anfrage enthält alle Details zu der E-Mail, die als Standard-HTTP-Formular-Post gesendet wird. Das bedeutet, dass wir von Flask aus leicht auf all diese Details aus dem Wörterbuch „request.form“ zugreifen können.

Von besonderem Interesse sind folgende Formularvariablen:

  • `request.form['from']`: der Absender der E-Mail
  • `request.form['to']`: der/die Empfänger der E-Mail
  • `request.form['subject']`: der E-Mail-Betreff
  • `request.form['text']` der E-Mail-Text im Klartextformat
  • `request.form['html']` der E-Mail-Text im HTML-Format

Beachten Sie, dass dies nicht die einzigen Felder sind, die von SendGrid übermittelt werden. Überprüfen Sie die vollständige Liste der E-Mail-Parameter in der SendGrid-Dokumentation.

Da die Verarbeitung von E-Mails weitgehend von jeder Anwendung abhängt, drucken wir zum Beispiel in der Flask-Anwendung lediglich die E-Mail-Felder an die Konsole aus.

Nachdem Sie app.py gespeichert haben, können Sie die Flask-Anwendung wie folgt starten:

Die Anwendung wird jetzt ausgeführt und wartet auf eingehende Anfragen, ist jedoch nur von Ihrem eigenen Computer aus erreichbar. Lassen Sie die Anwendung vorerst in Ihrem Terminalfenster laufen. Im nächsten Abschnitt stellen wir es dem Internet zur Verfügung.

Der SendGrid Inbound Parse-Webhook

Der letzte Teil dieses Tutorials besteht darin, SendGrid so zu konfigurieren, dass eingehende E-Mails auf Ihrer Domain an die Flask-Anwendung weitergeleitet werden.

Ngrok starten

Das ngrok-Tool erstellt eine öffentlich verfügbare URL und ordnet sie einer lokal ausgeführten Anwendung zu. Dies ist eine gängige Technik, die verwendet wird, um Dienste im Internet zu Entwicklungs- und Testzwecken verfügbar zu machen. Sobald Ihre Flask-Anwendung fertig ist, stellen Sie sie für die Produktion auf einem geeigneten Server bereit und dies ist nicht mehr erforderlich.

Falls noch nicht geschehen, installieren Sie ngrok auf Ihrem System. Lassen Sie die Flask-Anwendung laufen und öffnen Sie ein zweites Terminalfenster, um ngrok wie folgt zu starten:

Dies weist ngrok an, einen „Tunnel“ vom öffentlichen Internet zu Port 5000 auf unserem lokalen Computer zu erstellen, wo die Flask-Anwendung auf Webanfragen wartet. Die Ausgabe von ngrok wird wie folgt aussehen:

Beachten Sie die Zeilen, die im ngrok-Bildschirm mit „Forwarding“ beginnen. Diese zeigen eine zufällig generierte öffentliche URL, die ngrok verwendet, um Anfragen an unseren Dienst weiterzuleiten. Wir werden die URL https:// verwenden, da sie Verschlüsselung verwendet.

Registrieren der Webhook-URL bei SendGrid

Gehen Sie zurück zum SendGrid-Dashboard und wählen Sie unter Einstellungen die Option Inbound Parse aus und klicken Sie dann auf „Host & URL hinzufügen“.

Geben Sie auf der nächsten Seite die Subdomain ein, auf der Sie E-Mails erhalten. Dies kann eine beliebige Subdomain sein, die noch nicht auf Ihrer Domain verwendet wird, oder wenn Sie es vorziehen, E-Mails direkt auf Ihrer Top-Level-Domain zu erhalten, kann sie einfach leer gelassen werden. In der Abbildung unten habe ich die Subdomain parse verwendet , was bedeutet, dass E-Mails, die von SendGrid akzeptiert werden, das Format < any>@parse.yourdomainhere.com haben . Wenn Sie das Subdomain-Feld leer lassen, kann SendGrid E-Mails für <anything>@yourdomainhere.com akzeptieren , was in manchen Fällen vorzuziehen sein kann.

Als nächstes müssen Sie Ihren Domainnamen auswählen . Dies ist eine Dropdown-Liste, die alle Domänen anzeigt, die Sie mit SendGrid verifiziert haben. Wenn Sie dies zum ersten Mal tun, sehen Sie nur die Domain, die Sie zuvor verifiziert haben.

Das folgende Feld ist für die Ziel-URL für Ihren Webhook. Dies ist die von ngrok generierte URL, an die die Flask-URL /email angehängt ist . In meinem Fall war dies https://bbf1b72b.ngrok.io/email . Sie werden eine ähnliche URL haben, aber der erste Teil des ngrok-Hostnamens wird anders sein.

Klicken Sie auf „Hinzufügen“, um Ihren Webhook zu konfigurieren.

Jetzt sehen Sie einen Eintrag für Ihren Webhook auf der Hauptseite von Inbound Parse:

Hinweis: ngrok-URLs ändern sich jedes Mal, wenn ngrok gestoppt und neu gestartet wird. Daher müssen Sie während der Entwicklung Ihren Webhook bearbeiten, um die URL bei jedem Neustart von ngrok zu aktualisieren. Wenn Sie Ihren Webhook für die Produktionsnutzung bereitstellen, hosten Sie ihn direkt auf einer öffentlichen URL, sodass ngrok nicht verwendet wird.

Registrieren der Parse-Subdomain

Die Subdomain, die Sie im vorherigen Abschnitt für den Empfang von E-Mails ausgewählt haben, muss in der DNS-Konfiguration Ihrer Domain mit einem „MX“-Eintrag definiert werden. Der Wert für diesen Datensatz ist für alle SendGrid-Kunden gleich: „mx.sendgrid.net.“ (beachten Sie den nachgestellten Punkt nach „net“).

In meiner Google Domains-DNS-Konfiguration habe ich meine Parse- Subdomain wie folgt definiert:

Denken Sie daran, dass Sie je nach verwendetem Domain-Anbieter möglicherweise den vollständigen Hostnamen für diesen DNS-Eintrag eingeben müssen, in diesem Fall also parse.yourdomainhere.com .

Wenn Sie sich im vorherigen Abschnitt entschieden haben, keine Subdomain zu definieren, lautet Ihr Hostname yourdomainhere.com , der bei einigen DNS-Anbietern als „ @“ angegeben werden muss.

Denken Sie daran, dass diese DNS-Änderung auch weitergegeben werden muss, sodass Sie E-Mails möglicherweise nicht sofort empfangen können.

Senden einer Test-E-Mail

Während Ihre Flask-Anwendung und ngrok ausgeführt werden, öffnen Sie Ihren E-Mail-Client und senden Sie eine Test-E-Mail. Im Feld „An:“ können Sie einen beliebigen Benutzernamen eingeben, da SendGrid alle Benutzernamen erfasst. Was nach dem @ kommt, muss Ihre vollständige E-Mail-Empfangsdomäne sein.

Im folgenden Beispiel habe ich eine E-Mail an [email protected] gesendet :

Warten Sie ein oder zwei Minuten, bis SendGrid die E-Mail empfängt und an die ngrok-Webhook-URL weiterleitet, die sie wiederum an den /email - Endpunkt von Flask weiterleitet. Wie Sie oben gesehen haben, gibt der einfache Endpunkt, den ich in der Flask-Anwendung geschrieben habe, die empfangenen E-Mail-Daten an die Konsole aus:

Das ist es also, wir erhalten jetzt E-Mails als Webanfragen in unserer Flask-Anwendung!

Produktionsbereitstellung

In diesem Abschnitt möchte ich auf einige wichtige Unterschiede zwischen Webhooks hinweisen, die während der Entwicklung bereitgestellt werden, und solchen, die für den Produktionseinsatz vorgesehen sind.

Bereitstellungen ohne ngrok

Wie oben erwähnt, ist ngrok kein Produktionstool und sollte niemals in einer Produktionsbereitstellung verwendet werden. Stattdessen stellen Sie Ihre Flask-Anwendung auf einem Server bereit, der direkt mit dem Internet verbunden ist. In der Flask-Dokumentation werden mehrere Bereitstellungsoptionen erläutert.

Webhook-Sicherheit

Bedenken Sie, dass Ihr E-Mail-Empfangsendpunkt öffentlich im Internet verfügbar ist, sodass jeder, der die URL kennt, eine Anfrage an ihn senden kann, wodurch Ihre Anwendung möglicherweise falschen Aufrufen ausgesetzt wird, die von böswilligen Benutzern gesendet werden, die vorgeben, SendGrid-Anfragen zu sein.

Eine gute Maßnahme zur Verhinderung dieser Art von Angriffen ist die Implementierung der Standardauthentifizierung auf Ihrem Flask-Endpunkt. Die Flask-HTTPAuth- Erweiterung kann bei der Implementierung dieser Art von Sicherheit hilfreich sein.

Wenn Sie Ihrem Endpunkt eine Authentifizierung hinzufügen, müssen Sie den Benutzernamen und das Kennwort in die an SendGrid übergebene Webhook-URL einfügen. Der Webhook, den ich oben verwendet habe, müsste als https://username:[email protected]/email angegeben werden.

Fazit

Auch wenn viele Schritte erforderlich sind, um alles für den Empfang von E-Mails einzurichten, ist dies eine der einfachsten Möglichkeiten, dies zu erreichen. Weitere Informationen zu Inbound Parse finden Sie auf unserer Dokumentationsseite.

Wir können es kaum erwarten zu sehen, was Sie mit Inbound Parse erstellen!