如何在 Python 中通過 Gmail 發送電子郵件?

已發表: 2021-06-06

手動發送大量電子郵件是一項乏味的任務。 您可以使用第三方服務一次批量發送電子郵件。

您如何創建自己的自定義腳本來發送電子郵件?

是不是很美妙?

是啊,就是。 我們將用 Python 編寫一個腳本來發送電子郵件。

Python 有一個名為smtplib的庫,用於發送電子郵件。 庫smtplib基於SMTP (簡單郵件傳輸協議)。 SMTP 用於向他人發送電子郵件。

設置 Gmail

在這裡,我們將使用 Gmail 作為電子郵件提供商。 Google 不允許腳本登錄。我們需要更改 Gmail 帳戶的安全性,以允許腳本登錄我們的 Gmail 帳戶。

更改我們 Gmail 帳戶中的安全選項並不好,因為它允許其他人很容易地訪問該帳戶。 建議創建一個新的 Gmail 帳戶。 轉到此處的設置並打開允許安全性較低的應用程序:開啟設置。

如果您對開啟上述設置不滿意,您可以使用 Google API 登錄您的 Gmail 帳戶。 您可以在此處找到使用 Google API 進行身份驗證的腳本。

發送郵件的步驟

需要執行某些步驟才能使用smtplib庫發送郵件。 先看步驟,再寫腳本。

#1. 連接到 SMTP 服務器

每個服務提供商都會有不同的 SMTP 服務器域名和端口。 我們必須使用我們將在腳本中使用的 SMTP 服務器域名和電子郵件提供商的端口。 Gmail 的 SMTP 服務器域名和端口是smtp.gmail.com<em>465</em>

我們將對 SMTP 服務器連接使用SSL加密,因為它比TSL加密更安全。 如果要使用TSL加密,請使用端口587而不是465 。 SMTP 服務器域名將因電子郵件服務提供商而異。

連接到 SMTP 服務器的代碼

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

#2. 登錄

一旦與 SMTP 服務器建立了連接,我們就可以通過login SMTP 對象的方法使用電子郵件地址和密碼login 。 代碼如下所示。

 server.login(sender_email, password)

#3. 發送郵件

登錄後,我們無法等待發送郵件。 使用sendmail方法發送郵件。 確保您按以下格式發送郵件。

主題: your_subject_for \newline mail_content

空格不是必需的。 它們僅用於上述格式的說明。 讓我們看看示例代碼。

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

#4. 退出

不要忘記退出 SMTP c

我們已經看到了使用 Python 發送郵件的步驟。 但是,我們還沒有討論完整的代碼。 讓我們快速瀏覽一下代碼。

 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)

我們創建了一個名為Mail的類。 它有一個叫做send的方法來發送郵件。 是否寫課取決於你。 該類使其更具可讀性。 我們已經在send方法中一一實現了上面討論的所有步驟。

歡呼! 您已使用 Python 腳本發送了一封郵件。

HTML 內容

如果您想以 HTML 格式發送郵件怎麼辦? 是否可以?

是的,為什麼不呢。 我們可以使用名為email.mime的庫使用 HTML 發送郵件。 這是一個內置庫。

MIME 是一種用於擴展電子郵件格式以支持應用程序、視頻、圖像等的標準,

我們需要email.mime模塊中的兩個類。 它們是MIMETextMIMEMultipart 。 讓我們看一下有關它們的簡要說明。

#1. MIME文本

MIMEText 類用於在 HTML 中編寫我們的郵件內容。 我們將通過傳遞 HTML 內容和內容類型來創建 MIMEText 類的實例。 請參閱下面的示例代碼。

 html_content = MIMEText(html_template, 'html')

某些郵件服務不支持 HTML 呈現。 因此,最好為純文本和 HTML 創建 MIMEText 類的兩個實例。

#2. MIME多部分

MIMEMultipart 類用於簡化格式和寫作主題,從地址,到地址等,我們將使用attach方法attach使用 MIMEText 類創建的內容賦予 MIMEMultipart。

我們需要確保 MIMEMultipart 的實例是使用參數alternative創建的,以呈現純文本或 HTML。 讓我們發送一封包含 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)

您還可以在 MIMEMultipart 實例中使用該屬性Bcc添加Bcc

添加附件

附件可以是圖片、pdf、docs、sheet等, email.mime類中有一個叫做MIMEBase 。 它用於向郵件添加附件。

讓我們在上面的郵件中添加一個附件。

 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)

一次郵寄到大宗郵件

我們使用循環向多個成員發送相同的郵件。 這是一種情況(當您不希望接收器知道其他接收器時)。

假設您必須一次向同一組的1000名成員發送相同的郵件。 在這種情況下,使用循環是不合適的。 我們可以在常規郵件撰寫的收件人字段中添加多封電子郵件。 如何在 Python 腳本中做到這一點?

我們需要將電子郵件列表組合為以逗號和空格分隔的字符串。 我們可以使用join方法 string 將所有電子郵件組合為一個字符串。 請參閱將電子郵件組合為字符串的代碼。

 ", ".join(emails)

使用上述字符串替換上述腳本中的To字段。 就是這樣,您已將郵件一次性發送到大量郵件中。

結論

有一些第三方庫可以在 Python 中發送電子郵件。 其中一些是 Envelopes、Yagmail、Flanker 等,這些庫幫助我們用幾行代碼編寫腳本。 您也可以探索它們。

現在,您可以使用 Python 腳本自動化您的電子郵件內容。 根據您的用例,發送電子郵件的結構會有所不同。 我們已經看到了發送電子郵件的不同場景。 您可以輕鬆地根據您的用例自定義本教程中討論的腳本。 我從這篇文章中獲取了參考。

快樂編碼