15 Aug 2016, 14 perces cikk Dev Mukherjee

A legtöbb internetes szolgáltatásnak e-maileket kell küldenie a felhasználóinak. Az üzenet szerkesztése külön feladat az email küldésétől. Ez a bejegyzés a Multipurpose Internet Mail Extensions (MIME) üzenetek megfelelő felépítését mutatja be Pythonban.

A MIME üzeneteknek számos altípusa van a különböző típusú tartalmak kapszulázására. A Python e-mail MIME könyvtára csomagolást biztosít a velük való munkához. A következő altípusokat fogjuk megvizsgálni, hogy bemutassuk, hogyan lehet az üzeneteket megfelelően csomagolni:

  • mixed különböző típusú tartalmak soron belüli vagy csatolmányként történő küldésére
  • alternative ugyanazon tartalom alternatív változatainak küldésére, pl. egy e-mail test egyszerű szöveges és HTML változatainak csoportosítására
  • related kapcsolódó erőforrások soron belüli vagy csatolmányként történő csatolására, pl. a HTML-tartalomban használt képek

Az ebben a bejegyzésben létrehozott e-mail üzenet tartalmazni fogja:

  • A levéltest tartalmának HTML és egyszerű szöveges változatait
  • Egy csatolt fájlt (amely ebben az esetben egy generált ICS fájl)
  • Előlegesen egy képet is tartalmazhat a HTML tartalomban

Kezdjük egy mixed MIME multipart üzenet létrehozásával, amely az üzenetünk különböző összetevőit (e-mail test, inline megjelenített képek és letölthető mellékletek) tartalmazza:

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]>"

HTML és sima szöveges testtartalom

Elkészítünk egy alternative üzenetet, amely két mellékletet tartalmaz, az első az e-mail üzenet sima szöveges változatát, amelyet a HTML változat követ.

A HTML és a szöveges tartalmat jellemzően egy templating motor segítségével állítanánk elő. E bejegyzéshez feltételezem, hogy a tartalmat már létrehozta, és az egy Python str változóként áll rendelkezésre.

A alternative üzenetet egy MIMEMultipart objektum példányosításával hozza létre, ezúttal arra kérve a konstruktort, hogy a alternative altípust használja.

textual_message = MIMEMultipart('alternative')

A MIMEText segédprogramot használja a sima szöveges és HTML csatolmányok létrehozásához.

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)

A alternative üzenetet a mixed szülőüzenethez csatolja az e-mail üzenet szöveges testének létrehozásához.

# Attach this to the mixed type messagemessage.attach(textual_message)

Letölthető melléklet

A MIMEApplication súgó használatával szöveges vagy bináris fájlok csatolhatók az e-mailhez. Ezt a csatolmány tartalmával instantiáljuk, amelyet a csatolmány MIME típusa követ, azaz egy application/pdf esetében megadjuk neki a pdf részt.

Előre a tartalmat inline tartalmazná. Ahhoz, hogy csatolmány legyen, használjuk a add_header metódust a MIMEApplication példányon, és nyilvánítsuk csatolmánynak. Mivel a csatolmány tartalma most már egy kódolt üzenet része, kifejezetten meg kell adnia a metainformációkat, például a fájlnevet.

from email.mime.application import MIMEApplicationpdf_file = MIMEApplication(pdf_file_data, "pdf")pdf_file.add_header('Content-Disposition', 'attachment', filename='report.pdf')

A MIMEApplication segédprogram automatikusan Base64 kódolja a tartalmat, amikor üzenetekhez csatolja:

message.attach(pdf_file)

Előleges kép a HTML testben való használathoz

Gondoljon egy olyan képre, amelyet az e-mail testében szeretne megjeleníteni, de nem szeretné a címzettnek letöltésre felajánlani. Egy related üzenetet kell használnia a korábban létrehozott alternate üzenetben található e-mail testbe csomagolnia, és a related üzenetet az eredeti mixed üzenethez csatolnia.

A kép megfelelő kódolásának biztosításához a MIMEImage alosztály használatára is szüksége lesz. Először is hozzon létre egy MIMEMultipart üzenetet a related altípusból:

related_message = MIMEMultipart('related')

Hozzon létre egy MIMEImage példányt, amely a kép tartalmát tartalmazza:

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>')

Egy Content-ID fejléc hozzáadásával a HTML tartalomban <img src="cid:image1">ként hivatkozhat a képre. Csatolja az eredetileg létrehozott alternate üzenetet a related üzenethez, majd a MIMEImage példányt:

# Attach the alternative textural message to the # related messagerelated_message.attach(textual_message)# Attach the image to the related messagerelated_message.attach(image)

Végül csatolja a related üzenetet a mixed üzenethez:

# Attach the related message to our parent messagemessage.attach(related_message)

Az e-mail kódolása és elküldése

Mihelyt a különböző MIME típusokat és altípusokat összekeverted, az üzenetet a as_string függvény meghívásával kódolhatod. Ez viszont minden alüzenetet és mellékletet arra kér, hogy egyetlen összefüggő üzenetként renderelje magát. Az eredmény az a karakterlánc, amelyet a SMTP-on keresztül elküldhetsz e-mailként.

encoded_email = message.as_string()

smtplib egy SMTP klienst biztosít, amely ezt az üzenetet el tudja küldeni neked. Ez elég egyszerű. Az alkalmazástól és a kiszolgáló beállításától függően helyi reléket használhat, vagy közvetlenül egy elérhető SMTP-kiszolgálóra továbbíthatja. Ezt az alkalmazások sajátos igényeire bízom.

from smtplib import SMTPsmtp = SMTP("localhost", 25)smtp.sendmail(message, message, encoded_email)smtp.quit()

Figyelem: A Reply-To direktíva nem része az SMTP hasznos terhelésének; azt a MIME üzenet részeként kezeli.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.