Automatizacija slanja e-pošte pomoću Python-a
Ručno slanje velikog broja e-poruka može biti zamoran posao. Postoje razne usluge trećih strana koje omogućavaju slanje grupnih e-poruka, ali šta ako biste mogli kreirati sopstveni, prilagođeni skript za slanje e-pošte? Zvuči primamljivo, zar ne? Upravo to ćemo i uraditi. Napisaćemo Python skriptu za slanje e-poruka.
Python nudi biblioteku pod nazivom smtplib
koja se koristi za slanje e-pošte. Ova biblioteka je zasnovana na SMTP protokolu (Simple Mail Transfer Protocol), koji je standard za slanje e-pošte preko interneta.
Konfigurisanje Gmail naloga
Za demonstraciju, koristićemo Gmail kao pružaoca usluge e-pošte. Međutim, Google ne dozvoljava skriptama direktno prijavljivanje na nalog. Stoga, moraćemo da izmenimo bezbednosne postavke Gmail naloga kako bismo omogućili skriptama da se prijave. Ipak, menjanje bezbednosnih postavki nije idealno rešenje jer može učiniti vaš nalog ranjivijim. Preporučuje se da kreirate novi Gmail nalog koji ćete koristiti isključivo za ovu svrhu. Na ovom linku možete pronaći opciju za uključivanje pristupa za „manje bezbedne aplikacije“.
Ako vam je to neugodno, možete koristiti Google API za prijavljivanje na svoj Gmail nalog. Skriptu za autentifikaciju pomoću Google API-ja možete pronaći ovde.
Koraci za slanje e-pošte
Da bismo uspešno poslali e-poštu pomoću smtplib
biblioteke, potrebno je pratiti određene korake. Prvo ćemo ih navesti, a zatim ćemo napisati skriptu:
#1. Povezivanje sa SMTP serverom
Svaki provajder e-pošte ima svoje jedinstveno ime domena i port SMTP servera. U našoj skripti moramo koristiti odgovarajuće podatke provajdera kojeg koristimo. Za Gmail, to su smtp.gmail.com
(ime domena) i 465 (port).
Koristićemo SSL enkripciju za vezu sa SMTP serverom jer je sigurnija od TSL enkripcije. Za TSL enkripciju, treba koristiti port 587 umesto 465. Ime domena SMTP servera zavisi od pružaoca usluge e-pošte.
Kod za povezivanje sa SMTP serverom:
server = smtplib.SMTP_SSL(smtp_server_domain_name, port, context=ssl_context)
#2. Prijavljivanje na nalog
Nakon što uspostavimo vezu sa SMTP serverom, možemo se prijaviti pomoću adrese e-pošte i lozinke koristeći login
metod objekta SMTP:
server.login(sender_email, password)
#3. Slanje e-pošte
Kada se prijavimo, možemo slati e-poštu koristeći sendmail
metod. Važno je formatirati e-poštu na sledeći način:
Naslov: vaš_naslov_za_novi_red_sadržaj_e-pošte
Razmaci u formatu su samo radi čitljivosti. Primer koda:
server.sendmail(sender_mail, email, f"Subject: {subject}n{content}")
#4. Zatvaranje veze
Ne zaboravite da zatvorite vezu sa SMTP serverom kada završite sa slanjem e-pošte.
Sada kada smo prešli korake, pogledajmo kompletan kod:
import smtplib, ssl class Mail: def __init__(self): self.port = 465 self.smtp_server_domain_name = "smtp.gmail.com" self.sender_mail = "GMAIL_ADRESA" self.password = "SIGURNA_LOZINKA" 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("Unesite email adrese (razdvojene razmakom): ").split() subject = input("Unesite naslov: ") content = input("Unesite sadržaj: ") mail = Mail() mail.send(mails, subject, content)
Kreirali smo klasu Mail
sa metodom send
za slanje e-pošte. Korišćenje klase čini kod čitljivijim, ali nije obavezno. U metodu send
implementirali smo sve gore navedene korake.
Čestitamo! Upravo ste poslali e-poštu koristeći Python skriptu.
Slanje HTML sadržaja
Šta ako želite slati e-poštu sa HTML sadržajem? Da, i to je moguće. Možemo koristiti biblioteku email.mime
, koja je ugrađena biblioteka.
MIME je standard koji proširuje format e-pošte za podršku različitim tipovima sadržaja, poput aplikacija, video snimaka, slika itd.
Iz modula email.mime
, potrebne su nam dve klase: MIMEText
i MIMEMultipart
. Pogledajmo ih detaljnije:
#1. MIMEText
Klasa MIMEText
se koristi za pisanje sadržaja e-pošte u HTML formatu. Kreiramo instancu klase MIMEText
prosljeđivanjem HTML sadržaja i tipa sadržaja. Primer:
html_content = MIMEText(html_template, 'html')
Neki e-mail servisi ne podržavaju prikaz HTML-a, stoga je bolje kreirati dve instance klase MIMEText
, jednu za običan tekst, a drugu za HTML.
#2. MIMEMultipart
Klasa MIMEMultipart
olakšava formatiranje i pisanje naslova, „od“ i „do“ adresa itd. Sadržaj kreiran klasom MIMEText
dodajemo MIMEMultipart
objektu koristeći metod attach
.
Važno je osigurati da je instanca MIMEMultipart
kreirana sa argumentom „alternative“ kako bi se omogućio prikaz običnog teksta ili HTML-a. Sada ćemo poslati e-mail sa HTML sadržajem.
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'] = 'techblog.co.rs Proslava' mail['From'] = self.sender_mail mail['To'] = email text_template = """ techblog.co.rs Zdravo {0}, Sa zadovoljstvom objavljujemo da je naša web stranica ostvarila 10 miliona pregleda ovog meseca. """ html_template = """ <h1>techblog.co.rs</h1> <p>Zdravo {0},</p> <p>Sa zadovoljstvom objavljujemo da je naša web stranica ostvarila <b>10 miliona</b> pregleda prošlog meseca.</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("Unesite email adrese (razdvojene razmakom): ").split() mail = Mail() mail.send(mails)
Možete dodati i „bcc“ (skrivenu kopiju) koristeći odgovarajući atribut Bcc
u instanci MIMEMultipart
.
Dodavanje priloga
Prilozi mogu biti slike, PDF-ovi, dokumenti, tabele itd. U klasi email.mime
, prilozi se nazivaju MIMEBase
. Hajde da dodamo prilog u prethodni kod:
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): ## prijavljivanje... for email in emails: ## MIMEMultipart instanca ## tekst i html template ## MIMEText instance ## dodavanje poruka u MIMEMultipart ## dodavanje priloga file_path = "techblog.co.rs-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) ## slanje e-pošte service.quit() if __name__ == '__main__': mails = input("Unesite email adrese (razdvojene razmakom): ").split() mail = Mail() mail.send(mails)
Slanje masovnih e-poruka odjednom
Do sada smo koristili petlju da bismo poslali istu e-poštu većem broju ljudi. Ovo je korisno kada ne želite da primaoci znaju za druge primaoce.
Međutim, ako treba da pošaljete istu e-poštu velikom broju ljudi iz iste grupe, upotreba petlje nije najbolji pristup. U tom slučaju možemo dodati više e-mail adresa u polje „Za“ pri sastavljanju e-pošte. Kako to uraditi pomoću Python skripte?
Potrebno je da kombinujemo listu e-mail adresa u string, odvojen zarezom i razmakom. Možemo koristiti string metodu join
za spajanje svih e-mail adresa. Primer koda:
", ".join(emails)
Zamenite polje „Za“ u gornjoj skripti koristeći ovaj string i poslali ste masovnu e-poštu odjednom.
Zaključak
Postoje razne biblioteke trećih strana za slanje e-pošte u Pythonu, kao što su Envelopes, Yagmail, Flanker, itd. Ove biblioteke nam olakšavaju pisanje skripti za slanje e-pošte uz manje linija koda, i možete ih istražiti.
Sada možete automatizovati svoju e-poštu pomoću Python skripti. Struktura slanja e-pošte zavisi od vašeg specifičnog slučaja upotrebe. U ovom vodiču smo pokrili različite scenarije slanja e-pošte, a skripte možete lako prilagoditi vašim potrebama. Dodatne informacije možete pronaći u ovom članku.
Srećno kodiranje! 🙂