还记得第一次写邮件是什么时候吗? 也许是小时候用QQ邮箱给同学写过一封"秘密小纸条",也许是刚参加工作时,用Outlook给领导发了一份认真的周报。
无论是哪一种场景,邮件在我们生活和工作中都不可或缺。但你有没有想过,有一天,你可以不用手点开邮箱,一封一封地写,而是用几行Python代码,就能自动完成?
是的,这就是我要分享的主题:用Python自动化发送邮件 。 而实现这一切的关键,就是两个Python的内置库:smtplib 和 email。
今天,我们就从零开始,把它们拆开来讲,带你走一遍"从入门到进阶"的完整流程。不管你是编程小白,还是已经在写脚本的开发者,这篇文章都会让你收获满满。

一、为什么要学会用Python发邮件?
先聊聊场景。 想象一下这些情况:
- 你是一个数据分析师,每天需要把当天的分析报表发给老板。手动发很麻烦,忘记一次还可能挨批评。
- 你是一个开发者,系统运行出错时需要自动通知相关人员。如果能让程序自己发邮件提醒,是不是省心又高效?
- 你是一个交易爱好者,想每天收盘后收到一封"今日行情总结"的自动推送。
这些事情,完全可以交给Python来搞定。 说白了,Python的邮件自动化 = 省时、省力、省心。
而且最重要的是,这项技能你一旦掌握,就能用在无数场景中。
二、认识主角:smtplib 和 email
我们先别急着上手敲代码,先搞明白两个主角分别干啥。
- smtplib:它就像是一个邮递员,负责把你写好的信(邮件)送到对方邮箱。SMTP 的全称是"简单邮件传输协议",几乎所有的邮件都是通过它来投递的。
- email:它是一个写信工具,帮你把邮件的内容组装好。不管是纯文本、HTML,还是附件,都可以用它来构造。
一个管送,一个管写。它俩搭配起来,就能把整个流程打通。
三、准备工作:邮箱设置
要让Python帮你发邮件,第一步不是写代码,而是要让你的邮箱"开门迎客"。
大部分邮箱默认是不允许外部程序直接登录的,你需要先开启 SMTP 服务。 以126邮箱为例,操作步骤大概是这样:
- 登录邮箱 → 找到 设置 → 找到 SMTP/POP3服务。
- 点击开启SMTP服务(有些平台会要求你手机验证码验证)。
- 验证完成后,系统会给你一个 授权码。注意,这个授权码非常重要,它相当于是你用程序登录邮箱的密码,一定要妥善保存。
- 记下邮箱的 SMTP服务器地址 。比如126邮箱的是
smtp.126.com
,QQ邮箱的是smtp.qq.com
。
完成这一步,你的邮箱就算"开锁"了,可以用来写代码了。
四、第一封自动化邮件:从零到一
下面我们写一段最简单的代码:
python
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# 设置邮件内容
msg = MIMEMultipart()
msg['From'] = '你的邮箱@126.com' # 发件人邮箱
msg['To'] = '收件人的邮箱@qq.com' # 收件人邮箱
msg['Subject'] = 'Python邮件测试' # 邮件标题
# 邮件正文
body = '你好!这是一封通过Python发送的邮件。'
msg.attach(MIMEText(body, 'plain')) # 将正文内容添加到邮件中
# 设置SMTP服务器并发送邮件
try:
# 连接SMTP服务器,指定服务器地址和端口
server = smtplib.SMTP('smtp.126.com') # 根据邮箱提供商修改SMTP地址
server.starttls() # 启用TLS加密
server.login('你的邮箱@126.com', '邮箱密码或者授权登录码') # 登录邮箱
text = msg.as_string() # 将MIME消息转换为字符串
server.sendmail(msg['From'], msg['To'], text) # 发送邮件
print('邮件发送成功!')
except Exception as e:
print(f'邮件发送失败: {e}')
finally:
server.quit() # 退出SMTP服务器
运行之后,如果设置没问题,你会在收件人的邮箱里看到一封"Python邮件测试"。 那一刻,成就感满满。🎉
五、进阶玩法:不止是纯文本
如果只会发纯文本邮件,未免有点太单调了。邮件其实还可以很"花哨":
1. 发送HTML格式的邮件
比如你想发一封带有排版、颜色甚至图片的邮件,可以这样写:
css
html_content = """
<html>
<body>
<h1 style="color: blue;">你好!这是通过Python发送的HTML邮件!</h1>
<p>这封邮件展示了如何发送HTML格式的邮件内容。</p>
</body>
</html>
"""
msg.attach(MIMEText(html_content, 'html')) # 将HTML内容添加到邮件正文
收件人打开之后,会看到蓝色的标题和排版整齐的正文,比纯文本好多了。
2. 给邮件加上附件
再进一步,如果你需要把报表、图片、文档发给别人,可以添加附件:
python
from email.mime.base import MIMEBase
from email import encoders
# 附件路径
filename = "example.txt"
# 打开文件并添加到邮件
with open(filename, "rb") as attachment:
part = MIMEBase('application', 'octet-stream')
part.set_payload(attachment.read()) # 读取文件内容
encoders.encode_base64(part) # 对附件进行Base64编码
part.add_header('Content-Disposition', f'attachment; filename="{filename}"') # 设置附件名称
msg.attach(part) # 将附件添加到邮件
运行后,收件人就能在邮件里下载 example.txt
这个附件。是不是很实用?
六、常见的坑与解决办法
写到这里,你可能跃跃欲试,但在实际使用中,大家经常会遇到一些小坑:
-
登录失败 明明账号密码没错,却提示"用户名或密码错误"。 👉 这通常是因为你没用授权码,而是直接用邮箱密码。记住:程序登录必须用授权码!
-
554 5.7.1 错误 这是邮件服务商把你的邮件认定为垃圾邮件。 👉 解决方法:
- 邮件标题和正文写得正常一点,避免"中奖、优惠、秒杀"之类的敏感词。
- 不要一次性群发太多邮件。
-
端口问题
- 使用TLS加密一般是
587
端口; - 使用SSL加密一般是
465
端口。 如果收不到邮件,试试换端口。
- 使用TLS加密一般是
七、实战场景:把邮件融入到你的工作流
学了这些基础之后,真正的价值在于把它应用到实战场景中。比如:
- 定时日报 配合
schedule
或cron
定时任务,每天自动生成报表并发给团队。 - 监控告警 系统出错、服务器宕机时,自动发邮件通知相关人员。
- 个人效率工具 写个脚本,把待办事项、日程提醒发到自己邮箱里。
想象一下,当你睡觉的时候,Python帮你发完了所有的日报和提醒,是不是一种"解放双手"的快感?
八、总结
今天我们从最基础的概念讲起,一步步演示了如何用Python的 smtplib 和 email 库发送邮件。 内容涵盖:
- 如何开启邮箱的SMTP服务并获取授权码;
- 发送第一封纯文本邮件;
- 扩展玩法:HTML邮件、带附件的邮件;
- 常见问题与解决方案;
- 实战场景应用。
你会发现,这项技能其实并不复杂,但实用性极强。 当别人还在手动一封封发邮件时,你的Python脚本已经帮你自动搞定,这就是所谓的"用技术偷懒"。
如果你正打算提升工作效率,或者给项目加点"智能感",试试用Python发一封属于自己的自动化邮件吧。 也许,就从今天开始,你会对"发邮件"这件小事,重新产生敬畏和喜爱。