Questa pagina descrive come utilizzare l'API Mail, uno dei servizi legacy in bundle, con il runtime Python per l'ambiente standard. La tua app può accedere ai servizi in bundle tramite l'SDK per i servizi App Engine per Python.
Panoramica
In Python, la funzionalità di gestione della posta è inclusa nel modulo
google.appengine.api.mail
. Questo è diverso da Python 2, in cui il modulo mail_handlers
era fornito da webapp. L'API Mail per Python può essere utilizzata per ricevere email e notifiche di ritorno.
Utilizzo dell'API Mail
L'app riceve la posta quando un'email viene inviata come corpo della richiesta in una richiesta HTTP POST. Affinché l'app possa gestire le email in arrivo, deve associare l'URL al percorso /_ah/mail/[ADDRESS]
. La parte [ADDRESS]
del percorso è in genere un indirizzo email con il suffisso @<Cloud-Project-ID>.appspotmail.com
. Le email inviate all'app in questo formato
verranno inoltrate alla funzione.
Python non richiede all'app di specificare uno script di gestore nel file app.yaml
, quindi puoi rimuovere tutte le sezioni handler
in app.yaml
.
Il file app.yaml
deve conservare le seguenti righe:
inbound_services:
- mail
- mail_bounce
Invio di email
Non è necessario apportare modifiche alla configurazione dell'app durante l'upgrade a Python. Il comportamento, le funzionalità e le istruzioni di configurazione per l'invio di email rimangono invariati. Per maggiori dettagli, consulta le seguenti guide:
- Invio di email per Python 2
- Riferimento all'API Mail per Python 2
- Riferimento all'API Mail per Python
Ricezione della posta
Per ricevere la posta, devi importare il modulo google.appengine.api.mail
e utilizzare la classe InboundEmailMessage
per rappresentare un'email. Questa classe deve essere creata per recuperare i contenuti dell'email dalla richiesta HTTP in entrata.
In precedenza, in Python 2, le app potevano accedere alla classe InboundEmailMessage
overriding il metodo receive()
nell'handler InboundEmailHandler
della web app.
Questo non è necessario in Python; l'app deve invece creare un nuovo oggetto.
Framework web
Quando utilizzi framework web Python, il costruttore InboundEmailMessage
riceve i byte del corpo della richiesta HTTP. Esistono diversi modi per creare l'oggetto
InboundEmailMessage
in Python. Di seguito sono riportati alcuni esempi di app Flask
e Djago:
Python 3 (Flask)
In Flask, request.get_data()
restituisce i byte della richiesta.
Python 3 (Django)
In Django, request.body
restituisce i byte del corpo della richiesta HTTP.
Per visualizzare gli esempi di codice completi di questa guida, consulta GitHub.
Altri framework conformi a WSGI
Per altri framework conformi a WSGI, ti consigliamo di utilizzare lo stesso metodo degli esempi Flask e Django per creare InboundEmailMessage
. Questo metodo funziona
quando i byte del corpo della richiesta HTTP sono direttamente disponibili.
App WSGI senza un framework web
Se la tua app è un'app WSGI che non utilizza un framework web, è possibile che i byte del corpo della richiesta HTTP non siano direttamente disponibili. Se i byte del corpo della richiesta HTTP sono disponibili direttamente, ti consigliamo di utilizzare un framework web Python.
In Python, è definito un metodo di fabbrica denominato from_environ
per
InboundEmailMessage
. Questo metodo è un metodo di classe che prende come input il
dizionario environ
WSGI
e può essere utilizzato per qualsiasi applicazione WSGI.
Nell'esempio seguente, nota come environ
viene inserito come input per otteneremail_message
:
Python 3 (app WSGI)
Ricezione di notifiche di mancato recapito
Una notifica di mancato recapito è un messaggio automatico di un sistema email che indica un problema con la consegna dei messaggi dell'app. Per elaborare le notifiche di abbandono, la tua app deve associare i percorsi degli URL in entrata al percorso /_ah/bounce
.
Come InboundEmailMessage
, la classe BounceNotification
per Python 2 era accessibile tramite la sostituzione del metodo receive()
nell'handler della web app BounceNotificationHandler
.
In Python, l'app deve istanziare l'oggetto BounceNotification
,
che può essere creato in più modi a seconda del framework web Python utilizzato.
Framework web
L'oggetto BounceNotification
viene inizializzato con i valori recuperati chiamando post_vars.get(key)
.
Quando utilizzi un framework web Python, come Flask o Django, il
costruttore BounceNotification
riceve un dizionario denominato post_vars
, che
contiene la richiesta POST dei dati del modulo. Per recuperare i dati, il metodoget()
deve essere definito nell'oggetto di input. key
è un elenco di valori di input che possono essere letti e recuperati da BounceNotification
e può essere uno dei seguenti:
original-to, original-cc, original-bcc, original-subject, original-text, notification-from, notification-to, notification-cc, notification-bcc, notification-subject, notification-text, raw-message
Nella maggior parte dei framework web, questi dati sono disponibili come dizionario multiplo nell'oggetto request. La maggior parte di questi tipi può essere convertita in un dizionario basato su stringhe.
Per tutte le chiavi tranne raw-message
, il valore può essere qualsiasi. Di solito, il valore è un singolo valore, ad esempio una stringa, o un elenco di valori, ad esempio {'to': ['bob@example.com', 'alice@example.com']}
. Il valore predefinito per tutti i campi è una stringa vuota. Questi valori verranno inseriti nelle proprietà original
e notification
.
Per la chiave raw-message
, il valore deve essere un input valido per il costruttore di
EmailMessage
.
Può essere un singolo valore o un elenco con un solo valore. La chiave raw-message
viene utilizzata per inizializzare la proprietà original_raw_message
dell'oggetto.
Python 2 (webapp2)
class LogBounceHandler(BounceNotificationHandler):
def receive(self, bounce_message):
logging.info('Received bounce post ... [%s]', self.request)
logging.info('Bounce original: %s', bounce_message.original)
logging.info('Bounce notification: %s', bounce_message.notification)
Python 3 (Flask)
In Flask,
request.form
di tipo werkzeug.datastructures.MultiDict
restituisce le variabili POST. Tuttavia, il metodo get()
per questo tipo restituisce solo un valore, anche se sono presenti più valori per la chiave.
Per ottenere tutti i valori corrispondenti a una chiave,
l'app deve chiamare
dict(request.form.lists())
,
che genera un dizionario in cui ogni valore è un elenco.
Python 3 (Django)
In Django, request.POST
di tipo django.http.QueryDict
restituisce le variabili POST. Tuttavia, il metodo get()
per questo tipo restituisce solo un valore, anche se sono presenti più valori per la chiave.
Per ottenere tutti i valori corrispondenti a una chiave,
l'app deve chiamare dict(request.POST.lists())
,
che genera un dizionario in cui ogni valore è un elenco.
App WSGI senza un framework web
Se la tua app è un'app WSGI che non utilizza un framework web, è possibile che le variabili del modulo della richiesta POST HTTP non siano direttamente disponibili in un dizionario.
In Python, è definito un metodo di fabbrica denominato from_environ
per
BounceNotification
. Questo metodo è un metodo di classe che prende il dizionario WSGIenviron
come input e può essere utilizzato per qualsiasi applicazione WSGI.
Nell'esempio seguente, nota come environ
viene inserito come input per ottenerebounce_message
:
Python 3
Esempi di codice
Per visualizzare gli esempi di codice completi di questa guida, consulta GitHub.