Questa pagina descrive come utilizzare l'API Mail, uno dei servizi in bundle legacy, con il runtime Python per l'ambiente standard. La tua app può accedere ai servizi in bundle tramite l'SDK dei servizi App Engine per Python.
Panoramica
In Python, la funzionalità di gestione della posta è inclusa nel modulo google.appengine.api.mail
. È diverso da Python 2, in cui il modulo mail_handlers
è stato fornito da webapp. L'API Mail per Python può essere utilizzata per ricevere email e notifiche di mancato recapito.
Utilizzo dell'API Mail
La tua app riceve messaggi quando un'email viene inviata come corpo della richiesta in una richiesta POST HTTP. Affinché l'app possa gestire le email in arrivo, deve corrispondere all'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 indirizzate 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 tuo file app.yaml
deve contenere le seguenti righe:
inbound_services:
- mail
- mail_bounce
Invio di messaggi
Non è necessario apportare modifiche alla configurazione dell'app quando esegui l'upgrade a Python. Il comportamento, le funzionalità e le istruzioni di configurazione per l'invio della posta rimangono invariati. Per ulteriori dettagli, consulta le seguenti guide:
Ricezione di messaggi
Per ricevere la posta, devi importare il modulo google.appengine.api.mail
e utilizzare la classe InboundEmailMessage
per rappresentare un'email. È necessario creare un'istanza di questa classe per recuperare il contenuto dell'email dalla richiesta HTTP in entrata.
In precedenza in Python 2, le app potevano accedere alla classe InboundEmailMessage
eseguendo l'override del metodo receive()
nel gestore di app web InboundEmailHandler
.
Non è necessario in Python, ma l'app deve creare un'istanza di un nuovo oggetto.
framework web
Quando utilizzi i framework web Python, il costruttore InboundEmailMessage
acquisisce i byte del corpo della richiesta HTTP. Esistono diversi modi per creare l'oggetto InboundEmailMessage
in Python. Ecco alcuni esempi per le app Flask
e Djago:
Python 3 (Flask)
In Flask, request.get_data()
fornisce i byte della richiesta.
Python 3 (Django)
In Django, request.body
fornisce i byte del corpo della richiesta HTTP.
Per visualizzare gli esempi di codice completi da questa guida, consulta GitHub.
Altri framework conformi a WSGI
Per altri framework conformi a WSGI, consigliamo di utilizzare lo stesso metodo degli esempi di Flask e Django per creare InboundEmailMessage
. Questo metodo funziona quando i byte del corpo della richiesta HTTP sono disponibili direttamente.
App WSGI senza un framework web
Se l'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, consigliamo di utilizzare un framework web Python.
In Python, per InboundEmailMessage
viene definito un metodo di fabbrica denominato from_environ
. Questo metodo è un metodo di classe che utilizza il dizionario environ
WSGI come input e può essere utilizzato per qualsiasi applicazione WSGI.
Nell'esempio seguente, osserva come environ
viene considerato come input per ottenere
mail_message
:
Python 3 (app WSGI)
Ricezione di notifiche di mancato recapito
Una notifica di mancato recapito è un messaggio automatico proveniente da un sistema email che
indica un problema con il recapito dei messaggi nella tua app. Per elaborare le notifiche di mancato recapito, la tua app deve abbinare i percorsi degli URL in entrata al percorso /_ah/bounce
.
Come InboundEmailMessage
, la classe BounceNotification
per Python 2 era
accessibile eseguendo l'override del metodo receive()
nel gestore dell'app web
BounceNotificationHandler
.
In Python, l'app deve creare un'istanza dell'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
prende un dizionario denominato post_vars
, che contiene la richiesta POST dei dati del modulo. Per recuperare i dati, il metodo get()
deve essere definito nell'oggetto di input. key
è un elenco di valori di input che possono essere letti e recuperati da BounceNotification
e possono essere:
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 multi-dizionario nell'oggetto della richiesta. 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, come {'to': ['bob@example.com', 'alice@example.com']}
. Il valore predefinito per tutti i campi
è una stringa vuota. Questi valori compileranno le 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 singolo elenco con valori. 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
fornisce le variabili POST. Tuttavia, il metodo get()
di 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
fornisce le variabili POST. Tuttavia, il metodo get()
di 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 l'app è un'app WSGI che non utilizza un framework web, è possibile che le variabili di modulo della richiesta POST HTTP non siano disponibili direttamente in un dizionario.
In Python, per BounceNotification
viene definito un metodo di fabbrica denominato from_environ
. Questo metodo è un metodo di classe che utilizza il dizionario WSGI environ
come input e può essere utilizzato per qualsiasi applicazione WSGI.
Nell'esempio seguente, osserva come environ
viene considerato come input per ottenere
bounce_message
:
Python 3
Esempi di codice
Per visualizzare gli esempi di codice completi da questa guida, consulta GitHub.