Hur skickar jag e-post via Gmail i Python?

Att skicka en massa e-postmeddelanden manuellt är en tråkig uppgift. Du kan använda tredjepartstjänster för att skicka e-postmeddelanden i bulk åt gången.

Vad sägs om att skapa ditt eget anpassade skript för att skicka e-post?

Är det inte underbart?

Ja det är det. Vi kommer att skriva ett skript i Python för att skicka e-post.

Python har ett bibliotek som heter smtplib som används för att skicka e-post. Biblioteket smtplib är baserat på SMTP (Simple Mail Transport Protocol). SMTP används för att skicka e-post till andra.

Konfigurera Gmail

Här kommer vi att använda Gmail som e-postleverantör. Google tillåter inte att skript loggar in. Och vi måste göra en förändring i säkerheten för vårt Gmail-konto som tillåter skript att logga in på vårt Gmail-konto.

Att ändra säkerhetsalternativet i vårt Gmail-konto är inte bra eftersom det tillåter andra att komma åt kontot mycket enkelt. Vi rekommenderar att du skapar ett nytt Gmail-konto. Gå till inställningarna här och aktivera inställningen Tillåt mindre säkra appar: PÅ.

Om du inte är bekväm med att aktivera ovanstående inställning kan du använda Google API för att logga in på ditt Gmail-konto. Du kan hitta skriptet för att använda Googles API:er för autentisering här.

Steg för att skicka e-post

Vissa steg måste göras för att skicka ett e-postmeddelande med hjälp av smtplib-biblioteket. Låt oss först se stegen och sedan skriver vi manuset.

#1. Ansluter till SMTP-servern

Varje tjänsteleverantör kommer att ha olika SMTP-serverdomännamn och port. Vi måste använda SMTP-serverns domännamn och port för e-postleverantör som vi ska använda i skriptet. SMTP-serverns domännamn och port för Gmail är smtp.gmail.com och 465.

Vi kommer att använda SSL-kryptering för SMTP-serveranslutningen eftersom den är säkrare än TSL-krypteringen. Om du vill använda TSL-krypteringen, använd port 587 istället för 465. SMTP-serverns domännamn kommer att vara olika beroende på e-postleverantören.

Koden för att ansluta till SMTP-servern

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

#2. Logga in

När anslutningen är upprättad till SMTP-servern kan vi logga in med e-postadressen och lösenordet med inloggnings-SMTP-objektets metod. Koden ser ut som följer.

server.login(sender_email, password)

#3. Skicka brev

Efter inloggning kan vi inte vänta med att skicka e-postmeddelandet. Skicka e-postmeddelandet med metoden sendmail. Se till att du skickar e-postmeddelandet i följande format.

Ämne: your_subject_for newline mail_content

Utrymmen är inte nödvändiga. De är bara för förtydligande i ovanstående format. Låt oss se exempelkoden.

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

#4. Sluta med

Glöm inte att avsluta SMTP c

Vi har sett stegen för att skicka e-post med Python. Men vi har inte diskuterat hela koden. Låt oss snabbt gå igenom 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 skapat en klass som heter Mail. Och den har en metod som heter skicka för att skicka e-postmeddelanden. Skrivkurs eller bara inte är upp till dig. Klassen gör den mer läsbar. Vi har implementerat alla steg som diskuterats ovan ett efter ett i skickametoden.

hurra! du har skickat ett mail med Python-skriptet.

HTML-innehåll

Vad händer om du vill skicka posten i HTML? Är det möjligt?

Ja varför inte. Vi kan skicka e-postmeddelandet med HTML, biblioteket som heter email.mime. Det är ett inbyggt bibliotek.

De MIMA är en standard som används för att utöka formatet för e-postmeddelanden till att stödja applikationsprogram, video, bilder etc.,

Det finns två klasser som vi behöver från modulen email.mime. De är MIMEText och MIMEMultipart. Låt oss se en kort förklaring om dem.

#1. MIMEText

MIMEText-klassen används för att skriva vårt e-postinnehåll i HTML. Vi kommer att skapa en instans av klassen MIMEText genom att skicka HTML-innehåll och typen av innehåll. Se exempelkoden nedan.

html_content = MIMEText(html_template, 'html')

Vissa e-posttjänster stöder inte HTML-rendering. Så det är bättre att skapa två instanser av klassen MIMEText för vanlig text och HTML.

#2. MIMEMultipart

MIMEMultipart-klassen används för att förenkla formateringen och skrivämnet, från adress, till adress etc. Vi kommer att ge innehållet som skapats med MIMEText-klassen till MIMEMultipart med hjälp av attach-metoden.

Vi måste se till att instansen av MIMEMultipart skapas med argumentet alternativ för att rendera vanlig text eller HTML. Låt oss skicka ett mail med HTML-innehåll.

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

            text_template = """
            adminvista.com

            Hi {0},
            We are delighted announce that our website hits 10 Million views this month.
            """
            html_template = """
            <h1>adminvista.com</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 också lägga till blind kopia med det attributet Bcc i MIMEMultipart-instansen.

Lägger till bilagor

Bilagor kan vara bilder, pdf-filer, dokument, ark, etc. Det kallas MIMEBase i klassen email.mime. Den används för att lägga till bilagor till e-postmeddelandet.

Låt oss lägga till en bilaga till ovanstå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 = "adminvista.com-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)

Maila till massutskick på en gång

Vi har använt en loop för att skicka samma mail till flera medlemmar. Det är ett fall (när du inte vill att mottagarna ska veta om andra mottagare).

Anta att du måste skicka samma mail till 1000 medlemmar samtidigt i samma grupp. I sådana fall är det inte lämpligt att använda en slinga. Vi kan lägga till flera e-postmeddelanden i fältet Till i allmän e-postskrivning. Hur gör man det i Python-skriptet?

Vi måste kombinera listan med e-postmeddelanden som en sträng separerad med kommatecken och mellanslag. Vi kan använda strängen join-metoden för att kombinera alla e-postmeddelanden som en sträng. Se koden för att kombinera e-postmeddelanden som en sträng.

", ".join(emails)

Ersätt fältet Till i skriptet ovan med strängen ovan. Det är allt, du har skickat posten till massutskick på en gång.

Slutsats

Det finns vissa tredjepartsbibliotek för att skicka e-postmeddelanden i Python. Några av dem är Kuvert, Yagmail, Flanker, etc.., Dessa bibliotek hjälper oss att skriva skript med få rader kod. Du kan utforska dem också.

Nu kan du automatisera dina e-postsaker med Python-skript. Strukturen för att skicka e-postmeddelanden kommer att vara annorlunda beroende på ditt användningsfall. Vi har sett olika scenarier för att skicka e-post. Du kan enkelt anpassa skripten som diskuteras i handledningen till ditt användningsfall. Jag har hämtat referensen från detta artikel.

Glad kodning 🙂