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.

Vastaa

Sähköpostiosoitettasi ei julkaista.