Jak wysyłać wiadomości e-mail przez Gmaila w Pythonie?
Opublikowany: 2021-06-06Ręczne wysyłanie dużej ilości wiadomości e-mail to żmudne zadanie. Możesz korzystać z usług innych firm, aby wysyłać e-maile zbiorczo naraz.
Co powiesz na stworzenie własnego, spersonalizowanego skryptu do wysyłania e-maili?
Czy to nie cudowne?
Tak jest. Zamierzamy napisać skrypt w Pythonie do wysyłania e-maili.
Python posiada bibliotekę o nazwie smtplib, która służy do wysyłania e-maili. Biblioteka smtplib jest oparta na protokole SMTP (Simple Mail Transport Protocol). SMTP służy do wysyłania e-maili do innych osób.
Skonfiguruj Gmaila
Tutaj będziemy używać Gmaila jako dostawcy poczty e-mail. Google nie zezwala na logowanie się za pomocą skryptów. Musimy też wprowadzić zmianę w zabezpieczeniach naszego konta Gmail, która umożliwia skryptom logowanie się na nasze konto Gmail.
Zmiana opcji bezpieczeństwa na naszym koncie Gmail nie jest dobra, ponieważ pozwala innym na bardzo łatwy dostęp do konta. Zalecane jest utworzenie nowego konta Gmail. Przejdź do ustawień tutaj i włącz ustawienie Zezwalaj na mniej bezpieczne aplikacje: WŁ .
Jeśli nie czujesz się komfortowo z włączeniem powyższego ustawienia, możesz użyć interfejsu API Google do zalogowania się na swoje konto Gmail. Skrypt do korzystania z interfejsów Google API do uwierzytelniania można znaleźć tutaj.
Kroki do wysłania poczty
Aby wysłać pocztę przy użyciu biblioteki smtplib, należy wykonać pewne kroki. 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 <em>465</em> .
Będziemy używać szyfrowania SSL dla 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 się różnić w zależności od dostawcy usług poczty e-mail.
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ę przy użyciu adresu e-mail i hasła metodą login obiektu SMTP. Kod wygląda następująco.
server.login(sender_email, password)#3. Wyślij maila
Po zalogowaniu nie ma możliwości czekania na wysłanie maila. Wyślij pocztę za pomocą metody sendmail . Upewnij się, że wysyłasz pocztę w następującym formacie.
Temat: twój_temat_dla \newline mail_content
Spacje nie są konieczne. Są one tylko dla 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, jak wysył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 do wysyłania e-maili. Klasa pisania, czy po prostu nie, zależy od Ciebie. Klasa czyni ją bardziej czytelną. Wszystkie opisane powyżej kroki zaimplementowaliśmy jeden po drugim w metodzie send .
Hurra! wysłałeś wiadomość za pomocą skryptu Python.
Zawartość HTML
Co jeśli chcesz wysłać pocztę w HTML? Czy to możliwe?
Tak czemu nie. Możemy wysłać pocztę za pomocą HTML biblioteki o nazwie email.mime . To wbudowana biblioteka.
MIME to standard używany do rozszerzenia formatu wiadomości e-mail o obsługę programów użytkowych, wideo, obrazów itp.,
email.mime 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 pisania treści naszej poczty w HTML. Stworzymy instancję klasy MIMEText przekazując treść HTML i typ treś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. MIMEMultipart
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 przy użyciu metody attach .
Musimy upewnić się, że instancja MIMEMultipart została utworzona z argumentem alternative do renderowania zwykłego tekstu lub HTML. Wyślijmy maila z zawartoś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'] = 'Geekflare Celebrations' mail['From'] = self.sender_mail mail['To'] = email text_template = """ Geekflare Hi {0}, We are delighted announce that our website hits 10 Million views this month. """ html_template = """ <h1>Geekflare</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 również dodać niewidoczną kopię, używając tego atrybutu Bcc w wystąpieniu MIMEMultipart.
Dodawanie załączników
Załącznikami mogą być obrazy, pliki PDF, dokumenty, arkusze itp. W klasie email.mime nosi nazwę MIMEBase . Służy do dodawania załączników do poczty.
Dodajmy załącznik do powyższego maila.
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 = "Geekflare-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)Wyślij pocztę zbiorczą na raz
Wykorzystaliśmy pętlę do wysłania tej samej poczty do wielu członków. To jeden przypadek (gdy nie chcesz, aby odbiorcy wiedzieli o innych odbiornikach).
Załóżmy, że musisz wysłać tę samą pocztę do 1000 członków naraz z tej samej grupy. W takich przypadkach użycie pętli nie będzie odpowiednie. Możemy dodać wiele e-maili w polu Do w ogólnej wiadomości e-mail. Jak to zrobić w skrypcie Pythona?
Musimy połączyć listę e-maili jako ciąg znaków oddzielony przecinkiem i spacją . Możemy użyć ciągu metody join , aby połączyć wszystkie e-maile w ciąg. Zobacz kod, aby połączyć e-maile jako ciąg.
", ".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 poczty zbiorczej.
Wniosek
Istnieje kilka bibliotek innych firm do wysyłania e-maili w Pythonie. Niektóre z nich to Envelopes, Yagmail, Flanker itp. Te biblioteki pomagają nam pisać skrypty z kilkoma linijkami 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 się różnić 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. Wziąłem odniesienie z tego artykułu.
Szczęśliwego kodowania
