Python3使用smtplib实现定时发送邮件功能

Mia
Mia
发布时间:2026-10-13| 5人浏览过
原创

本文介绍如何利用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的具体用法,读者可自行查阅相关文档。

以上为本文全部内容,希望对读者有所帮助,欢迎支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。