Ricezione di email

I messaggi email inviati alla tua app vengono implementati come richieste HTTP contenenti dati MIME. Per elaborare i messaggi email in arrivo, devi associare gli indirizzi email ai gestori di script nella configurazione dell'app, quindi includere i gestori nel codice dell'app.

L'email in arrivo genera richieste HTTP, che vengono passate agli script appropriati. Gli script che gestiscono l'email in arrivo devono risiedere nel servizio predefinito.

Per ulteriori informazioni sul servizio Mail, consulta la 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 abilitare l'email in arrivo, devi modificare il file app.yaml nel tuo servizio predefinito.

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

    inbound_services:
    - mail

    Se non abiliti la posta in arrivo includendo questa sezione nel file di configurazione, la posta in arrivo viene disabilitata e i messaggi email inviati all'app vengono ignorati.

  2. Aggiungi mappature che associano gli indirizzi email mappati con 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 HTTP POST utilizzando il seguente URL, dove [ADDRESS] è un indirizzo email completo, incluso il nome di dominio:

    /_ah/mail/[ADDRESS]
    

    Per gestire le email in arrivo nella tua app, mappa gli URL 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 configurare più gestori per indirizzi email diversi, come 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 vengono abbinati a questo elenco dal primo all'ultimo, quindi se l'URL di un messaggio email corrisponde a più di un pattern, verrà eseguito il primo gestore corrispondente. Ciò consente di includere un gestore "catchall" come ultima mappatura. I gestori vengono eseguiti nel modulo predefinito (o nella versione dell'applicazione).

Gestione delle email in arrivo

L'SDK Python definisce InboundMailHandler, una classe di app web per la gestione delle email in arrivo. InboundMailHandler si trova nel pacchetto google.appengine.ext.webapp.mail_handlers.

Per utilizzare InboundMailHandler:

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

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

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 corrispondente a tutti gli indirizzi email in arrivo al gestore della posta e, ovviamente, puoi chiamarla in qualsiasi sottoclasse di InboundMailHandler che codifichi:

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

L'oggetto InboundEmailMessage (mail_message in questo esempio) contiene il messaggio email. Il metodo bodies() restituisce i corpi all'interno del messaggio. Se chiami bodies() senza argomenti, viene restituito un iteratore che genera prima corpi HTML, poi corpi di testo normale. Se vuoi solo HTML o solo 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 campi di messaggi:

  • 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 oggetti Attachment, potenzialmente vuoto.
  • original è il messaggio completo, inclusi i dati non esposti da altri campi come le intestazioni email, come Python email.message.Message.

Simulazione di messaggi in arrivo con il server di sviluppo locale

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

  1. Accedi al server di sviluppo come amministratore andando all'indirizzo http://localhost:8080/_ah/login 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ù, incluse informazioni su come eseguire il server di sviluppo, consulta la pagina relativa al server di sviluppo Python.