Како слати е-пошту преко Гмаил-а у Питхон-у?

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! 🙂