Ricezione email

I messaggi email inviati alla tua app vengono implementati come richieste HTTP contenenti MIME e i dati di Google Cloud. Per elaborare i messaggi email in arrivo, devi associare gli indirizzi email a i gestori di script nella configurazione dell'app, quindi includi i gestori il codice dell'app.

La posta in arrivo genera richieste HTTP, che vengono trasmesse all'indirizzo script. Gli script che gestiscono la posta in arrivo devono risiedere nel tuo completamente gestito di Google Cloud.

Per ulteriori informazioni sul servizio di posta, vedi Panoramica dell'API Mail.

Configurazione dell'applicazione per la ricezione di email

Quando crei una nuova app, la posta in arrivo è disattivata per impostazione predefinita. Per attivare il email in arrivo, devi modificare il file app.yaml nel servizio predefinito.

  1. Aggiungi una sezione inbound_services che attivi il servizio email in arrivo. Ad esempio:

    inbound_services:
    - mail

    Se non attivi la posta in arrivo includendo questa sezione nella tua configurazione del file di configurazione, la posta in arrivo viene disattivata e i messaggi email inviati all'app vengono ignorati.

  2. Aggiungi mappature che associano gli indirizzi email mappati agli URL ai gestori di script.

    Per il servizio predefinito, l'indirizzo email per la ricezione delle email ha il seguente formato:

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

    Per i servizi non predefiniti, l'indirizzo email ha il seguente formato:

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

    I messaggi email vengono inviati alla tua app come richieste POST HTTP utilizzando il seguente URL, dove [ADDRESS] è un indirizzo email completo, che include nome dominio:

    /_ah/mail/[ADDRESS]
    

    Per gestire le email in arrivo nella tua app, mappa gli URL delle email ai gestori nel File app.yaml:

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

    Nell'esempio precedente, /_ah/mail/.+ corrisponde a tutte le email indirizzate all'app. Se preferisci, puoi impostare più gestori per email diverse come indicato nell'esempio seguente:

    - 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

    Gli URL dei messaggi email in arrivo corrispondono a questo elenco dal primo all'ultimo, Pertanto, se l'URL di un messaggio email corrisponde a più di un pattern, la prima corrispondenza sarà quello eseguito. Ciò ti permette di includere una "catchall" come ultima mappatura. I gestori vengono eseguiti nel modulo predefinito (o dell'applicazione).

Gestione della posta in arrivo

L'SDK Python definisce InboundMailHandler, una classe dell'app web per la gestione le email in arrivo. InboundMailHandler è in google.appengine.ext.webapp.mail_handlers pacchetto.

Per usare InboundMailHandler:

  1. Crea una sottoclasse per InboundMailHandler e sostituisci receive() .
  2. Richiama il metodo receive() con un argomento della classe InboundEmailMessage, definita dall'SDK Python.

Ad esempio, puoi creare un'istanza di InboundEmailMessage come questa:

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 contiene un metodo della classe di convenienza mapping() che restituisce una coppia che corrisponde a tutti gli indirizzi email in arrivo al gestore della posta e di puoi chiamarlo in qualsiasi sottoclasse di InboundMailHandler in codice:

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

L'oggetto InboundEmailMessage (mail_message in questo esempio) contiene . Il suo metodo bodies() restituisce il corpo del messaggio. Se chiami bodies() senza argomenti, restituisce un iteratore che restituisce HTML corpi del testo, poi corpi di testo normale. Se vuoi solo HTML o testo normale, puoi passare un argomento a 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()
    # ...

L'oggetto InboundEmailMessage include attributi per accedere ad altri messaggi campi:

  • subject contiene l'oggetto del messaggio.
  • sender è l'indirizzo del mittente, ad esempio "Nobody <nobody@example.com>".
  • to è un elenco separato da virgole dei destinatari principali del messaggio, ad esempio "Joe <joe@example.com>, Bill <bill@example.com>".
  • cc contiene un elenco separato da virgole di destinatari in Cc, ad esempio "Joe <joe@example.com>, Bill <bill@example.com>".
  • date restituisce la data del messaggio.
  • attachments è un elenco di Attachment potenzialmente vuoti.
  • original è il messaggio completo, inclusi i dati non esposti dall'altro come le intestazioni delle email, come Python email.message.Message.

Simulazione dei messaggi in arrivo con il server di sviluppo locale

Dopo aver configurato l'app per gestire la posta in arrivo, puoi utilizzare console del server di sviluppo per simulare i messaggi email in arrivo:

  1. Per accedere al server di sviluppo come amministratore, vai a http://localhost:8080/console e selezionando Accedi come amministratore.
  2. Nel server di sviluppo, fai clic su Posta in entrata nel menu di navigazione.
  3. Compila il modulo visualizzato e fai clic su Invia email.

    Per saperne di più, incluso come eseguire il server di sviluppo, vedi il server di sviluppo Python.