15 Aug 2016, o piesă de 14 minute de Dev Mukherjee
Majoritatea serviciilor de internet trebuie să trimită e-mailuri către utilizatorii lor. Construirea mesajului este o sarcină separată de trimiterea e-mailului. Această postare demonstrează construirea corectă a mesajelor MIME (Multipurpose Internet Mail Extensions) în Python.
Mesajele MIME au multe subtipuri pentru a încapsula diferite tipuri de conținut. Biblioteca MIME pentru e-mailuri din Python oferă wrappers pentru a lucra cu acestea. Vom explora următoarele subtipuri pentru a demonstra cum să împachetăm corect mesajele:
-
mixed
utilizate pentru a trimite conținut de diferite tipuri, în linie sau ca atașamente -
alternative
utilizate pentru a trimite versiuni alternative ale aceluiași conținut, de exemplu, gruparea versiunilor de text simplu și HTML ale corpului unui e-mail -
related
utilizate pentru a include resurse conexe în linie sau ca atașamente, de ex. imaginile utilizate în conținutul HTML
Mesajul de e-mail pe care îl vom crea în această postare va conține:
- Versiuni HTML și text simplu ale conținutului corpului mesajului
- Un fișier atașat (care în acest caz este un fișier
ICS
generat) - Opțional aveți o imagine în conținutul HTML
Să începem prin a crea un mesaj MIME multipart mixed
care va găzdui diferitele componente (corpul mesajului de e-mail, imagini afișate inline și atașamente descărcabile) ale mesajului nostru:
from email.mime.multipart import MIMEMultipart# By default the type is set to mixedmessage = MIMEMultipart()message = "Hello World"message = "Anomaly Support <[email protected]>"message = "Anomaly Reception <[email protected]>"# If a Reply-To is explicitly provided then the email client will# use this address when the user hit the reply button message = "Anomaly Support <[email protected]>"
Conținut HTML și corp text simplu
Vom crea un mesaj alternative
care are două atașamente, primul conținând versiunea text simplu a mesajului de e-mail urmată de versiunea HTML.
Conținutul HTML și conținutul text ar fi produs, de obicei, cu ajutorul unui motor de modelare. În scopul acestei postări, presupun că ați generat deja conținutul și că acesta este disponibil ca o variabilă Python str
.
Mesajul alternative
este creat prin instanțierea unui obiect MIMEMultipart
, de data aceasta cerând constructorului să utilizeze subtipul alternative
.
textual_message = MIMEMultipart('alternative')
Utilizați ajutorul MIMEText
pentru a crea atașamentele text simplu și HTML.
from email.mime.text import MIMEText# I assume that you have a variable called txt_content# with the textual rendition of the message, this could# have been generated via a templating engineplaintext_part = MIMEText(txt_content, 'plain')textual_message.attach(plaintext_part)# likewise a variable called html_content with the HTMLhtml_part = MIMEText(html_content, 'html')textual_message.attach(html_part)
Ajustați mesajul alternative
la mesajul părinte mixed
pentru a crea corpul textual al mesajului de e-mail.
# Attach this to the mixed type messagemessage.attach(textual_message)
Alegare descărcabilă
Filele textuale sau binare pot fi atașate la mesajul de e-mail prin utilizarea helper-ului MIMEApplication
. Acesta se instanțiază cu conținutul atașamentului urmat de tipul MIME al atașamentului, de exemplu, pentru un application/pdf
îi furnizați porțiunea pdf
.
În mod implicit, conținutul va fi conținut în linie. Pentru a face din acesta un atașament, utilizați metoda add_header
pe instanța MIMEApplication
și declarați că este un atașament. Deoarece conținutul atașamentului face acum parte dintr-un mesaj codificat, trebuie să furnizați în mod explicit meta-informații precum un nume de fișier.
from email.mime.application import MIMEApplicationpdf_file = MIMEApplication(pdf_file_data, "pdf")pdf_file.add_header('Content-Disposition', 'attachment', filename='report.pdf')
Ajutorul MIMEApplication
codifică automat Base64
conținutul atunci când sunt atașate la mesaje:
message.attach(pdf_file)
Imagine opționale pentru utilizare în corpul HTML
Considerați o imagine pe care doriți să o afișați în corpul mesajului electronic, dar pe care nu doriți să o oferiți destinatarului pentru descărcare. Va trebui să folosiți un mesaj related
pentru a înfășura corpul e-mailului conținut în mesajul alternate
pe care l-am creat mai devreme și să atașați mesajul related
la mesajul original mixed
.
Voi avea nevoie, de asemenea, de utilizarea subclasei MIMEImage
pentru a vă asigura că imaginea este codificată corespunzător. În primul rând, creați un mesaj MIMEMultipart
de subtip related
:
related_message = MIMEMultipart('related')
Creați o instanță de MIMEImage
care va conține conținutul imaginii:
from email.MIMEImage import MIMEImage# Content of an image that relates to the HTML messageimage = MIMEImage(image_binary_contents)# Lets you reference the image locally in HTMLimage.add_header('Content-ID', '<image1>')
Adăugarea unui antet Content-ID
vă va permite să faceți referire la imagine în conținutul HTML ca <img src="cid:image1">
. Atașați mesajul alternate
creat inițial la mesajul related
urmat de instanța MIMEImage
:
# Attach the alternative textural message to the # related messagerelated_message.attach(textual_message)# Attach the image to the related messagerelated_message.attach(image)
În cele din urmă atașați mesajul related
la mesajul mixed
:
# Attach the related message to our parent messagemessage.attach(related_message)
Codificarea și trimiterea e-mailului
După ce ați amestecat și combinat diverse tipuri și subtipuri MIME
, mesajul poate fi codificat prin apelarea funcției as_string
. Aceasta, la rândul său, cere fiecărui mesaj și atașament să se redea ca un mesaj coerent. Rezultatul este șirul pe care îl puteți trimite prin SMTP
ca e-mail.
encoded_email = message.as_string()
smtplib
oferă un client SMTP
care poate livra acest mesaj pentru dumneavoastră. Este destul de simplu. În funcție de configurația aplicației și a serverului dumneavoastră, puteți alege să folosiți relee locale sau să transmiteți direct către un server SMTP disponibil. Voi lăsa acest lucru în funcție de nevoile specifice ale aplicațiilor dumneavoastră.
from smtplib import SMTPsmtp = SMTP("localhost", 25)smtp.sendmail(message, message, encoded_email)smtp.quit()
Nota: Directiva Reply-To
nu face parte din încărcătura utilă SMTP; aceasta este tratată ca parte a mesajului MIME
.
.