Cum să primiți e-mailuri cu Flask Framework pentru Python

Publicat: 2020-04-30

Deși există o mulțime de tutoriale pe Internet despre trimiterea de e-mailuri, există foarte puține despre cum să configurați o aplicație pentru a le primi și a le procesa. Aceasta este o sarcină care poate fi incredibil de dificilă dacă încercați să configurați totul de unul singur, dar este la fel de ușor ca și primirea unei cereri web atunci când utilizați funcția Inbound Parse a Twilio SendGrid .

În acest scurt tutorial, veți învăța cum să aveți Twilio SendGrid să vă redirecționeze e-mailurile direct către aplicația dvs. web, folosind Python și cadrul web Flask.

Cerințe

Acestea sunt cerințele pentru a finaliza acest tutorial:

  • Python 3: Dacă sistemul dvs. de operare nu oferă un interpret Python 3, puteți accesa python.org pentru a descărca un program de instalare.
  • Un cont Twilio SendGrid: Dacă sunteți nou la Twilio SendGrid, vă puteți crea un cont gratuit , care vă permite să trimiteți 100 de e-mailuri pe zi pentru totdeauna.
  • Un domeniu pe care veți primi e-mailuri: pe parcursul acestui articol, voi folosi domeniul dvs. aici.com . Va trebui să-l înlocuiți cu propriul nume de domeniu.
  • ngrok : Vom folosi acest utilitar la îndemână pentru a conecta aplicația Flask care rulează local pe computerul dvs. la o adresă URL publică la care SendGrid poate trimite cereri. Acest lucru este necesar pentru versiunea de dezvoltare a aplicației, deoarece computerul dvs. este probabil în spatele unui router sau firewall, deci nu este accesibil direct pe Internet. Dacă nu aveți instalat ngrok, puteți descărca o copie pentru Windows, MacOS sau Linux .

Autentificarea domeniului

Înainte ca Twilio SendGrid să accepte e-mailuri pe domeniul dvs., trebuie să îl autentificați , astfel încât Twilio SendGrid să știe că domeniul se află sub controlul dvs.

Inițiază autentificarea domeniului

Pentru a vă autentifica domeniul, conectați -vă la contul SendGrid, iar în bara de navigare din stânga deschideți „Setări” pentru a selecta apoi Autentificare expeditor .

În pagina de autentificare a expeditorului , faceți clic pe butonul „Începeți” din secțiunea „Autentificarea domeniului”.

Vi se va cere să selectați furnizorul DNS, care în cele mai multe cazuri este aceeași companie de la care v-ați achiziționat domeniul. Dacă furnizorul dvs. de DNS nu apare pe listă sau dacă nu știți cine sunt, trebuie doar să selectați „Nu sunt sigur”.

Veți fi apoi întrebat despre adăugarea mărcii la linkurile care apar în e-mailurile trimise. Acesta nu este un subiect care ne preocupă în acest moment, așa că selectați „Nu”. Puteți activa această opțiune mai târziu dacă doriți să o utilizați.

Faceți clic pe butonul „Următorul” pentru a continua la pagina următoare.

În pagina următoare vi se va cere să furnizați numele dvs. de domeniu. Am introdus yourdomainhere.com și va trebui să introduceți domeniul pe care intenționați să îl utilizați. Nu trebuie să modificați nimic în secțiunea „Setări avansate”.

Faceți clic pe butonul „Următorul” pentru a continua.

Pagina va afișa acum 3 noi înregistrări DNS pe care trebuie să le adăugați la configurația domeniului dvs., fiecare cu un tip, un nume de gazdă și o valoare. Pentru confortul dvs., gazda și valorile pot fi toate copiate în clipboard. Mai jos puteți vedea setările care mi-au fost date. Al tău va fi similar, dar cu propriul tău nume de domeniu în ele:

Adăugarea de intrări DNS la domeniul dvs

Următorul pas va fi diferit în funcție de furnizorul dvs. de DNS. Vizitați pagina de configurare a domeniului dvs. și găsiți unde sunt editate setările DNS.

Capturile de ecran de mai jos sunt pentru Google Domains . Puteți vedea cum am adăugat prima dintre cele trei înregistrări DNS în imaginea următoare. Rețineți că cele 3 înregistrări cu nume @, ftp și www nu au legătură cu acest tutorial și au fost deja setate pe domeniul meu.

Aveți grijă cum introduceți numele înregistrării DNS. În timp ce unii furnizori așteaptă un nume complet calificat pentru înregistrările dvs. DNS, așa cum arată SendGrid, alții așteaptă doar porțiunea dinaintea numelui de domeniu. De exemplu, înregistrarea pe care SendGrid a afișat-o ca em3329.yourdomainhere.com a trebuit să fie introdusă ca em3329 pe Google Domains. Verificați celelalte înregistrări DNS ale dvs. și fiți consecvent în modul în care introduceți aceste noi înregistrări.

Iată cum au arătat cele 3 noi înregistrări DNS după ce le-am introdus:

Verificarea domeniului

Acum reveniți la pagina de autentificare a expeditorului SendGrid , unde domeniul dvs. va apărea ca în așteptare. Faceți clic pe el pentru a continua procesul de autentificare.

În ecranul următor, veți vedea cele 3 înregistrări DNS. Faceți clic pe butonul „Verificați” din partea dreaptă sus a paginii pentru ca SendGrid să vă extragă înregistrările DNS și să confirmați că ați adăugat intrările solicitate.

Dacă SendGrid vă poate verifica domeniul, veți primi un mesaj „A funcționat!” pagină:

Dacă, pe de altă parte, SendGrid nu vă poate verifica intrările DNS, va trebui să încercați din nou mai târziu. De fiecare dată când se fac modificări DNS, este nevoie de o anumită perioadă de timp pentru ca modificările să se propagă pe serverele DNS. Un eșec imediat după editarea intrărilor DNS înseamnă doar că trebuie să îi acordați ceva mai mult timp înainte de a apăsa din nou butonul „Verificați”. Rețineți că poate dura până la 48 de ore pentru ca DNS să se propagă complet, deși de obicei durează mult mai puțin.

Odată ce obții „A funcționat!” pagina sunteți pe cale să primiți e-mailuri postate în aplicația dvs. web Flask.

O aplicație de e-mail Flask

Acum suntem gata să scriem o aplicație web Flask simplă, unde SendGrid ne poate redirecționa e-mailurile.

Creați un mediu virtual Python

Urmând cele mai bune practici Python, vom crea un director separat pentru proiectul nostru și în interiorul acestuia vom crea un mediu virtual . Apoi vom instala cadrul Flask pe el.

Dacă utilizați un sistem Unix sau Mac OS, deschideți un terminal și introduceți următoarele comenzi pentru a efectua sarcinile descrise mai sus:

Dacă urmați tutorialul pe Windows, introduceți următoarele comenzi într-o fereastră de prompt de comandă:

O rută de e-mail de intrare

Să scriem acum o aplicație Flask care va primi e-mailurile primite. Codul pentru cererea completă este prezentat mai jos. Puneți acest cod într-un fișier numit app.py .

Aplicația are o singură rută web conectată la adresa URL /email . Vom cere SendGrid să invoce această rută pentru a ne transmite e-mailurile primite. Solicitarea pe care o trimit va avea toate detaliile legate de e-mailul trimis ca postare de formular HTTP standard. Aceasta înseamnă că din Flask putem accesa cu ușurință toate aceste detalii din dicționarul `request.form`.

Următoarele variabile de formă prezintă un interes deosebit:

  • `request.form['from']`: expeditorul e-mailului
  • `request.form['to']`: destinatarul (destinatarii) e-mailului
  • `request.form['subject']`: subiectul e-mailului
  • `request.form['text']` corpul e-mailului în format text simplu
  • `request.form['html']` corpul e-mailului în format HTML

Rețineți că acestea nu sunt singurele câmpuri trimise de SendGrid. Consultați lista completă a parametrilor de e-mail din documentația SendGrid.

Deoarece procesarea e-mailurilor depinde în mare măsură de fiecare aplicație, pentru exemplul aplicației Flask, tot ceea ce facem este să tipărim câmpurile de e-mail pe consolă.

După ce salvați app.py , puteți porni aplicația Flask după cum urmează:

Aplicația rulează acum și ascultă cererile primite, dar este accesibilă numai de pe propriul computer. Lăsați aplicația să ruleze pe fereastra terminalului pentru moment. În secțiunea următoare îl vom expune pe Internet.

Webhook-ul SendGrid Inbound Parse

Ultimul din acest tutorial este să configurați SendGrid pentru a redirecționa e-mailurile primite de pe domeniul dvs. către aplicația Flask.

Începând ngrok

Instrumentul ngrok creează o adresă URL disponibilă public și o mapează la o aplicație care rulează local. Aceasta este o tehnică comună folosită pentru a expune serviciile de pe Internet pentru dezvoltare și testare. Odată ce aplicația dvs. Flask este completă, o veți implementa pentru producție pe un server adecvat și acest lucru nu va mai fi necesar.

Dacă nu ați făcut-o încă, instalați ngrok pe sistemul dvs. Lăsați aplicația Flask în funcțiune și deschideți o a doua fereastră de terminal pentru a porni ngrok după cum urmează:

Acest lucru îi spune ngrok să creeze un „tunel” de pe internetul public în portul 5000 din mașina noastră locală, unde aplicația Flask așteaptă cereri web. Ieșirea lui ngrok va arăta după cum urmează:

Observați liniile care încep cu „Redirecționare” în ecranul ngrok. Acestea arată o adresă URL publică generată aleatoriu pe care ngrok o folosește pentru a redirecționa cererile către serviciul nostru. Vom folosi URL-ul https:// , deoarece folosește criptarea.

Înregistrarea URL-ului webhook cu SendGrid

Reveniți la tabloul de bord SendGrid și, sub Setări, selectați Inbound Parse , apoi faceți clic pe „Adăugați gazdă și URL”.

În pagina următoare introduceți subdomeniul pe care veți primi e-mailuri. Acesta poate fi orice subdomeniu care nu este încă utilizat pe domeniul dvs. sau, dacă preferați să primiți e-mailuri direct pe domeniul dvs. de nivel superior, acesta poate fi lăsat gol. În imaginea de mai jos, am folosit subdomeniul parse , ceea ce înseamnă că e-mailurile care sunt acceptate de SendGrid vor avea formatul < orice>@parse.yourdomainhere.com . Lăsând câmpul subdomeniului gol, SendGrid va permite să accepte e-mailuri pentru <orice>@yourdomainhere.com , ceea ce în unele cazuri poate fi de preferat.

Apoi trebuie să selectați numele domeniului dvs. Aceasta este o listă derulantă care arată toate domeniile pe care le-ați verificat cu SendGrid. Dacă faceți acest lucru pentru prima dată, veți vedea doar domeniul pe care l-ați verificat mai devreme.

Următorul câmp este pentru adresa URL de destinație pentru webhook-ul dvs. Aceasta este adresa URL generată de ngrok atașată cu URL-ul Flask /email . În cazul meu, acesta a fost https://bbf1b72b.ngrok.io/email . Veți avea o adresă URL similară, dar prima parte a numelui de gazdă ngrok va fi diferită.

Faceți clic pe „Adăugați” pentru a vă configura webhook.

Acum veți vedea o intrare pentru webhook-ul dvs. în pagina principală Inbound Parse:

Notă: URL-urile ngrok se schimbă de fiecare dată când ngrok este oprit și repornit, așa că în timpul dezvoltării va trebui să editați webhook-ul pentru a actualiza adresa URL de fiecare dată când reporniți ngrok. Când implementați webhook-ul pentru utilizare în producție, îl veți găzdui direct pe o adresă URL publică, astfel încât ngrok nu va fi folosit.

Înregistrarea subdomeniului de analiză

Subdomeniul pe care l-ați selectat pentru a primi e-mailuri în secțiunea anterioară trebuie să fie definit în configurația DNS a domeniului dvs. cu o înregistrare `MX`. Valoarea acestei înregistrări este aceeași pentru toți clienții SendGrid: `mx.sendgrid.net.` (rețineți punctul final după „net”).

În configurația mea DNS Google Domains, mi-am definit subdomeniul de analiză după cum urmează:

Amintiți-vă că, în funcție de furnizorul de domeniu pe care îl utilizați, poate fi necesar să introduceți numele de gazdă complet pentru această înregistrare DNS, deci în acest caz ar fi parse.yourdomainhere.com .

Dacă ați decis să nu definiți un subdomeniu în secțiunea anterioară, atunci numele dvs. de gazdă va fi domeniul dvs. aici.com , care pentru unii furnizori de DNS trebuie să fie dat ca „ @”.

Amintiți-vă că această modificare DNS va trebui, de asemenea, să se propage, așa că este posibil să nu puteți primi imediat e-mailuri.

Trimiterea unui e-mail de testare

În timp ce aplicația dvs. Flask și ngrok rulează, deschideți clientul de e-mail și trimiteți un e-mail de test. În câmpul „Către:” puteți introduce orice nume de utilizator doriți, deoarece SendGrid captează toate numele de utilizator. Ceea ce urmează după @ trebuie să fie domeniul dvs. complet de primire a e-mailurilor.

În exemplul de mai jos am trimis un e-mail la [email protected] :

Așteptați un minut sau două pentru ca SendGrid să primească e-mailul și să-l redirecționeze către URL-ul webhook-ului ngrok, care, la rândul său, îl va transmite punctului final /email al Flask. După cum ați văzut mai sus, punctul final simplu pe care l-am scris în aplicația Flask imprimă datele de e-mail primite pe consolă:

Deci, asta este, acum primim e-mailuri ca solicitări web în aplicația noastră Flask!

Desfășurarea producției

În această secțiune, vreau să subliniez câteva diferențe importante între webhook-urile implementate în timpul dezvoltării și cele destinate utilizării în producție.

Implementări fără ngrok

După cum sa menționat mai sus, ngrok nu este un instrument de producție și nu ar trebui să fie utilizat niciodată într-o implementare de producție. În schimb, veți implementa aplicația dvs. Flask pe un server care este conectat direct la Internet. Există mai multe opțiuni de implementare discutate în documentația Flask.

Securitate webhook

Luați în considerare că punctul final de primire a e-mailului este disponibil public pe Internet, astfel încât oricine cunoaște adresa URL poate trimite o solicitare către acesta, expunând eventual aplicația dvs. la invocări false trimise de utilizatori rău intenționați care se prefac a fi solicitări SendGrid.

O măsură bună pentru a preveni acest tip de atac este să implementați autentificarea de bază pe punctul final Flask. Extensia Flask-HTTPAuth poate fi de ajutor în implementarea acestui tip de securitate.

Dacă adăugați autentificare la punctul final, atunci trebuie să includeți numele de utilizator și parola în URL-ul webhook-ului dat către SendGrid. Webhook-ul pe care l-am folosit mai sus ar trebui să fie dat ca https://username:[email protected]/email.

Concluzie

Chiar dacă există o mulțime de pași implicați în configurarea totul pentru a primi e-mailuri, aceasta este una dintre cele mai simple modalități de a realiza acest lucru. Pentru mai multe informații despre Inbound Parse, consultați pagina noastră de documente.

Abia așteptăm să vedem ce construiești cu Inbound Parse!