Python发送邮件需配置SMTP参数、认证及内容格式,支持纯文本、HTML和带附件邮件,关键注意授权码、UTF-8编码和附件Content-Disposition头。

用Python发送邮件其实不难,关键是配置好SMTP服务器参数、处理好认证和内容格式。只要搞懂几个核心步骤,发文本、带附件、甚至HTML邮件都能轻松搞定。
准备SMTP服务器信息
发邮件前得知道用哪家邮箱服务商的SMTP地址和端口。常见几家:
- QQ邮箱:SMTP服务器 smtp.qq.com,端口一般用 587(TLS)或 465(SSL)
- 163邮箱:SMTP服务器 smtp.163.com,端口 25 或 465
- Gmail:SMTP服务器 smtp.gmail.com,端口 587(需开启两步验证并生成应用专用密码)
注意:不能直接用登录密码,QQ/163等需要在邮箱设置里开启“SMTP服务”,并获取授权码(不是账号密码)。
发送纯文本邮件
最基础的场景,适合通知、日志提醒等。用内置的 smtplib 和 email 模块即可:
立即学习“Python免费学习笔记(深入)”;
- 构建 MIMEText 对象,指定内容和类型(
'plain') - 设置发件人、收件人、主题(都写在 msg['From'] 等字段里)
- 连接SMTP服务器,登录,调用 send_message() 发送
小提示:收件人如果是多个,send_message() 自动处理,但 sendmail() 需传入列表,别混用。
发送带附件的邮件
用 MIMEMultipart('mixed') 作为外层容器,把文本内容和附件分别封装进去:
- 正文部分用 MIMEText 创建,再 attach() 进去
- 附件先读取为二进制,用 MIMEApplication 或 MIMEBase 包装,设好文件名和MIME类型
- 关键:给附件加 Content-Disposition 头,否则可能变成内联内容
常见问题:中文路径报错?先用 open(..., 'rb') 读取,别用字符串路径直接传;文件太大?SMTP通常限制单封邮件10MB以内。
发送HTML格式邮件
想让邮件看起来更正式或带简单样式?把内容类型改成 'html' 即可:
- MIMEText(html_content, 'html', 'utf-8') —— 编码必须显式指定为 utf-8,否则中文会乱码
- 支持内联CSS,但尽量别用外部样式表或JavaScript(多数邮箱客户端会过滤)
- 如果既要HTML版又要纯文本备用,可用 MIMEMultipart('alternative') 把两个版本一起 attach
实测建议:用 font-family: "Microsoft YaHei", sans-serif; 兼容性较好;图片尽量用在线URL,避免嵌入base64(加载慢且部分客户端屏蔽)。
SMTP发信的核心就这几步:连服务器、登账号、组消息、发出去。不复杂但容易忽略授权码、编码、附件头这些细节。动手试一次,比看十篇教程都管用。










