Jak wysyłać e-maile przez Gmaila w Pythonie?

Ręczne wysyłanie wielu wiadomości e-mail jest żmudnym zadaniem. Możesz korzystać z usług innych firm, aby wysyłać e-maile zbiorczo naraz.

Co powiesz na stworzenie własnego dostosowanego skryptu do wysyłania wiadomości e-mail?

Czy to nie cudowne?

Tak jest. Zamierzamy napisać skrypt w Pythonie do wysyłania e-maili.

Python ma bibliotekę o nazwie smtplib, która służy do wysyłania wiadomości e-mail. Biblioteka smtplib jest oparta na protokole SMTP (Simple Mail Transport Protocol). SMTP służy do wysyłania wiadomości e-mail do innych osób.

Skonfiguruj Gmaila

Tutaj użyjemy Gmaila jako dostawcy poczty e-mail. Google nie zezwala na logowanie się skryptów. Musimy też wprowadzić zmianę w zabezpieczeniach naszego konta Gmail, która umożliwi skryptom logowanie się na nasze konto Gmail.

Zmiana opcji bezpieczeństwa na naszym koncie Gmail nie jest dobra, ponieważ umożliwia innym bardzo łatwy dostęp do konta. Zaleca się utworzenie nowego konta Gmail. Przejdź do ustawień tutaj i włącz ustawienie Zezwalaj na mniej bezpieczne aplikacje: WŁ.

Jeśli nie masz ochoty włączyć powyższego ustawienia, możesz użyć Google API, aby zalogować się na swoje konto Gmail. Możesz znaleźć skrypt do używania interfejsów API Google do uwierzytelniania tutaj.

Kroki, aby wysłać pocztę

Aby wysłać wiadomość e-mail przy użyciu biblioteki smtplib, należy wykonać określone czynności. Zobaczmy najpierw kroki, a potem napiszemy skrypt.

# 1. Łączenie z serwerem SMTP

Każdy usługodawca będzie miał inną nazwę domeny i port serwera SMTP. Musimy użyć nazwy domeny serwera SMTP i portu dostawcy poczty e-mail, którego będziemy używać w skrypcie. Nazwa domeny serwera SMTP i port Gmaila to smtp.gmail.com i 465.

Będziemy używać szyfrowania SSL do połączenia z serwerem SMTP, ponieważ jest ono bezpieczniejsze niż szyfrowanie TSL. Jeśli chcesz korzystać z szyfrowania TSL, użyj portu 587 zamiast 465. Nazwa domeny serwera SMTP będzie różna w zależności od dostawcy usług pocztowych.

Kod do połączenia z serwerem SMTP

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

#2. Zaloguj sie

Po nawiązaniu połączenia z serwerem SMTP możemy zalogować się za pomocą adresu e-mail i hasła metodą obiektu logowania SMTP. Kod wygląda następująco.

server.login(sender_email, password)

#3. Wyślij maila

Po zalogowaniu nie ma możliwości, abyśmy mogli czekać z wysłaniem wiadomości. Wyślij wiadomość za pomocą metody sendmail. Upewnij się, że wysyłasz wiadomość e-mail w następującym formacie.

Temat: your_subject_for newline mail_content

Spacje nie są konieczne. Służą tylko do wyjaśnienia w powyższym formacie. Zobaczmy przykładowy kod.

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

#4. Zrezygnować

Nie zapomnij zamknąć SMTP c

Widzieliśmy kroki, aby wysłać pocztę za pomocą Pythona. Ale nie omówiliśmy całego kodu. Przejdźmy szybko przez kod.

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)

Stworzyliśmy klasę o nazwie Mail. I ma metodę o nazwie send, aby wysłać e-maile. Pisanie lekcji lub po prostu nie zależy od Ciebie. Klasa czyni go bardziej czytelnym. Zaimplementowaliśmy wszystkie kroki omówione powyżej jeden po drugim w metodzie send.

Hurra! wysłałeś wiadomość za pomocą skryptu Pythona.

Zawartość HTML

Co zrobić, jeśli chcesz wysłać wiadomość w formacie HTML? Czy to możliwe?

Tak czemu nie. Pocztę możemy wysłać za pomocą biblioteki HTML o nazwie email.mime. To wbudowana biblioteka.

The MIM to standard używany do rozszerzenia formatu wiadomości e-mail o obsługę programów użytkowych, wideo, obrazów itp.,

Z modułu email.mime potrzebujemy dwóch klas. Są to MIMEText i MIMEMultipart. Zobaczmy krótkie wyjaśnienie na ich temat.

# 1. Tekst MIME

Klasa MIMEText służy do zapisywania treści naszej poczty w formacie HTML. Stworzymy instancję klasy MIMEText przekazując treść HTML i typ zawartości. Zobacz przykładowy kod poniżej.

html_content = MIMEText(html_template, 'html')

Niektóre usługi pocztowe nie obsługują renderowania HTML. Dlatego lepiej jest utworzyć dwie instancje klasy MIMEText dla zwykłego tekstu i HTML.

#2. MIMEMWieloczęściowy

Klasa MIMEMultipart służy do uproszczenia formatowania i pisania tematu, od adresu do adresu itp. Treść utworzoną za pomocą klasy MIMEText przekażemy do MIMEMultipart za pomocą metody attach.

Musimy się upewnić, że instancja MIMEMultipart jest tworzona z argumentem alternatywnym do renderowania zwykłego tekstu lub HTML. Wyślijmy wiadomość z treścią HTML.

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

            text_template = """
            newsblog.pl

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

Możesz także dodać ślepą kopię, używając tego atrybutu Bcc w instancji MIMEMultipart.

Dodawanie załączników

Załącznikami mogą być obrazy, pliki pdf, dokumenty, arkusze itp. W klasie email.mime jest MIMEBase. Służy do dodawania załączników do wiadomości.

Dodajmy załącznik do powyższej wiadomości.

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

Wysyłaj wiadomości masowe jednocześnie

Użyliśmy pętli, aby wysłać tę samą wiadomość do wielu członków. To jeden przypadek (kiedy nie chcesz, aby odbiorcy wiedzieli o innych odbiornikach).

Załóżmy, że musisz wysłać tę samą wiadomość do 1000 członków tej samej grupy jednocześnie. W takich przypadkach użycie pętli nie będzie odpowiednie. Możemy dodać wiele e-maili w polu Do w ogólnym komponowaniu poczty. Jak to zrobić w skrypcie Pythona?

Musimy połączyć listę e-maili jako ciąg oddzielony przecinkiem i spacją. Możemy użyć łańcucha metody join, aby połączyć wszystkie e-maile jako ciąg. Zobacz kod do łączenia wiadomości e-mail jako ciąg znaków.

", ".join(emails)

Zastąp pole Do w powyższym skrypcie, używając powyższego ciągu. To wszystko, od razu wysłałeś pocztę do masowych maili.

Wniosek

Istnieje kilka bibliotek innych firm do wysyłania wiadomości e-mail w Pythonie. Niektórzy z nich są Koperty, Jagmail, Flankeritp., Biblioteki te pomagają nam pisać skrypty z kilkoma liniami kodu. Możesz je również eksplorować.

Teraz możesz zautomatyzować swoje wiadomości e-mail za pomocą skryptów Pythona. Struktura wysyłania wiadomości e-mail będzie różna w zależności od przypadku użycia. Widzieliśmy różne scenariusze wysyłania e-maili. Możesz łatwo dostosować skrypty omówione w samouczku do swojego przypadku użycia. Odniesienie wziąłem z tego artykuł.

Miłego kodowania 🙂