Hvordan sende e-poster via Gmail i Python?

Å sende en mengde e-poster manuelt er en kjedelig oppgave. Du kan bruke tredjepartstjenester til å sende e-postene i bulk om gangen.

Hva med å lage ditt eget tilpassede skript for å sende e-poster?

Er det ikke fantastisk?

Ja det er. Vi skal skrive et skript i Python for å sende e-poster.

Python har et bibliotek kalt smtplib som brukes til å sende e-post. Biblioteket smtplib er basert på SMTP (Simple Mail Transport Protocol). SMTP brukes til å sende e-post til andre.

Konfigurer Gmail

Her skal vi bruke Gmail som e-postleverandør. Google tillater ikke skript å logge på. Og vi må gjøre en endring i sikkerheten til Gmail-kontoen vår som lar skript logge på Gmail-kontoen vår.

Å endre sikkerhetsalternativet i Gmail-kontoen vår er ikke bra, da det lar andre få tilgang til kontoen veldig enkelt. Det anbefales å opprette en ny Gmail-konto. Gå til innstillingene her og slå på Tillat mindre sikre apper: PÅ-innstillingen.

Hvis du ikke er komfortabel med å slå på innstillingen ovenfor, kan du bruke Google API for å logge på Gmail-kontoen din. Du kan finne skriptet for å bruke Googles API-er for autentisering her.

Fremgangsmåte for å sende e-post

Visse trinn må gjøres for å sende en e-post ved hjelp av smtplib-biblioteket. La oss først se fremgangsmåten, og så skriver vi manuset.

#1. Kobler til SMTP-serveren

Hver tjenesteleverandør vil ha forskjellige SMTP-serverdomenenavn og porter. Vi må bruke SMTP-serverens domenenavn og porten til e-postleverandøren som vi skal bruke i skriptet. SMTP-serverens domenenavn og port for Gmail er smtp.gmail.com og 465.

Vi vil bruke SSL-kryptering for SMTP-servertilkoblingen da den er sikrere enn TSL-krypteringen. Hvis du vil bruke TSL-krypteringen, bruk port 587 i stedet for 465. SMTP-serverens domenenavn vil være forskjellig basert på e-posttjenesteleverandøren.

  Hvordan lage et nettstedskontaktskjema med Google Forms

Koden for å koble til SMTP-serveren

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

#2. Logg Inn

Når tilkoblingen er opprettet til SMTP-serveren, kan vi logge inn med e-postadressen og passordet med innloggings-SMTP-objektets metode. Koden ser ut som følger.

server.login(sender_email, password)

#3. Send e-post

Etter pålogging kan vi ikke vente med å sende e-posten. Send e-posten ved å bruke sendmail-metoden. Pass på at du sender e-posten i følgende format.

Emne: your_subject_for newline mail_content

Mellomrom er ikke nødvendig. De er bare for avklaring i formatet ovenfor. La oss se eksempelkoden.

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

#4. Slutte

Ikke glem å avslutte SMTP c

Vi har sett fremgangsmåten for å sende e-post ved hjelp av Python. Men vi har ikke diskutert hele koden. La oss raskt gå gjennom 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 som heter Mail. Og den har en metode som heter send for å sende e-postene. Skrivekurs eller bare ikke er opp til deg. Klassen gjør den mer lesbar. Vi har implementert alle trinnene diskutert ovenfor én etter én i sendemetoden.

Hurra! du har sendt en e-post med Python-skript.

HTML-innhold

Hva om du vil sende e-posten i HTML? Er det mulig?

Ja, hvorfor ikke. Vi kan sende e-posten ved å bruke HTML, biblioteket kalt email.mime. Det er et innebygd bibliotek.

  Slik løser du problemer med zoom-ekko under en samtale

De MIME er en standard som brukes til å utvide formatet på e-poster til å støtte applikasjonsprogrammer, video, bilder osv.,

Det er to klasser vi trenger fra email.mime-modulen. De er MIMEText og MIMEMultipart. La oss se en kort forklaring om dem.

#1. MIMETekst

MIMEText-klassen brukes til å skrive e-postinnholdet vårt i HTML. Vi vil lage en forekomst av klassen MIMEText ved å sende HTML-innhold og innholdstypen. Se eksempelkoden nedenfor.

html_content = MIMEText(html_template, 'html')

Noen e-posttjenester støtter ikke HTML-gjengivelse. Så det er bedre å lage to forekomster av klassen MIMEText for ren tekst og HTML.

#2. MIMEMultipart

MIMEMultipart-klassen brukes til å forenkle formaterings- og skriveemnet, fra adresse, til adresse osv. Vi vil gi innholdet som er opprettet med MIMEText-klassen til MIMEMultipart ved å bruke attach-metoden.

Vi må sørge for at forekomsten av MIMEMultipart er opprettet med argumentet alternativet for å gjengi ren tekst eller HTML. La oss sende 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 blind karbonkopi ved å bruke det attributtet Bcc i MIMEMultipart-forekomsten.

Legger til vedlegg

Vedlegg kan være bilder, pdf-er, dokumenter, ark osv. Det kalles MIMEBase i email.mime-klassen. Den brukes til å legge til vedlegg i e-posten.

  13 beste videointervjuplattformer i 2022 for raskere ansettelser

La oss legge til et vedlegg til e-posten ovenfor.

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)

E-post til masseposter på en gang

Vi har brukt en loop for å sende samme e-post til flere medlemmer. Det er ett tilfelle (når du ikke vil at mottakerne skal vite om andre mottakere).

Anta at du må sende samme e-post til 1000 medlemmer samtidig fra samme gruppe. I slike tilfeller vil det ikke være hensiktsmessig å bruke en løkke. Vi kan legge til flere e-poster i Til-feltet i generell postskriving. Hvordan gjør jeg det i Python-skriptet?

Vi må kombinere listen over e-poster som en streng atskilt med komma og mellomrom. Vi kan bruke sammenføyningsmetodestrengen for å kombinere alle e-poster som en streng. Se koden for å kombinere e-poster som en streng.

", ".join(emails)

Erstatt Til-feltet i skriptet ovenfor ved å bruke strengen ovenfor. Det er det, du har sendt e-posten til masseposter på en gang.

Konklusjon

Det er noen tredjepartsbiblioteker for å sende e-poster i Python. Noen av dem er det Konvolutter, Yagmail, Flanker, etc.., Disse bibliotekene hjelper oss å skrive skript med få linjer med kode. Du kan også utforske dem.

Nå kan du automatisere e-postsakene dine ved å bruke Python-skript. Strukturen for å sende e-poster vil være forskjellig basert på din brukssituasjon. Vi har sett forskjellige scenarier for å sende e-post. Du kan enkelt tilpasse skriptene som er omtalt i opplæringen til ditt bruksområde. Jeg har hentet referansen fra dette artikkel.

Lykke til med koding 🙂