Jak odesílat e-maily prostřednictvím Gmailu v Pythonu?

Ruční odesílání velkého množství e-mailů je únavný úkol. K hromadnému odesílání e-mailů najednou můžete použít služby třetích stran.

Co takhle vytvořit si vlastní přizpůsobený skript pro odesílání e-mailů?

Není to úžasné?

Ano, je. Chystáme se napsat skript v Pythonu pro odesílání e-mailů.

Python má knihovnu nazvanou smtplib, která se používá k odesílání e-mailů. Knihovna smtplib je založena na protokolu SMTP (Simple Mail Transport Protocol). SMTP se používá k odesílání e-mailů ostatním.

Nastavit Gmail

Zde budeme používat Gmail jako poskytovatele e-mailu. Google nepovoluje přihlášení skriptů. A musíme provést změnu v zabezpečení našeho účtu Gmail, která skriptům umožní přihlašování k našemu účtu Gmail.

Změna možnosti zabezpečení v našem účtu Gmail není dobrá, protože umožňuje ostatním velmi snadno přistupovat k účtu. Doporučuje se vytvořit nový účet Gmail. Přejděte do nastavení tady a zapněte nastavení Povolit méně bezpečné aplikace: ZAPNUTO.

Pokud vám nevyhovuje zapínání výše uvedeného nastavení, můžete se k účtu Gmail přihlásit pomocí rozhraní Google API. Můžete najít skript pro použití rozhraní Google API pro ověřování tady.

Kroky k odeslání pošty

Chcete-li odeslat e-mail pomocí knihovny smtplib, je třeba provést určité kroky. Nejprve se podíváme na kroky a poté napíšeme skript.

#1. Připojování k serveru SMTP

Každý poskytovatel služeb bude mít jiný název domény a port serveru SMTP. Musíme použít název domény serveru SMTP a port poskytovatele e-mailu, který budeme používat ve skriptu. Název domény serveru SMTP a port pro Gmail jsou smtp.gmail.com a 465.

Pro připojení k serveru SMTP budeme používat šifrování SSL, protože je bezpečnější než šifrování TSL. Pokud chcete používat šifrování TSL, použijte port 587 místo 465. Název domény serveru SMTP se bude lišit podle poskytovatele e-mailových služeb.

  Jak vytvořit časovou osu v aplikaci Microsoft PowerPoint

Kód pro připojení k serveru SMTP

server = smtplib.SMTP_SSL(smtp_server_domain_name, port, context=ssl_context)

#2. Přihlásit se

Po navázání spojení se serverem SMTP se můžeme přihlásit pomocí e-mailové adresy a hesla s metodou přihlášení SMTP objektu. Kód vypadá následovně.

server.login(sender_email, password)

#3. Poslat mail

Po přihlášení nemůžeme čekat s odesláním pošty. Odešlete e-mail pomocí metody sendmail. Ujistěte se, že posíláte e-mail v následujícím formátu.

Předmět: your_subject_for newline mail_content

Prostory nejsou nutné. Jsou pouze pro upřesnění ve výše uvedeném formátu. Podívejme se na ukázkový kód.

server.sendmail(sender_mail, email, f"Subject: {subject}n{content}")

#4. Přestat

Nezapomeňte ukončit SMTP c

Viděli jsme kroky k odesílání pošty pomocí Pythonu. Ale neprobírali jsme úplný kód. Pojďme rychle projít kód.

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)

Vytvořili jsme třídu s názvem Mail. A má metodu nazvanou send pro odesílání e-mailů. Psaní třídy nebo prostě ne, je na vás. Třída to dělá čitelnějším. Všechny výše popsané kroky jsme jeden po druhém implementovali do metody send.

Hurá! odeslali jste e-mail pomocí skriptu Python.

Obsah HTML

Co když chcete poslat poštu v HTML? Je to možné?

  Jak „Unified Memory“ zrychluje Apple M1 ARM Mac

Jo, proč ne. Poštu můžeme odeslat pomocí HTML knihovny s názvem email.mime. Je to vestavěná knihovna.

The MIM je standard používaný k rozšíření formátu e-mailů o podporu aplikačních programů, videa, obrázků atd.,

Z modulu email.mime potřebujeme dvě třídy. Jsou to MIMEText a MIMEMultipart. Podívejme se na jejich stručné vysvětlení.

#1. MIMEText

Třída MIMEText se používá k psaní obsahu naší pošty v HTML. Instanci třídy MIMEText vytvoříme předáním obsahu HTML a typu obsahu. Viz ukázkový kód níže.

html_content = MIMEText(html_template, 'html')

Některé poštovní služby nepodporují vykreslování HTML. Je tedy lepší vytvořit dvě instance třídy MIMEText pro prostý text a HTML.

#2. MIMEMvícedílný

Třída MIMEMultipart se používá ke zjednodušení formátování a psaní předmětu, od adresy k adrese atd. Obsah vytvořený třídou MIMEText dáme MIMEMultipart pomocí metody attachment.

Musíme se ujistit, že instance MIMEMultipart je vytvořena s argumentem alternativou k vykreslení prostého textu nebo HTML. Odešleme e-mail s obsahem HTML.

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'] = 'etechblog.cz Celebrations'
            mail['From'] = self.sender_mail
            mail['To'] = email

            text_template = """
            etechblog.cz

            Hi {0},
            We are delighted announce that our website hits 10 Million views this month.
            """
            html_template = """
            <h1>etechblog.cz</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)

Můžete také přidat skrytou kopii pomocí tohoto atributu Skrytá kopie v instanci MIMEMultipart.

Přidávání příloh

Přílohy mohou být obrázky, pdf, dokumenty, listy atd. Ve třídě email.mime se nazývá MIMEBase. Slouží k přidávání příloh do pošty.

  Jak spustit Skyrim na Linuxu s vínem

K výše uvedenému mailu přidáme přílohu.

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 = "etechblog.cz-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)

Mail to Hromadné maily najednou

Použili jsme smyčku k odeslání stejné pošty více členům. To je jeden případ (když nechcete, aby přijímače věděly o jiných přijímačích).

Předpokládejme, že musíte poslat stejnou poštu 1000 členům stejné skupiny najednou. V takových případech nebude použití smyčky vhodné. V obecném psaní pošty můžeme do pole Komu přidat více e-mailů. Jak to udělat ve skriptu Python?

Musíme zkombinovat seznam e-mailů jako řetězec oddělený čárkou a mezerou. Ke spojení všech e-mailů jako řetězce můžeme použít řetězec metody spojení. Podívejte se na kód pro spojení e-mailů jako řetězce.

", ".join(emails)

Nahraďte pole Komu ve výše uvedeném skriptu pomocí výše uvedeného řetězce. To je vše, odeslali jste poštu na hromadné maily najednou.

Závěr

Existuje několik knihoven třetích stran pro odesílání e-mailů v Pythonu. Někteří z nich jsou Obálky, Yagmail, Opevnění, atd.., Tyto knihovny nám pomáhají psát skripty s několika řádky kódu. Můžete je také prozkoumat.

Nyní můžete své e-maily automatizovat pomocí skriptů Python. Struktura odesílání e-mailů se bude lišit podle vašeho případu použití. Viděli jsme různé scénáře odesílání e-mailů. Skripty popsané v tutoriálu můžete snadno přizpůsobit svému případu použití. Z toho jsem vzal odkaz článek.

Veselé kódování 🙂