Lag ditt eget e-postskript med Python
Det kan være en tidkrevende oppgave å sende mange e-poster manuelt. Det finnes tredjepartstjenester som kan hjelpe deg med å sende e-post i større mengder, men hva med å lage ditt eget skript for dette?
Er ikke det en spennende tanke? La oss se hvordan vi kan lage et slikt skript med Python.
Python tilbyr et bibliotek kalt smtplib
, som er spesialdesignet for å sende e-post. Dette biblioteket er basert på SMTP (Simple Mail Transport Protocol), som er standardprotokollen for å overføre e-post.
Konfigurering av Gmail
I dette eksemplet skal vi bruke Gmail som vår e-postleverandør. Google tillater imidlertid ikke at skript logger direkte inn. Derfor må vi gjøre en endring i sikkerhetsinnstillingene til Gmail-kontoen vår, slik at skriptet får tilgang.
Det er viktig å være klar over at endring av sikkerhetsinnstillingene i Gmail-kontoen din kan gjøre den mer sårbar. Det kan derfor være lurt å opprette en egen Gmail-konto for dette formålet. Du kan justere sikkerhetsinnstillingen her for å tillate mindre sikre apper.
Hvis du er usikker på å endre denne innstillingen, kan du også bruke Google API for å logge inn på Gmail-kontoen. Du finner en guide for hvordan du bruker Google API for autentisering her.
Steg for å sende e-post
Det er visse trinn du må følge for å sende en e-post ved hjelp av smtplib
-biblioteket. La oss se på disse stegene før vi går videre til selve koden.
#1. Koble til SMTP-serveren
Hver e-postleverandør har sitt eget SMTP-serverdomene og portnummer. Vi trenger å vite disse opplysningene for leverandøren vi bruker i skriptet vårt. For Gmail er SMTP-serverdomenet smtp.gmail.com
og porten er 465
.
Vi bruker SSL-kryptering for SMTP-tilkoblingen, siden dette er tryggere enn TSL-kryptering. Hvis du foretrekker å bruke TSL-kryptering, bruk port 587
i stedet for 465
. SMTP-serverdomenet kan variere avhengig av hvilken e-postleverandør du bruker.
Her er et kodeeksempel for å koble til SMTP-serveren:
server = smtplib.SMTP_SSL(smtp_server_domain_name, port, context=ssl_context)
#2. Logg inn
Etter at tilkoblingen til SMTP-serveren er etablert, kan vi logge inn med e-postadressen og passordet. Dette gjør vi ved hjelp av login
-metoden til SMTP-objektet. Koden for dette ser slik ut:
server.login(sender_email, password)
#3. Send e-post
Når innloggingen er fullført, kan vi endelig sende e-posten. Dette gjøres med sendmail
-metoden. Det er viktig å formatere e-posten på følgende måte:
Emne: your_subject_for newline mail_content
Mellomrom er ikke nødvendig, men de er brukt her for å gjøre formatet lettere å forstå. Her er et kodeeksempel:
server.sendmail(sender_mail, email, f"Subject: {subject}n{content}")
#4. Avslutt
Husk å avslutte SMTP-tilkoblingen når du er ferdig.
Nå har vi sett trinnene for å sende en e-post med Python. La oss se på hele koden:
import smtplib, ssl class Mail: def __init__(self): self.port = 465 self.smtp_server_domain_name = "smtp.gmail.com" self.sender_mail = "GMAIL_ADDRESS" self.password = "SECURE_PASSWORD" def send(self, emails, subject, content): ssl_context = ssl.create_default_context() service = smtplib.SMTP_SSL(self.smtp_server_domain_name, self.port, context=ssl_context) service.login(self.sender_mail, self.password) for email in emails: result = service.sendmail(self.sender_mail, email, f"Subject: {subject}n{content}") service.quit() if __name__ == '__main__': mails = input("Enter emails: ").split() subject = input("Enter subject: ") content = input("Enter content: ") mail = Mail() mail.send(mails, subject, content)
Vi har laget en klasse kalt Mail
med en metode kalt send
som sender e-post. Denne strukturen gjør koden mer lesbar. Alle trinnene vi har diskutert tidligere er implementert i send
-metoden.
Gratulerer! Du har nå sendt en e-post ved hjelp av et Python-skript.
HTML-innhold
Hva om du ønsker å sende e-posten med HTML-innhold? Det er fullt mulig! Vi kan bruke email.mime
-biblioteket, som er en innebygd modul.
MIME er en standard for å utvide formatet på e-poster og støtte applikasjoner, video, bilder og mer.
Vi trenger to klasser fra email.mime
-modulen: MIMEText
og MIMEMultipart
. La oss se nærmere på disse.
#1. MIMEText
MIMEText
-klassen brukes til å skrive e-postinnhold i HTML. Vi oppretter en forekomst av MIMEText
ved å sende HTML-innholdet og innholdstypen. Se kodeeksemplet:
html_content = MIMEText(html_template, 'html')
Noen e-posttjenester støtter ikke HTML-visning. Det kan derfor være lurt å lage to MIMEText
-forekomster, en for ren tekst og en for HTML.
#2. MIMEMultipart
MIMEMultipart
-klassen brukes til å formatere og skrive emne, fra-adresse og til-adresse. Vi gir innholdet fra MIMEText
-klassen til MIMEMultipart
med attach
-metoden.
Vi må sørge for at MIMEMultipart
-forekomsten er opprettet med argumentet alternative
, for å støtte både ren tekst og HTML. Her er et eksempel på hvordan du sender en e-post med HTML-innhold:
import smtplib, ssl from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart class Mail: def __init__(self): ... def send(self, emails): ssl_context = ssl.create_default_context() service = smtplib.SMTP_SSL(self.smtp_server_domain_name, self.port, context=ssl_context) service.login(self.sender_mail, self.password) for email in emails: mail = MIMEMultipart('alternative') mail['Subject'] = 'tipsbilk.net Celebrations' mail['From'] = self.sender_mail mail['To'] = email text_template = """ tipsbilk.net Hi {0}, We are delighted announce that our website hits 10 Million views this month. """ html_template = """ <h1>tipsbilk.net</h1> <p>Hi {0},</p> <p>We are delighted announce that our website hits <b>10 Million</b> views last month.</p> """ html_content = MIMEText(html_template.format(email.split("@")[0]), 'html') text_content = MIMEText(text_template.format(email.split("@")[0]), 'plain') mail.attach(text_content) mail.attach(html_content) service.sendmail(self.sender_mail, email, mail.as_string()) service.quit() if __name__ == '__main__': mails = input("Enter emails: ").split() mail = Mail() mail.send(mails)
Du kan også legge til blindkopi (Bcc) ved å bruke Bcc
-attributtet i MIMEMultipart
-forekomsten.
Legge til vedlegg
Vedlegg kan være bilder, PDF-filer, dokumenter og regneark. For å legge til vedlegg bruker vi MIMEBase
-klassen fra email.mime
.
La oss se hvordan vi kan legge til et vedlegg til e-posten:
import smtplib, ssl from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import encoders from pathlib import Path class Mail: def __init__(self): ... def send(self, emails): ## login... for email in emails: ## MIMEMultipart instance ## text and html templates ## MIMEText instances ## attaching messages to MIMEMultipart ## attaching an attachment file_path = "tipsbilk.net-logo.png" mimeBase = MIMEBase("application", "octet-stream") with open(file_path, "rb") as file: mimeBase.set_payload(file.read()) encoders.encode_base64(mimeBase) mimeBase.add_header("Content-Disposition", f"attachment; filename={Path(file_path).name}") mail.attach(mimeBase) ## sending mail service.quit() if __name__ == '__main__': mails = input("Enter emails: ").split() mail = Mail() mail.send(mails)
Sende e-post til flere mottakere samtidig
Vi har brukt en løkke for å sende samme e-post til flere mottakere. Dette er en fin måte å gjøre det på når du ikke ønsker at mottakerne skal vite om hverandre.
Men hva hvis du skal sende den samme e-posten til 1000 medlemmer samtidig, og det ikke er så viktig om de vet at andre også mottar den? Da er det ikke effektivt å bruke en løkke. I slike tilfeller kan vi legge til flere e-postadresser i «Til»-feltet. Hvordan gjør vi det med et Python-skript?
Vi må kombinere listen over e-poster til en streng, der hver e-post er separert med et komma og et mellomrom. Vi kan bruke join
-metoden for dette. Her er koden:
", ".join(emails)
Bruk denne strengen i stedet for «Til»-feltet i skriptet, og du har sendt e-posten til mange mottakere samtidig.
Konklusjon
Det finnes flere tredjepartsbiblioteker for å sende e-post med Python, som for eksempel Envelopes, Yagmail og Flanker. Disse bibliotekene kan forenkle koden din. Du kan gjerne utforske dem også.
Med dette har du nå muligheten til å automatisere dine e-postrutiner med Python-skript. Strukturen vil variere avhengig av behovene dine, men vi har sett på de viktigste scenarioene. Du kan enkelt tilpasse skriptene vi har diskutert her for ditt eget bruk. Informasjonen i denne artikkelen er delvis basert på denne artikkelen.
Lykke til med kodingen! 🙂