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 MIMEApplicationcodifică 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.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.