Ricezione della posta con l'API Mail

Questa guida descrive come utilizzare l'API Mail per ricevere 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.

Le email in arrivo generano richieste HTTP, che vengono passate agli script appropriati. Gli script che gestiscono le email in arrivo devono risiedere nel servizio predefinito.

Per saperne di più sul servizio Mail, consulta la panoramica dell'API Mail.

Prima di iniziare

Devi registrare le email dei mittenti come mittenti autorizzati. Per saperne di più, consulta Chi può inviare email.

Configurare l'applicazione per ricevere email

Quando crei una nuova app, le email in arrivo sono disattivate per impostazione predefinita. Per attivare le email in arrivo, devi modificare il file app.yaml nel servizio predefinito.

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

    inbound_services:
    - mail

    Se non attivi le email in arrivo includendo questa sezione nel file di configurazione, le email in arrivo vengono disattivate e i messaggi email inviati all'app vengono ignorati.

  2. Aggiungi mapping che associano gli indirizzi email mappati con gli 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 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 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 confrontati con 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. In questo modo puoi includere un gestore "catchall" come ultimo mapping. I gestori vengono eseguiti nel modulo predefinito (o nella versione dell'applicazione).

Gestire le email in arrivo

Quando utilizzi i framework web Python, il costruttore InboundEmailMessage accetta i byte del corpo della richiesta HTTP. Esistono diversi modi per creare l'oggetto InboundEmailMessage in Python. In Flask, request.get_data() fornisce i byte della richiesta. L'oggetto InboundEmailMessage contiene il messaggio email. Il metodo bodies() restituisce i corpi all'interno del messaggio. Se chiami bodies() senza argomenti, restituisce un iteratore che genera prima i corpi HTML, poi i corpi di testo normale. Se vuoi solo HTML o solo testo normale, puoi passare un argomento a bodies():

@app.route("/_ah/mail/<path>", methods=["POST"])
def receive_mail(path):
    message = mail.InboundEmailMessage(request.get_data())

    # Do something with the message
    print(
        f"Received greeting for {escape(message.to)} at {escape(message.date)} from {escape(message.sender)}"
    )
    for content_type, payload in message.bodies("text/plain"):
        print(f"Text/plain body: {payload.decode()}")
        break

    return "OK", 200

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

  • subject contiene l'oggetto del messaggio.
  • sender è l'indirizzo del mittente, ad es. "Nobody <nobody@example.com>".
  • to è un elenco separato da virgole dei destinatari principali del messaggio, ad es. "Joe <joe@example.com>, Bill <bill@example.com>".
  • cc contiene un elenco separato da virgole dei destinatari in copia conoscenza, ad es. "Joe <joe@example.com>, Bill <bill@example.com>".
  • date restituisce la data del messaggio.
  • attachments è un elenco di Attachment oggetti, che potrebbe essere vuoto.
  • original è il messaggio completo, inclusi i dati non esposti dagli altri campi, come le intestazioni delle email, come un Python email.message.Message.

Simulare i messaggi in arrivo con il server di sviluppo locale

Dopo aver configurato l'app per gestire le 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/console e selezionando Accedi come amministratore.
  2. Nel server di sviluppo, fai clic su Email in arrivo nella navigazione.
  3. Compila il modulo visualizzato e fai clic su Invia email.

    Per avviare il server di sviluppo, consulta Server di sviluppo locale.

Scopri di più sulle considerazioni sulla migrazione per l'API Mail nella guida Gestori di posta.