使用Python编写自动化邮件发送脚本
手动发送大量邮件是一项重复且耗时的任务。为了提高效率,我们可以借助第三方服务来批量发送电子邮件。但是,我们是否能创建自己的定制脚本来实现这一目标呢?
答案是肯定的!利用Python,我们可以轻松编写脚本来发送邮件。Python内置了一个名为smtplib
的库,它基于简单邮件传输协议(SMTP),专门用于发送电子邮件。
配置Gmail邮箱
本例中,我们将使用Gmail作为邮件服务提供商。由于谷歌出于安全考虑,默认不允许脚本直接登录账户,因此我们需要调整Gmail账户的安全设置,以允许脚本登录。但这样做会降低账户安全性,因此建议创建一个新的Gmail账户专门用于发送邮件。您可以通过访问这里 来启用“允许安全性较低的应用”选项。
如果您不希望启用此选项,也可以使用Google API进行身份验证。您可以在这里找到使用Google API进行身份验证的Python脚本示例。
发送邮件的步骤
使用smtplib
库发送邮件需要经过几个步骤。让我们先了解这些步骤,然后再开始编写代码。
#1. 连接到SMTP服务器
每个邮件服务提供商都有不同的SMTP服务器域名和端口。我们需要使用邮件服务提供商提供的SMTP服务器域名和端口号。例如,Gmail的SMTP服务器域名是smtp.gmail.com
,端口号是465
。
为了提高安全性,我们建议使用SSL加密方式连接SMTP服务器。如果要使用TLS加密,则需要使用端口号587
。请注意,SMTP服务器域名会因邮件服务提供商的不同而有所差异。
以下是连接SMTP服务器的代码示例:
server = smtplib.SMTP_SSL(smtp_server_domain_name, port, context=ssl_context)
#2. 登录
成功连接到SMTP服务器后,我们可以使用邮件地址和密码通过login
方法登录。 代码如下:
server.login(sender_email, password)
#3. 发送邮件
登录后,我们就可以使用sendmail
方法发送邮件。发送邮件时,需要确保邮件格式正确。基本的邮件格式为:
主题:您的邮件主题\n邮件内容
请注意,空格并非必需,仅用于区分格式。以下是发送邮件的示例代码:
server.sendmail(sender_mail, email, f"Subject: {subject}n{content}")
#4. 退出
不要忘记在使用完SMTP服务器后调用quit
方法退出。
以上是使用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
方法用于发送邮件。将所有步骤封装在一个类中可以提高代码的可读性。上述代码已经实现了发送邮件的所有基本功能。
恭喜!您已经成功地使用Python脚本发送了邮件。
发送HTML格式邮件
如果需要发送HTML格式的邮件,应该如何操作?答案是肯定的!我们可以使用email.mime
库来发送HTML格式的邮件。这是一个Python的内置库。
MIME是一种用于扩展电子邮件格式以支持应用程序、视频、图像等内容的标准。
我们需要用到email.mime
模块中的两个类:MIMEText
和MIMEMultipart
。下面分别简要介绍一下这两个类。
#1. MIMEText
MIMEText
类用于编写HTML格式的邮件内容。我们可以通过传递HTML内容和内容类型来创建MIMEText
类的实例。代码示例如下:
html_content = MIMEText(html_template, 'html')
考虑到有些邮件服务可能不支持HTML渲染,最好为纯文本和HTML内容分别创建MIMEText
的实例。
#2. MIMEMultipart
MIMEMultipart
类用于简化邮件的格式化,例如编写主题、发件人地址和收件人地址等。我们可以使用attach
方法将MIMEText
类创建的内容添加到MIMEMultipart
实例中。
请确保使用alternative
参数创建MIMEMultipart
的实例,以便可以呈现纯文本或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'] = 'techblik.com Celebrations' mail['From'] = self.sender_mail mail['To'] = email text_template = """ techblik.com Hi {0}, We are delighted announce that our website hits 10 Million views this month. """ html_template = """ <h1>techblik.com</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
属性来添加密送抄送。
添加附件
邮件附件可以是图片、PDF文档、Word文档或Excel表格等。要添加附件,我们需要用到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 = "techblik.com-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(emails)
使用上述字符串替换脚本中的To
字段即可实现群发邮件的功能。
总结
除了smtplib
库之外,还有一些第三方库可以帮助我们更便捷地使用Python发送邮件,例如Envelopes、yagmail和flanker等。这些库通常可以用更少的代码实现邮件发送的功能,您可以尝试探索这些库。
现在,您可以使用Python脚本自动化您的邮件发送流程了。邮件发送的具体结构会根据您的实际应用场景而有所不同。本教程介绍了各种发送邮件的场景,您可以根据自己的需要轻松定制文中的代码。这篇文章中提及的知识参考了这篇文章。
祝您编程愉快!🙂