Send masse-eposter med Python: En komplett guide

Lag ditt eget e-postskript med Python

Det kan være en tidkrevende oppgave å sende mange e-poster manuelt. Det finnes tredjepartstjenester som kan hjelpe deg med å sende e-post i større mengder, men hva med å lage ditt eget skript for dette?

Er ikke det en spennende tanke? La oss se hvordan vi kan lage et slikt skript med Python.

Python tilbyr et bibliotek kalt smtplib, som er spesialdesignet for å sende e-post. Dette biblioteket er basert på SMTP (Simple Mail Transport Protocol), som er standardprotokollen for å overføre e-post.

Konfigurering av Gmail

I dette eksemplet skal vi bruke Gmail som vår e-postleverandør. Google tillater imidlertid ikke at skript logger direkte inn. Derfor må vi gjøre en endring i sikkerhetsinnstillingene til Gmail-kontoen vår, slik at skriptet får tilgang.

Det er viktig å være klar over at endring av sikkerhetsinnstillingene i Gmail-kontoen din kan gjøre den mer sårbar. Det kan derfor være lurt å opprette en egen Gmail-konto for dette formålet. Du kan justere sikkerhetsinnstillingen her for å tillate mindre sikre apper.

Hvis du er usikker på å endre denne innstillingen, kan du også bruke Google API for å logge inn på Gmail-kontoen. Du finner en guide for hvordan du bruker Google API for autentisering her.

Steg for å sende e-post

Det er visse trinn du må følge for å sende en e-post ved hjelp av smtplib-biblioteket. La oss se på disse stegene før vi går videre til selve koden.

#1. Koble til SMTP-serveren

Hver e-postleverandør har sitt eget SMTP-serverdomene og portnummer. Vi trenger å vite disse opplysningene for leverandøren vi bruker i skriptet vårt. For Gmail er SMTP-serverdomenet smtp.gmail.com og porten er 465.

Vi bruker SSL-kryptering for SMTP-tilkoblingen, siden dette er tryggere enn TSL-kryptering. Hvis du foretrekker å bruke TSL-kryptering, bruk port 587 i stedet for 465. SMTP-serverdomenet kan variere avhengig av hvilken e-postleverandør du bruker.

Her er et kodeeksempel for å koble til SMTP-serveren:

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

#2. Logg inn

Etter at tilkoblingen til SMTP-serveren er etablert, kan vi logge inn med e-postadressen og passordet. Dette gjør vi ved hjelp av login-metoden til SMTP-objektet. Koden for dette ser slik ut:

server.login(sender_email, password)

#3. Send e-post

Når innloggingen er fullført, kan vi endelig sende e-posten. Dette gjøres med sendmail-metoden. Det er viktig å formatere e-posten på følgende måte:

Emne: your_subject_for newline mail_content

Mellomrom er ikke nødvendig, men de er brukt her for å gjøre formatet lettere å forstå. Her er et kodeeksempel:

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

#4. Avslutt

Husk å avslutte SMTP-tilkoblingen når du er ferdig.

Nå har vi sett trinnene for å sende en e-post med Python. La oss se på hele 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 kalt Mail med en metode kalt send som sender e-post. Denne strukturen gjør koden mer lesbar. Alle trinnene vi har diskutert tidligere er implementert i send-metoden.

Gratulerer! Du har nå sendt en e-post ved hjelp av et Python-skript.

HTML-innhold

Hva om du ønsker å sende e-posten med HTML-innhold? Det er fullt mulig! Vi kan bruke email.mime-biblioteket, som er en innebygd modul.

MIME er en standard for å utvide formatet på e-poster og støtte applikasjoner, video, bilder og mer.

Vi trenger to klasser fra email.mime-modulen: MIMEText og MIMEMultipart. La oss se nærmere på disse.

#1. MIMEText

MIMEText-klassen brukes til å skrive e-postinnhold i HTML. Vi oppretter en forekomst av MIMEText ved å sende HTML-innholdet og innholdstypen. Se kodeeksemplet:

html_content = MIMEText(html_template, 'html')

Noen e-posttjenester støtter ikke HTML-visning. Det kan derfor være lurt å lage to MIMEText-forekomster, en for ren tekst og en for HTML.

#2. MIMEMultipart

MIMEMultipart-klassen brukes til å formatere og skrive emne, fra-adresse og til-adresse. Vi gir innholdet fra MIMEText-klassen til MIMEMultipart med attach-metoden.

Vi må sørge for at MIMEMultipart-forekomsten er opprettet med argumentet alternative, for å støtte både ren tekst og HTML. Her er et eksempel på hvordan du sender 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 blindkopi (Bcc) ved å bruke Bcc-attributtet i MIMEMultipart-forekomsten.

Legge til vedlegg

Vedlegg kan være bilder, PDF-filer, dokumenter og regneark. For å legge til vedlegg bruker vi MIMEBase-klassen fra email.mime.

La oss se hvordan vi kan legge til et vedlegg til e-posten:

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)

Sende e-post til flere mottakere samtidig

Vi har brukt en løkke for å sende samme e-post til flere mottakere. Dette er en fin måte å gjøre det på når du ikke ønsker at mottakerne skal vite om hverandre.

Men hva hvis du skal sende den samme e-posten til 1000 medlemmer samtidig, og det ikke er så viktig om de vet at andre også mottar den? Da er det ikke effektivt å bruke en løkke. I slike tilfeller kan vi legge til flere e-postadresser i «Til»-feltet. Hvordan gjør vi det med et Python-skript?

Vi må kombinere listen over e-poster til en streng, der hver e-post er separert med et komma og et mellomrom. Vi kan bruke join-metoden for dette. Her er koden:

", ".join(emails)

Bruk denne strengen i stedet for «Til»-feltet i skriptet, og du har sendt e-posten til mange mottakere samtidig.

Konklusjon

Det finnes flere tredjepartsbiblioteker for å sende e-post med Python, som for eksempel Envelopes, Yagmail og Flanker. Disse bibliotekene kan forenkle koden din. Du kan gjerne utforske dem også.

Med dette har du nå muligheten til å automatisere dine e-postrutiner med Python-skript. Strukturen vil variere avhengig av behovene dine, men vi har sett på de viktigste scenarioene. Du kan enkelt tilpasse skriptene vi har diskutert her for ditt eget bruk. Informasjonen i denne artikkelen er delvis basert på denne artikkelen.

Lykke til med kodingen! 🙂