E-Mails empfangen

E-Mail-Nachrichten werden als HTTP-Anfragen mit MIME-Daten an die Anwendung gesendet. Zur Verarbeitung eingehender E-Mail-Nachrichten ordnen Sie in der Anwendungskonfiguration E-Mail-Adressen den Skript-Handlern zu und nehmen die Handler anschließend in den Code der Anwendung auf.

Eingehende E-Mails generieren HTTP-Anfragen, die an die entsprechenden Skripts weitergeleitet werden. Die Skripts, die die eingehende E-Mails behandeln, müssen sich in Ihrem Standarddienst befinden.

Weitere Informationen zum Mail-Dienst finden Sie in der Übersicht zur Mail API.

Anwendung für den Empfang von E-Mails konfigurieren

Wenn Sie eine neue Anwendung erstellen, werden eingehende E-Mails standardmäßig deaktiviert. Um die eingehenden E-Mails zu aktivieren, müssen Sie die Datei app.yaml in Ihrem Standarddienst ändern.

  1. Fügen Sie den inbound_services-Abschnitt hinzu, der den Dienst für eingehende E-Mails aktiviert. Beispiel:

    inbound_services:
    - mail

    Wenn Sie eingehende E-Mails nicht aktivieren, indem Sie diesen Abschnitt in die Konfigurationsdatei einschließen, werden eingehende E-Mails deaktiviert und E-Mail-Nachrichten ignoriert, die an die Anwendung gesendet werden.

  2. Fügen Sie Zuordnungen zwischen URL-zugeordneten E-Mail-Adressen und Skript-Handlern hinzu.

    Die E-Mail-Adresse für den Standarddienst hat folgendes Format:

    [STRING]@[Google Cloud project ID].appspotmail.com
    

    Bei nicht standardmäßigen Diensten hat die E-Mail-Adresse folgendes Format:

    [STRING]@[servicename]-dot-[Google Cloud project ID].appspotmail.com
    

    E-Mail-Nachrichten werden als HTTP POST-Anfragen über die folgende URL an die Anwendung gesendet. Dabei steht [ADDRESS] für eine vollständige E-Mail-Adresse, einschließlich des Domainnamens:

    /_ah/mail/[ADDRESS]
    

    Um eingehende E-Mails in Ihrer App zu verarbeiten, ordnen Sie E-Mail-URLs den Handlern in der Datei app.yaml zu:

    - url: /_ah/mail/.+
      script: handle_incoming_email.app
      login: admin

    Im obigen Beispiel entspricht /_ah/mail/.+ allen E-Mails, die an die App adressiert sind. Sie können auch mehrere Handler für verschiedene E-Mail-Adressen einrichten, wie im folgenden Beispiel gezeigt:

    - url: /_ah/mail/owner@.*your_app_id\.appspotmail\.com
      script: handle_owner.app
      login: admin
    - url: /_ah/mail/support@.*your_app_id\.appspotmail\.com
      script: handle_support.app
      login: admin
    - url: /_ah/mail/.+
      script: handle_catchall.app
      login: admin

    Die URLs der eingehenden E-Mail-Nachrichten werden absteigend mit dieser Liste abgeglichen. Sollte also die URL einer E-Mail-Nachricht mit mehreren Mustern übereinstimmen, so wird der erste übereinstimmende Handler ausgeführt. Dadurch können Sie als letzte Zuordnung einen "Catchall"-Handler einfügen. Die Handler werden im Standardmodul (oder in der Anwendungsversion) ausgeführt.

Eingehende E-Mails verarbeiten

Das Python SDK definiert InboundMailHandler, eine webapp-Klasse für die Verarbeitung eingehender E-Mails. InboundMailHandlerbefindet sich im Paket google.appengine.ext.webapp.mail_handlers.

Mithilfe von InboundMailHandler:

  1. Erstellen Sie eine Unterklasse für InboundMailHandler und überschreiben Sie die Methode receive().
  2. Rufen Sie an receive() -Methode mit einem -Argument der -Klasse InboundEmailMessage , definiert durch das Python SDK.

Sie können beispielsweise eine Instanz von InboundEmailMessage wie folgt erstellen:

import logging

from google.appengine.ext.webapp.mail_handlers import InboundMailHandler
import webapp2

class LogSenderHandler(InboundMailHandler):
    def receive(self, mail_message):
        logging.info("Received a message from: " + mail_message.sender)

InboundMailHandler enthält eine Convenience-Klassenmethode vom Typ mapping(), die ein Paar zurückgibt, das mit allen eingehenden E-Mail-Adressen an den E-Mail-Handler übereinstimmt. Sie können es natürlich in jeder abgeleiteten Klasse von InboundMailHandler aufrufen, die Sie codieren:

app = webapp2.WSGIApplication([LogSenderHandler.mapping()], debug=True)

Das InboundEmailMessage -Objekt (mail_message in diesem Beispiel) enthält die E-Mail-Nachricht. Die Methode bodies() gibt die Textkörper in der Nachricht zurück. Wenn Sie bodies() ohne Argumente aufrufen, wird ein Iterator zurückgegeben, der zuerst HTML-Textkörper und dann Nur-Text-Textkörper liefert. Wenn Sie nur HTML oder nur Text verwenden möchten, übergeben Sie ein Argument an bodies():

plaintext_bodies = mail_message.bodies('text/plain')
html_bodies = mail_message.bodies('text/html')

for content_type, body in html_bodies:
    decoded_html = body.decode()
    # ...

Das InboundEmailMessage-Objekt enthält Attribute für den Zugriff auf andere Nachrichtenfelder:

  • subjectenthält den Betreff der Nachricht.
  • senderist die E-Mail-Adresse des Senders, z. B. "Nobody <nobody@example.com>".
  • to ist eine durch Kommas getrennte Liste der primären Empfänger der Nachricht, z.B. "Joe <joe@example.com>, Bill <bill@example.com>".
  • cc enthält eine durch Kommas getrennte Liste der Cc-Empfänger, z.B. "Joe <joe@example.com>, Bill <bill@example.com>".
  • date gibt das Datum der Nachricht zurück.
  • attachments ist eine Liste von Attachment -Objekten, möglicherweise leer.
  • original ist die vollständige Nachricht, einschließlich der Daten, die in den anderen Feldern wie E-Mail-Headern nicht als Python- email.message.Message verfügbar gemacht werden.

Eingehende Nachrichten mit lokalem Entwicklungsserver simulieren

Nachdem Sie die Anwendung für die Verarbeitung eingehender E-Mails eingerichtet haben, können Sie mithilfe der Entwicklungsserverkonsole eingehende E-Mail-Nachrichten simulieren:

  1. Greifen Sie als Administrator auf den Entwicklungsserver zu. Dazu rufen Sie http://localhost:8080/_ah/login auf und wählen Als Administrator anmelden aus.
  2. Klicken Sie im Menü des Entwicklungsservers auf Eingehende Mail.
  3. Füllen Sie das angezeigte Formular aus und klicken Sie auf E-Mail senden.

    Weitere Informationen, einschließlich zum Ausführen des Entwicklungsservers, finden Sie unter Python-Entwicklungsserver.