Come ricevere e-mail con Flask Framework per Python

Pubblicato: 2020-04-30

Sebbene ci siano molti tutorial su Internet sull'invio di e-mail, c'è molto poco su come configurare un'applicazione per riceverli ed elaborarli. Questo è un compito che può essere incredibilmente difficile se stai cercando di impostare tutto da solo, ma è facile come ricevere una richiesta web quando usi la funzione di analisi in entrata di Twilio SendGrid .

In questo breve tutorial imparerai come fare in modo che Twilio SendGrid inoltri le tue email direttamente alla tua applicazione web, usando Python e il framework web Flask.

Requisiti

Questi sono i requisiti per completare questo tutorial:

  • Python 3: se il tuo sistema operativo non fornisce un interprete Python 3, puoi andare su python.org per scaricare un programma di installazione.
  • Un account Twilio SendGrid: se non conosci Twilio SendGrid puoi creare un account gratuito , che ti consente di inviare 100 e-mail al giorno per sempre.
  • Un dominio su cui riceverai email: in questo articolo userò yourdomainhere.com . Dovrai sostituirlo con il tuo nome di dominio.
  • ngrok : Useremo questa pratica utilità per connettere l'applicazione Flask in esecuzione localmente sul tuo computer a un URL pubblico a cui SendGrid può inviare richieste. Ciò è necessario per la versione di sviluppo dell'applicazione perché è probabile che il tuo computer sia protetto da un router o un firewall, quindi non è direttamente raggiungibile su Internet. Se non hai installato ngrok, puoi scaricarne una copia per Windows, MacOS o Linux .

Autenticazione del dominio

Prima che Twilio SendGrid possa accettare e-mail sul tuo dominio, devi autenticarlo , in modo che Twilio SendGrid sappia che il dominio è sotto il tuo controllo.

Avvia l'autenticazione del dominio

Per autenticare il tuo dominio, accedi al tuo account SendGrid e nella barra di navigazione a sinistra apri "Impostazioni" per poi selezionare Autenticazione mittente .

Nella pagina Autenticazione mittente , fai clic sul pulsante "Inizia" nella sezione "Autenticazione dominio".

Ti verrà chiesto di selezionare il tuo provider DNS, che nella maggior parte dei casi è la stessa società da cui hai acquistato il dominio. Se il tuo provider DNS non appare nell'elenco, o se non sai chi sono, seleziona "Non sono sicuro".

Ti verrà quindi chiesto di aggiungere il marchio ai collegamenti visualizzati nelle e-mail in uscita. Questo non è un argomento di cui ci occupiamo in questo momento, quindi seleziona "No". È possibile abilitare questa opzione in un secondo momento se si desidera utilizzarla.

Fare clic sul pulsante "Avanti" per passare alla pagina successiva.

Nella pagina seguente ti verrà chiesto di fornire il tuo nome di dominio. Ho inserito yourdomainhere.com e dovrai inserire il dominio che intendi utilizzare. Non è necessario modificare nulla nella sezione "Impostazioni avanzate".

Fare clic sul pulsante "Avanti" per procedere.

La pagina mostrerà ora 3 nuovi record DNS che devi aggiungere alla configurazione del tuo dominio, ognuno con un tipo, un nome host e un valore. Per tua comodità, l'host e i valori possono essere tutti copiati negli appunti. Di seguito puoi vedere le impostazioni che mi sono state date. I tuoi saranno simili, ma con il tuo nome di dominio in essi:

Aggiunta di voci DNS al tuo dominio

Il passaggio successivo sarà diverso a seconda del provider DNS. Visita la pagina di configurazione del tuo dominio e scopri dove vengono modificate le impostazioni DNS.

Gli screenshot seguenti sono per Google Domains . Puoi vedere come ho aggiunto il primo dei tre record DNS nell'immagine seguente. Nota che i 3 record con nomi @, ftp e www record non sono correlati a questo tutorial e sono già stati impostati sul mio dominio.

Fai attenzione a come inserisci il nome del record DNS. Mentre alcuni provider si aspettano un nome completo per i tuoi record DNS, come mostrato da SendGrid, altri si aspettano solo la parte prima del nome di dominio. Ad esempio, il record che SendGrid ha mostrato come em3329.tuodominio.com doveva essere inserito come em3329 su Google Domains. Controlla i tuoi altri record DNS e sii coerente nel modo in cui inserisci questi nuovi.

Ecco come si sono comportati i 3 nuovi record DNS dopo che li ho inseriti:

Verifica del dominio

Ora torna alla pagina Autenticazione mittente SendGrid , dove il tuo dominio apparirà come in sospeso. Cliccaci sopra per procedere con il processo di autenticazione.

Nella schermata successiva, vedrai i 3 record DNS. Fai clic sul pulsante "Verifica" in alto a destra della pagina per fare in modo che SendGrid estragga i tuoi record DNS e confermi di aver aggiunto le voci richieste.

Se SendGrid è in grado di verificare il tuo dominio, riceverai un messaggio "Ha funzionato!" pagina:

Se, invece, SendGrid non è in grado di verificare le tue voci DNS, dovrai riprovare più tardi. Ogni volta che vengono apportate modifiche al DNS, la propagazione delle modifiche tra i server DNS richiede un po' di tempo. Un errore subito dopo aver modificato le tue voci DNS significa solo che devi concedergli un po' più di tempo prima di premere nuovamente il pulsante "Verifica". Tieni presente che la propagazione completa del DNS può richiedere fino a 48 ore, sebbene di solito richieda molto meno tempo.

Una volta ottenuto il messaggio "Ha funzionato!" sei sulla buona strada per ricevere e-mail pubblicate nella tua applicazione web Flask.

Un'applicazione di posta elettronica Flask

Ora siamo pronti per scrivere una semplice applicazione web Flask in cui SendGrid può inoltrare le nostre e-mail.

Crea un ambiente virtuale Python

Seguendo le migliori pratiche di Python, creeremo una directory separata per il nostro progetto e al suo interno creeremo un ambiente virtuale . Quindi installeremo il framework Flask su di esso.

Se stai utilizzando un sistema Unix o Mac OS, apri un terminale e inserisci i seguenti comandi per eseguire le attività sopra descritte:

Se stai seguendo il tutorial su Windows, inserisci i seguenti comandi in una finestra del prompt dei comandi:

Un percorso di posta in arrivo

Ora scriviamo un'applicazione Flask che riceverà le e-mail in arrivo. Di seguito è riportato il codice per l'applicazione completa. Inserisci questo codice in un file chiamato app.py .

L'applicazione ha un solo percorso web connesso all'URL /email . Faremo in modo che SendGrid invochi questo percorso per passarci le e-mail in arrivo. La richiesta che inviano conterrà tutti i dettagli relativi all'e-mail inviata come post di un modulo HTTP standard. Ciò significa che da Flask possiamo accedere facilmente a tutti questi dettagli dal dizionario `request.form`.

Le seguenti variabili di modulo sono di particolare interesse:

  • `request.form['from']`: il mittente dell'e-mail
  • `request.form['to']`: i destinatari dell'e-mail
  • `request.form['subject']`: l'oggetto dell'email
  • `request.form['text']` il corpo dell'email in formato testo normale
  • `request.form['html']` il corpo dell'email in formato HTML

Nota che questi non sono gli unici campi inviati da SendGrid. Esamina l' elenco completo dei parametri e-mail nella documentazione di SendGrid.

Poiché l'elaborazione delle e-mail dipende in gran parte da ciascuna applicazione, ad esempio l'applicazione Flask, tutto ciò che facciamo è stampare i campi e-mail sulla console.

Dopo aver salvato app.py puoi avviare l'applicazione Flask come segue:

L'applicazione è ora in esecuzione e in attesa di richieste in arrivo, ma è raggiungibile solo dal tuo computer. Lascia l'applicazione in esecuzione sulla finestra del tuo terminale per ora. Nella prossima sezione lo esporremo a Internet.

Il webhook di analisi in entrata di SendGrid

L'ultimo di questo tutorial consiste nel configurare SendGrid per inoltrare le email in arrivo sul tuo dominio all'applicazione Flask.

A partire da ngrok

Lo strumento ngrok crea un URL disponibile pubblicamente e lo mappa a un'applicazione in esecuzione localmente. Questa è una tecnica comune utilizzata per esporre i servizi su Internet per lo sviluppo e il test. Una volta completata l'applicazione Flask, la distribuirai per la produzione su un server adeguato e questo non sarà più necessario.

Se non lo hai ancora fatto, installa ngrok sul tuo sistema. Lascia l'applicazione Flask in esecuzione e apri una seconda finestra di terminale per avviare ngrok come segue:

Questo sta dicendo a ngrok di creare un "tunnel" da Internet pubblico alla porta 5000 nella nostra macchina locale, dove l'applicazione Flask è in attesa di richieste web. L'output di ngrok apparirà come segue:

Nota le righe che iniziano con "Inoltro" nella schermata di ngrok. Questi mostrano un URL pubblico generato casualmente che ngrok utilizza per reindirizzare le richieste al nostro servizio. Utilizzeremo l' URL https:// perché utilizza la crittografia.

Registrazione dell'URL del webhook con SendGrid

Torna alla dashboard di SendGrid e in Impostazioni seleziona Analisi in entrata , quindi fai clic su "Aggiungi host e URL".

Nella pagina successiva inserisci il sottodominio su cui riceverai le email. Può trattarsi di qualsiasi sottodominio che non è ancora in uso nel tuo dominio o, se preferisci ricevere e-mail direttamente sul tuo dominio di primo livello, puoi semplicemente lasciarlo vuoto. Nell'immagine qui sotto, ho usato il sottodominio parse , il che significa che le email accettate da SendGrid avranno il formato < any>@parse.yourdomainhere.com . Lasciare vuoto il campo del sottodominio consentirà a SendGrid di accettare e-mail per <anything>@yourdomainhere.com , che in alcuni casi potrebbe essere preferibile.

Successivamente devi selezionare il tuo nome di dominio . Questo è un elenco a discesa che mostra tutti i domini che hai verificato con SendGrid. Se lo fai per la prima volta vedrai solo il dominio che hai verificato in precedenza.

Il campo seguente è per l' URL di destinazione del tuo webhook. Questo è l'URL generato da ngrok aggiunto all'URL Flask /email . Nel mio caso questo era https://bbf1b72b.ngrok.io/email . Avrai un URL simile, ma la prima parte del nome host ngrok sarà diversa.

Fai clic su "Aggiungi" per configurare il tuo webhook.

Ora vedrai una voce per il tuo webhook nella pagina principale di analisi in entrata:

Nota: gli URL di ngrok cambiano ogni volta che ngrok viene arrestato e riavviato, quindi durante lo sviluppo dovrai modificare il tuo webhook per aggiornare l'URL ogni volta che riavvii ngrok. Quando distribuisci il tuo webhook per uso di produzione, lo ospiterai direttamente su un URL pubblico, quindi ngrok non verrà utilizzato.

Registrazione del sottodominio di analisi

Il sottodominio che hai selezionato per ricevere le email nella sezione precedente deve essere definito nella configurazione DNS del tuo dominio con un record `MX`. Il valore di questo record è lo stesso per tutti i clienti SendGrid: `mx.sendgrid.net.` (notare il punto finale dopo "net").

Nella mia configurazione DNS di Google Domains, ho definito il mio sottodominio di analisi come segue:

Ricorda che, a seconda del provider di dominio che utilizzi, potrebbe essere necessario inserire il nome host completo per questo record DNS, quindi in tal caso sarebbe parse.yourdomainhere.com .

Se hai deciso di non definire un sottodominio nella sezione precedente, il tuo nome host sarà yourdomainhere.com , che per alcuni provider DNS deve essere indicato come " @".

Ricorda che anche questa modifica del DNS dovrà propagarsi, quindi potresti non essere in grado di ricevere e-mail immediatamente.

Invio di un'e-mail di prova

Mentre l'applicazione Flask e ngrok sono entrambi in esecuzione, apri il tuo client di posta elettronica e invia un'e-mail di prova. Nel campo "A:" puoi inserire qualsiasi nome utente che desideri, poiché SendGrid acquisisce tutti i nomi utente. Quello che segue @ deve essere il tuo dominio completo di ricezione della posta elettronica.

Nell'esempio seguente ho inviato un'e-mail a [email protected] :

Attendi un minuto o due affinché SendGrid riceva l'e-mail e la inoltri all'URL del webhook ngrok, che a sua volta la passerà all'endpoint /email di Flask. Come hai visto sopra, il semplice endpoint che ho scritto nell'applicazione Flask stampa i dati e-mail ricevuti sulla console:

Quindi è tutto, ora stiamo ricevendo e-mail come richieste web nella nostra applicazione Flask!

Distribuzione di produzione

In questa sezione, voglio evidenziare un paio di importanti differenze tra i webhook distribuiti durante lo sviluppo e quelli destinati all'uso in produzione.

Distribuzioni senza ngrok

Come accennato in precedenza, ngrok non è uno strumento di produzione e non dovrebbe mai essere utilizzato in una distribuzione di produzione. Invece, distribuirai la tua applicazione Flask su un server connesso direttamente a Internet. Ci sono diverse opzioni di distribuzione discusse nella documentazione di Flask.

Sicurezza del webhook

Considera che il tuo endpoint di ricezione della posta elettronica è disponibile pubblicamente su Internet, quindi chiunque conosca l'URL può inviargli una richiesta, esponendo potenzialmente la tua applicazione a invocazioni spurie inviate da utenti malintenzionati che fingono di essere richieste SendGrid.

Una buona misura per prevenire questo tipo di attacco è implementare l' autenticazione di base sull'endpoint Flask. L' estensione Flask-HTTPAuth può essere utile per implementare questo tipo di sicurezza.

Se aggiungi l'autenticazione al tuo endpoint, devi includere il nome utente e la password nell'URL del webhook fornito a SendGrid. Il webhook che ho usato sopra dovrebbe essere dato come https://username:[email protected]/email.

Conclusione

Anche se sono necessari molti passaggi per impostare tutto per ricevere e-mail, questo è uno dei modi più semplici per ottenerlo. Per ulteriori informazioni sull'analisi in entrata, consulta la nostra pagina dei documenti.

Non vediamo l'ora di vedere cosa crei con Inbound Parse!