15.8.2016, 14-minuuttinen juttu, jonka on kirjoittanut Dev Mukherjee
Useimpien Internet-palveluiden on lähetettävä sähköposteja käyttäjilleen. Viestin rakentaminen on erillinen tehtävä sähköpostin lähettämisestä. Tämä viesti esittelee Multipurpose Internet Mail Extensions (MIME) -viestien oikeaa rakentamista Pythonissa.
MIME-viesteissä on monia alatyyppejä, joilla voidaan kapseloida erilaista sisältöä. Pythonin sähköpostin MIME-kirjasto tarjoaa kääreitä niiden kanssa työskentelyyn. Tutustumme seuraaviin alatyyppeihin osoittaaksemme, miten viestit paketoidaan oikein:
-
mixed
käytetään erityyppisen sisällön lähettämiseen rivissä tai liitetiedostoina -
alternative
käytetään saman sisällön vaihtoehtoisten versioiden lähettämiseen esim. sähköpostin tekstirungon pelkän tekstin ja HTML-versioiden ryhmittelyyn -
related
käytetään toisiinsa liittyvien resurssien sisällyttämiseen rivissä tai liitetiedostoina esim. HTML-sisällössä käytettäviä kuvia
Sähköpostiviesti, jonka luomme tässä viestissä, sisältää:
- HTML- ja tavallisen tekstin versiot rungon sisällöstä
- Liitteenä oleva tiedosto (joka tässä tapauksessa on luotu
ICS
-tiedosto) - Vaihtoehtoisesti kuva HTML-sisällössä
Luotaan aluksi mixed
MIME-moniosaisen viestin luomisesta, joka pitää sisällään viestimme eri komponentit (sähköpostin rungon, rivissä näkyvät kuvat ja ladattavat liitteet):
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- ja tavallisen tekstirungon sisältö
Luomme alternative
-viestin, jossa on kaksi liitetiedostoa, joista ensimmäinen sisältää sähköpostiviestin tavallisen tekstiversion ja sen jälkeen HTML-version.
HTML- ja tekstisisältö tuotettaisiin tyypillisesti templating-moottorin avulla. Tässä postauksessa oletan, että olet jo tuottanut sisällön ja se on saatavilla Pythonin str
-muuttujana.
alternative
-sanoma luodaan instantioimalla MIMEMultipart
-olio, tällä kertaa pyydetään konstruktoria käyttämään alternative
-alatyyppiä.
textual_message = MIMEMultipart('alternative')
Käytä MIMEText
-apuria luodaksesi pelkän tekstin ja HTML- liitetiedoston.
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)
Liitä alternative
-viesti vanhemman mixed
-viestin yhteyteen luodaksesi sähköpostiviestin tekstimuotoisen rungon.
# Attach this to the mixed type messagemessage.attach(textual_message)
Latattavissa oleva liitetiedosto
Sähköpostiviestiin voi liittää teksti- tai binääritiedostoja MIMEApplication
-apurilla. Se instantioidaan liitetiedoston sisällöllä, jota seuraa liitetiedoston MIME-tyyppi eli jos kyseessä on application/pdf
, annat sille pdf
-osuuden.
Vakiossa sisältö sisältyisi riviin. Jos haluat tehdä tästä liitetiedoston, käytä add_header
-metodia MIMEApplication
-instanssissa ja ilmoita se liitetiedostoksi. Koska liitetiedoston sisältö on nyt osa koodattua viestiä, sinun on annettava nimenomaisesti metatietoja, kuten tiedostonimi.
from email.mime.application import MIMEApplicationpdf_file = MIMEApplication(pdf_file_data, "pdf")pdf_file.add_header('Content-Disposition', 'attachment', filename='report.pdf')
MIMEApplication
-apuohjelma koodaa automaattisesti Base64
sisällön, kun se liitetään viestiin:
message.attach(pdf_file)
Vaihtoehtoinen kuva käytettäväksi HTML-rungossa
Harkitse kuvaa, jonka haluat näyttää sähköpostiviestin rungossa, mutta jota et halua tarjota vastaanottajalle ladattavaksi. Sinun pitäisi käyttää related
-viestiä käärimään aiemmin luomamme alternate
-viestin sisältämä sähköpostirunko ja liittää related
-viesti alkuperäiseen mixed
-viestiin.
Tarvitset myös MIMEImage
-alaluokan käyttöä varmistaaksesi, että kuva koodataan oikein. Luo ensin MIMEMultipart
-sanoma, jonka alityyppi on related
:
related_message = MIMEMultipart('related')
Luo MIMEImage
:n instanssi, joka sisältää kuvan sisällön:
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>')
Lisäämällä Content-ID
-otsikon voit viitata kuvaan HTML-sisällössä <img src="cid:image1">
. Liitä alun perin luotu alternate
-viesti related
-viestiin ja sen jälkeen MIMEImage
-instanssi:
# Attach the alternative textural message to the # related messagerelated_message.attach(textual_message)# Attach the image to the related messagerelated_message.attach(image)
Lopuksi liitä related
-viesti mixed
-viestiin:
# Attach the related message to our parent messagemessage.attach(related_message)
Sähköpostin koodaaminen ja lähettäminen
Kun olet sekoittanut eri MIME
-tyyppejä ja alatyyppejä, viestisi voidaan koodata kutsumalla as_string
-funktiota. Tämä puolestaan pyytää jokaista alaviestiä ja liitetiedostoa renderöimään itsensä yhdeksi yhtenäiseksi viestiksi. Tuloksena on merkkijono, jonka voit lähettää SMTP
:n kautta sähköpostina.
encoded_email = message.as_string()
smtplib
tarjoaa SMTP
-asiakkaan, joka voi toimittaa tämän viestin puolestasi. Se on melko suoraviivaista. Sovelluksestasi ja palvelinasetuksistasi riippuen voit käyttää paikallisia välittäjiä tai välittää suoraan käytettävissä olevalle SMTP-palvelimelle. Jätän tämän sovelluksesi erityistarpeiden varaan.
from smtplib import SMTPsmtp = SMTP("localhost", 25)smtp.sendmail(message, message, encoded_email)smtp.quit()
Huomaa: Reply-To
-direktiivi ei ole osa SMTP:n hyötykuormaa; se käsitellään osana MIME
-sanomaa.