Hvordan sender man e-mails via Gmail i Python?

At sende en masse e-mails manuelt er en kedelig opgave. Du kan bruge tredjepartstjenester til at sende e-mails i bulk ad gangen.

Hvad med at oprette dit eget tilpassede script til at sende e-mails?

Er det ikke vidunderligt?

Ja det er. Vi skal skrive et script i Python til at sende e-mails.

Python har et bibliotek kaldet smtplib, som bruges til at sende e-mails. Biblioteket smtplib er baseret på SMTP (Simple Mail Transport Protocol). SMTP bruges til at sende e-mails til andre.

Konfigurer Gmail

Her skal vi bruge Gmail som e-mail-udbyder. Google tillader ikke, at scripts logger ind. Og vi er nødt til at foretage en ændring af sikkerheden på vores Gmail-konto, der tillader scripts at logge ind på vores Gmail-konto.

At ændre sikkerhedsindstillingen i vores Gmail-konto er ikke godt, da det giver andre mulighed for at få adgang til kontoen meget nemt. Det anbefales at oprette en ny Gmail-konto. Gå til indstillingerne her og slå indstillingen Tillad mindre sikre apps: TIL.

Hvis du ikke er tryg ved at slå ovenstående indstilling til, kan du bruge Google API til at logge ind på din Gmail-konto. Du kan finde scriptet til at bruge Google API’er til godkendelse her.

Trin til at sende mail

Visse trin skal udføres for at sende en mail ved hjælp af smtplib-biblioteket. Lad os først se trinene, og så skriver vi scriptet.

#1. Opretter forbindelse til SMTP-serveren

Hver tjenesteudbyder vil have et forskelligt SMTP-serverdomænenavn og -port. Vi skal bruge SMTP-serverens domænenavn og e-mail-udbyderens port, som vi skal bruge i scriptet. SMTP-serverens domænenavn og port for Gmail er smtp.gmail.com og 465.

Vi vil bruge SSL-kryptering til SMTP-serverforbindelsen, da den er mere sikker end TSL-krypteringen. Hvis du vil bruge TSL-krypteringen, skal du bruge port 587 i stedet for 465. SMTP-serverens domænenavn vil være forskelligt baseret på e-mail-tjenesteudbyderen.

  Sådan sletter du en fil, der er åben i et andet program

Koden til at oprette forbindelse til SMTP-serveren

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

#2. Log på

Når forbindelsen er etableret til SMTP-serveren, kan vi logge ind med e-mail-adressen og adgangskoden med login-SMTP-objektets metode. Koden ser ud som følger.

server.login(sender_email, password)

#3. Send mail

Efter login kan vi ikke vente med at sende mailen. Send mailen ved hjælp af sendmail metoden. Sørg for at sende mailen i følgende format.

Emne: your_subject_for newline mail_content

Mellemrum er ikke nødvendige. De er kun til afklaring i ovenstående format. Lad os se prøvekoden.

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

#4. Afslut

Glem ikke at afslutte SMTP c

Vi har set trinene til at sende mail ved hjælp af Python. Men vi har ikke diskuteret den komplette kode. Lad os hurtigt gennemgå 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 lavet en klasse kaldet Mail. Og det har en metode kaldet send til at sende mails. Skrivetimer eller bare ej er op til dig. Klassen gør den mere læsbar. Vi har implementeret alle de trin, der er diskuteret ovenfor, én efter én i sendemetoden.

Hurra! du har sendt en mail med Python-script.

HTML indhold

Hvad hvis du vil sende mailen i HTML? Er det muligt?

Ja hvorfor ikke. Vi kan sende mailen ved hjælp af HTML biblioteket kaldet email.mime. Det er et indbygget bibliotek.

  Sådan starter du genveje ved at trykke på bagsiden af ​​din iPhone

Det MIME er en standard, der bruges til at udvide formatet af e-mails til at understøtte applikationsprogrammer, video, billeder osv..,

Der er to klasser, vi skal bruge fra email.mime-modulet. De er MIMEText og MIMEMultipart. Lad os se en kort forklaring om dem.

#1. MIMETekst

MIMEText-klassen bruges til at skrive vores mailindhold i HTML. Vi vil oprette en forekomst af klassen MIMEText ved at videregive HTML-indhold og typen af ​​indhold. Se eksempelkoden nedenfor.

html_content = MIMEText(html_template, 'html')

Nogle mailtjenester understøtter ikke HTML-gengivelse. Så det er bedre at oprette to forekomster af klassen MIMEText til almindelig tekst og HTML.

#2. MIMEMultipart

MIMEMultipart-klassen bruges til at forenkle formateringen og skriveemnet, fra adresse, til adresse osv. Vi vil give indholdet, der er oprettet med MIMEText-klassen, til MIMEMultipart ved hjælp af attach-metoden.

Vi skal sikre os, at forekomsten af ​​MIMEMultipart er oprettet med argumentet alternativ til at gengive almindelig tekst eller HTML. Lad os sende en mail med HTML-indhold.

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

            text_template = """
            toadmin.dk

            Hi {0},
            We are delighted announce that our website hits 10 Million views this month.
            """
            html_template = """
            <h1>toadmin.dk</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å tilføje blind karbonkopi ved at bruge denne attribut Bcc i MIMEMultipart-forekomsten.

Tilføjelse af vedhæftede filer

Vedhæftede filer kan være billeder, pdf’er, docs, sheets osv. Der kaldes MIMEBase i email.mime-klassen. Det bruges til at tilføje vedhæftede filer til mailen.

  Slip af med Australis og gendan det klassiske tema på Firefox 29

Lad os tilføje en vedhæftet fil til ovenstående mail.

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 = "toadmin.dk-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 til massemails på én gang

Vi har brugt en loop til at sende den samme mail til flere medlemmer. Det er et tilfælde (når du ikke ønsker, at modtagerne skal vide om andre modtagere).

Antag, at du skal sende den samme mail til 1000 medlemmer på én gang fra den samme gruppe. I sådanne tilfælde vil det ikke være hensigtsmæssigt at bruge en løkke. Vi kan tilføje flere e-mails i Til-feltet i generel mailskrivning. Hvordan gør man det i Python script?

Vi skal kombinere listen over e-mails som en streng adskilt med et komma og mellemrum. Vi kan bruge join-metodestrengen til at kombinere alle e-mails som en streng. Se koden for at kombinere e-mails som en streng.

", ".join(emails)

Erstat feltet Til i ovenstående script ved hjælp af strengen ovenfor. Det er det, du har sendt posten til massemails på én gang.

Konklusion

Der er nogle tredjepartsbiblioteker til at sende e-mails i Python. Nogle af dem er Konvolutter, Yagmail, Flanker, osv.., Disse biblioteker hjælper os med at skrive scripts med få linjer kode. Du kan også udforske dem.

Nu kan du automatisere dine e-mail-ting ved hjælp af Python-scripts. Strukturen for at sende e-mails vil være forskellig baseret på din brugssag. Vi har set forskellige scenarier for at sende e-mails. Du kan nemt tilpasse de scripts, der er diskuteret i selvstudiet, til din use case. Jeg har taget referencen fra dette artikel.

God kodning 🙂