如何在 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 脚本自动化您的电子邮件内容。 根据您的用例,发送电子邮件的结构会有所不同。 我们已经看到了发送电子邮件的不同场景。 您可以轻松地根据您的用例自定义本教程中讨论的脚本。 我从这篇文章中获取了参考。

快乐编码