Python3使用smtplib实现定时发送邮件功能
本文介绍如何利用Python3标准库smtplib和email模块实现邮件发送功能。内容涵盖基础纯文本邮件的构造与发送,以及包含附件的复杂邮件处理。以126邮箱为例,详细解析SMTP服务器配置、登录认证(含授权码使用)及sendmail方法调用。最后结合crontab工具,实现核心指标的定期自动发送,解决报表展示不便的问题。
此前业务方调整了部分核心指标的统计维度,要求更细致的拆分并定期输出结果。由于某些原因,这部分数据不适合直接展示在报表中,因此决定通过邮件方式定期向业务方发送相关数据。
最初尝试使用Linux系统自带的mail命令,但随后服务器邮件服务出现故障,导致脚本无法运行。为此,将脚本迁移至本地环境,并计划使用Python3中的smtplib模块结合crontab定时任务来执行发送操作。
首先,导入Python3标准库中的smtplib和email模块,用于构建和发送电子邮件。
import smtplib from email.mime.text import MIMEText from email.header import Header
接下来,配置邮件的具体内容。
message = MIMEText('邮件测试', 'plain', 'utf-8')
message['From'] = 'qixizhuang@126.com'
message['To'] = 'qixizhuang@126.com,751718003@qq.com'
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
一封完整的邮件需包含主题(subject)、正文、发件人及收件人信息。
使用message = MIMEText('邮件测试', 'plain', 'utf-8')设置邮件正文。MIMEText函数的三个参数分别代表:邮件正文内容、文本格式(此处为纯文本plain)以及文本编码(此处为utf-8)。
通过message['From'] = 'qixizhuang@126.com'设置发件人显示信息。
通过message['To'] ='qixizhuang@126.com,751718003@qq.com'设置收件人列表。若需发送给多个收件人,只需使用英文逗号分隔邮箱地址即可。
通过message['Subject'] = Header(subject, 'utf-8')设置邮件主题,确保主题支持UTF-8编码。

本次示例以网易126邮箱为例,需配置相应的服务器地址及账号信息。
sender = 'qixizhuang@126.com' receivers = ['qixizhuang@126.com', '751718003@qq.com'] mail_host = 'smtp.126.com' mail_user = 'qixizhuang@126.com' mail_pass = '********'
需要明确配置服务器地址、邮箱账号、密码,以及发件人和收件人的具体信息。
- 变量sender = 'qixizhuang@126.com'用于配置实际发送邮箱。需注意,此处的sender与message['From']含义不同:message中的信息仅在邮箱客户端界面显示,而此处变量是调用sendmail方法时必需的参数。因此,变量名并非固定,也可直接在sendmail中传入邮箱地址字符串。
- 变量receivers = ['qixizhuang@126.com', '751718003@qq.com']用于配置收件人列表。若仅有一个收件人,可直接使用字符串赋值;若有多个收件人,sendmail方法要求接收列表形式。同样,此处的含义与message['To']不同,变量名可灵活调整。
- 变量mail_host、mail_user、mail_pass分别用于设置邮件发送服务器地址、登录账号及密码。与前述变量类似,这些变量名不具强制性,若不使用变量,直接在sendmail中传入对应字符串亦可。
最后,调用smtplib模块完成邮件发送流程。
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
print("邮件发送成功!")
except smtplib.SMTPException:
print("邮件发送失败!")
- 通过smtpObj = smtplib.SMTP()创建SMTP对象,随后执行smtpObj.connect(mail_host, 25)连接服务器,端口号为25。也可简化为smtpObj = smtplib.SMTP(mail_host, 25)直接构建并连接对象。
- 使用smtpObj.login(mail_user,mail_pass)进行邮箱登录。需注意,mail_pass不一定直接对应邮箱密码。许多邮箱服务商(如网易邮箱)提供授权码功能,若已开启该功能,此处应填写授权码而非原始登录密码。
- 执行smtpObj.sendmail(sender, receivers, message.as_string()),利用SMTP对象的sendmail方法正式发送邮件。
至此,已完成一个基础邮件发送案例的实现。
在实际场景中,常需为邮件添加附件。此时,需先创建MIMEMultipart()实例,构造一个或多个附件对象,最后通过smtplib发送。完整示例代码如下:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
# 配置邮箱账户及收发人信息
sender = 'qixizhuang@126.com'
receivers = ['qixizhuang@126.com', '751718003@qq.com']
mail_host = 'smtp.126.com'
mail_user = 'qixizhuang@126.com'
mail_pass = 'password or authorization code here'
# 构建MIMEMultipart对象,并在其中添加邮件内容信息
message = MIMEMultipart()
message.attach(MIMEText('邮件测试', 'plain', 'utf-8'))
message['From'] = 'qixizhuang@126.com'
message['To'] = 'qixizhuang@126.com,751718003@qq.com'
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
# 构建附件内容
attr = MIMEText(open('./test.txt', 'r').read())
attr['Content-Type'] = 'application/octet-stream'
attr['Content-Disposition'] = 'attachment; filename = ' + 'test.txt'
message.attach(attr)
# 发送邮件
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
print("邮件发送成功!")
except smtplib.SMTPException:
print("邮件发送失败!")
至此,已实现带附件的邮件发送功能。后续可借助crontab等工具配置定时任务,自动执行发送脚本。关于crontab的具体用法,读者可自行查阅相关文档。
以上为本文全部内容,希望对读者有所帮助,欢迎支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









