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.