如何使用Python通过Gmail发送电子邮件?
手动发送大量电子邮件是一项繁琐的任务。您可以使用第三方服务一次性发送大量电子邮件。
您可以创建自己定制的脚本来发送电子邮件,如何呢?
是不是很棒呢?
是的,没错。我们打算用Python编写一个发送电子邮件的脚本。
Python有一个名为smtplib的库,用于发送电子邮件。该库smtplib
基于SMTP (Simple Mail Transport Protocol,简单邮件传输协议)。SMTP用于向其他人发送电子邮件。
设置Gmail
在这里,我们将使用Gmail作为电子邮件提供商。Google不允许脚本进行登录。我们需要更改Gmail帐户的安全设置,以允许脚本登录到我们的Gmail帐户。
更改Gmail帐户中的安全选项并不好,因为这会使其他人很容易访问该帐户。建议您创建一个新的Gmail帐户。转到设置here并打开允许不安全的应用程序:开启设置。
如果您不喜欢打开上述设置,您可以使用Google API登录到您的Gmail帐户。您可以在此处找到使用Google API进行身份验证的脚本here。
发送邮件的步骤
使用smtplib库发送邮件需要完成一些步骤。让我们先看看这些步骤,然后再编写脚本。
#1. 连接到SMTP服务器
每个服务提供商都有不同的SMTP服务器域名和端口。我们必须在脚本中使用我们将要使用的电子邮件提供商的SMTP服务器域名和端口。Gmail的SMTP服务器域名和端口分别是smtp.gmail.com和465
。
我们将使用SSL 加密进行SMTP服务器连接,因为它比TSL加密更安全。如果您想使用TSL 加密,请使用端口587
,而不是465
。SMTP服务器域名将根据电子邮件服务提供商而不同。
连接到SMTP服务器的代码
server = smtplib.SMTP_SSL(smtp_server_domain_name, port, context=ssl_context)
#2. 登录
一旦与SMTP服务器建立连接,我们可以使用电子邮件地址和密码使用login
SMTP对象的方法登录。代码如下所示。
server.login(sender_email, password)
#3. 发送邮件
登录后,我们无法等待发送邮件。使用sendmail
方法发送邮件。确保以以下格式发送邮件。
Subject: 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(“输入邮件地址: “).split()
subject = input(“输入主题: “)
content = input(“输入内容: “)
mail = Mail()
mail.send(mails, subject, content)
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庆祝活动'
mail['From'] = self.sender_mail
mail['To'] = email
text_template = """
Geekflare
您好{0},
我们非常高兴地宣布,我们的网站本月达到了1000万次浏览量。
"""
html_template = """
Geekflare
您好{0},
我们非常高兴地宣布,我们的网站上个月达到了1000万次浏览量。
"""
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("请输入邮箱:").split()
mail = Mail()
mail.send(mails)
使用MIMEMultipart实例的Bcc
属性,您还可以添加智能抄送。
添加附件
附件可以是图片、pdf、文档、表格等等,在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):
## 登录...
for email in emails:
## MIMEMultipart实例
## 文本和HTML模板
## MIMEText实例
## 将消息附加到MIMEMultipart中
## 添加附件
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)
## 发送邮件
service.quit()
if __name__ == '__main__':
mails = input("请输入邮箱:").split()
mail = Mail()
mail.send(mails)
一次发送邮件给多个邮箱
我们使用循环将相同的邮件发送给多个成员。这是一种情况(当您不希望收件人知道其他收件人时)。
假设您需要将相同的邮件一次性发送给同一组的1000个成员。在这种情况下,使用循环是不合适的。我们可以在通常的邮件撰写中在To字段中添加多个电子邮件。如何在Python脚本中实现呢?
我们需要将电子邮件列表组合成一个用逗号和空格分隔的字符串。我们可以使用字符串的join方法将所有电子邮件组合成一个字符串。以下是将电子邮件组合为字符串的代码。
", ".join(emails)
使用上述字符串替换上面脚本中的To字段。这样,您就一次性将邮件发送给了多个邮箱。
结论
有一些第三方库可以用Python发送电子邮件。其中一些是Envelopes, Yagmail, Flanker等等。这些库帮助我们使用很少的代码编写脚本。您也可以探索它们。
现在,您可以使用Python脚本自动化您的电子邮件事务。基于您的用例,sending emails的结构将会有所不同。我们已经看到了不同的发送电子邮件的场景。您可以轻松地将教程中讨论的脚本定制为适合您的用例。我参考了这个article。
愉快编码 🙂