Hogyan lehet e-mailt küldeni a Gmailen keresztül a Pythonban?

Az e-mailek nagy részének kézi küldése unalmas feladat. Harmadik fél szolgáltatásaival egyszerre tömegesen küldheti el az e-maileket.

Mit szólnál, ha létrehoznál egy saját, testreszabott szkriptet az e-mailek küldéséhez?

Hát nem csodálatos?

Igen, ez az. Szkriptet fogunk írni Pythonban az e-mailek küldéséhez.

A Python rendelkezik egy smtplib nevű könyvtárral, amelyet e-mailek küldésére használnak. Az smtplib könyvtár az SMTP-n (Simple Mail Transport Protocol) alapul. Az SMTP-t arra használják, hogy e-maileket küldjenek másoknak.

A Gmail beállítása

Itt a Gmailt fogjuk használni e-mail szolgáltatóként. A Google nem engedélyezi a bejelentkezést a szkriptek számára. Változást kell végrehajtanunk Gmail-fiókunk biztonságában, amely lehetővé teszi a szkriptek számára, hogy bejelentkezzenek Gmail-fiókunkba.

A biztonsági beállítás módosítása a Gmail fiókunkban nem jó, mert így mások is nagyon könnyen hozzáférhetnek a fiókhoz. Javasoljuk, hogy hozzon létre egy új Gmail fiókot. Menjen a beállításokhoz itt és kapcsolja be a Kevésbé biztonságos alkalmazások engedélyezése: BE beállítást.

Ha nem elégedett a fenti beállítás bekapcsolásával, a Google API segítségével bejelentkezhet Gmail-fiókjába. Megtalálhatja a szkriptet a Google API-k hitelesítéshez való használatához itt.

A levelek küldésének lépései

Bizonyos lépéseket meg kell tenni az smtplib könyvtár használatával történő levélküldéshez. Először lássuk a lépéseket, majd írjuk meg a forgatókönyvet.

#1. Csatlakozás az SMTP szerverhez

Minden szolgáltatónak más az SMTP szerver tartományneve és portja. Használnunk kell az SMTP-kiszolgáló tartománynevét és az e-mail szolgáltató portját, amelyet használni fogunk a szkriptben. A Gmail SMTP-szerverének tartományneve és portja: smtp.gmail.com és 465.

SSL titkosítást fogunk használni az SMTP szerver kapcsolathoz, mivel ez biztonságosabb, mint a TSL titkosítás. Ha TSL-titkosítást szeretne használni, használja az 587-es portot a 465-ös helyett. Az SMTP-kiszolgáló tartományneve az e-mail szolgáltatótól függően eltérő lesz.

  Videók körbevágása és képarányának módosítása iPhone vagy iPad készüléken

Az SMTP szerverhez való csatlakozás kódja

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

#2. Belépés

Miután létrejött a kapcsolat az SMTP szerverrel, az e-mail címmel és jelszóval bejelentkezhetünk a bejelentkezési SMTP objektum metódusával. A kód a következőképpen néz ki.

server.login(sender_email, password)

#3. Levél küldés

Bejelentkezés után már nem tudjuk megvárni a levél elküldését. Küldje el a levelet a sendmail módszerrel. Ügyeljen arra, hogy a levelet a következő formátumban küldje el.

Tárgy: az Ön_tárgya az újsoros mail_tartalomhoz

A szóközök nem szükségesek. Csak a pontosítás kedvéért a fenti formátumban. Lássuk a mintakódot.

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

#4. Kilépés

Ne felejtsen el kilépni az SMTP c

Láttuk a Python használatával történő levelek küldésének lépéseit. De még nem beszéltük meg a teljes kódot. Menjünk gyorsan a kódon.

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)

Létrehoztunk egy Mail nevű osztályt. És van egy send nevű módszere a levelek elküldésére. Rajtad múlik, hogy megírod-e az órát, vagy nem. Az osztály olvashatóbbá teszi. A fentiekben tárgyalt lépéseket egyenként megvalósítottuk a küldési módban.

Hurrá! Python szkripttel küldött levelet.

HTML tartalom

Mi a teendő, ha HTML-ben szeretnéd elküldeni a levelet? Lehetséges?

Igen, miért ne. A leveleket az email.mime nevű könyvtár HTML használatával küldhetjük el. Ez egy beépített könyvtár.

  Hogyan hozzunk létre több helyet egy iPhone vagy iPad frissítés számára

Az PANTOMIM egy szabvány, amelyet az e-mailek formátumának kiterjesztésére használnak, hogy támogassák az alkalmazásokat, videókat, képeket stb.,

Két osztályra van szükségünk az email.mime modulból. Ezek a MIMEText és a MIMEMultipart. Lássunk egy rövid magyarázatot róluk.

#1. MIMEText

A MIMEText osztályt arra használjuk, hogy leveleinket HTML-ben írjuk. Létrehozzuk a MIMEText osztály példányát a HTML tartalom és a tartalom típusának átadásával. Lásd az alábbi mintakódot.

html_content = MIMEText(html_template, 'html')

Egyes levelezőszolgáltatások nem támogatják a HTML-megjelenítést. Tehát jobb, ha két példányt hoz létre a MIMEText osztályból egyszerű szöveghez és HTML-hez.

#2. MIMEMmultipart

A MIMEMultipart osztály a formázás és az írás tárgyának egyszerűsítésére szolgál, címtől címig stb. A MIMEText osztállyal készített tartalmat a MIMEMultipartnak adjuk át csatolási metódussal.

Meg kell győződnünk arról, hogy a MIMEMultipart példánya a sima szöveg vagy HTML megjelenítés alternatívájával jön létre. Küldjünk e-mailt HTML tartalommal.

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

            text_template = """
            etoppc.com

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

A titkos másolatot a Bcc attribútum használatával is hozzáadhatja a MIMEMultipart példányban.

Mellékletek hozzáadása

A mellékletek lehetnek képek, pdf-ek, dokumentumok, lapok stb. Az email.mime osztályban MIMEBase néven szerepel. A levél mellékleteinek hozzáadására szolgál.

  10 legjobb Docker hosting platform a konténerekhez

Adjunk hozzá egy mellékletet a fenti levélhez.

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

Postázás tömeges levelekre egyszerre

Egy hurkot használtunk arra, hogy ugyanazt a levelet több tagnak is elküldjük. Ez egy eset (amikor nem akarja, hogy a vevők tudjanak más vevőkészülékekről).

Tételezzük fel, hogy ugyanazt a levelet kell elküldened ugyanannak a csoportnak egyszerre 1000 tagjának. Ilyen esetekben a hurok használata nem megfelelő. Több e-mailt is felvehetünk a Címzett mezőbe az általános levélírás során. Hogyan kell csinálni Python szkriptben?

Az e-mailek listáját vesszővel és szóközzel elválasztott karakterláncként kell kombinálnunk. Az összekapcsolási metódus karakterláncával az összes e-mailt karakterláncként kombinálhatjuk. Tekintse meg a kódot az e-mailek karakterláncként való kombinálásához.

", ".join(emails)

Cserélje ki a Címzett mezőt a fenti szkriptben a fenti karakterlánc használatával. Ez az, Ön egyszerre küldte el a leveleket tömeges e-mailekre.

Következtetés

Vannak harmadik féltől származó könyvtárak e-mailek küldésére Pythonban. Némelyikük igen Borítékok, Yagmail, Oldalbástya, stb., Ezek a könyvtárak segítenek nekünk néhány soros kóddal szkripteket írni. Te is felfedezheted őket.

Most már automatizálhatja e-mailjeit Python-szkriptek segítségével. Az e-mailek küldésének szerkezete az Ön használati esetétől függően eltérő lesz. Különféle forgatókönyveket láttunk az e-mailek küldésére. Könnyedén testreszabhatja az oktatóanyagban tárgyalt szkripteket az Ön használati esetéhez. Ebből vettem a hivatkozást cikk.

Boldog kódolást 🙂