Python SMTP 邮件发送入门到进阶
SMTP(Simple Mail Transfer Protocol)是互联网上最基础的邮件发送标准协议,不管是个人邮箱、企业邮箱还是服务端告警系统,底层发送逻辑几乎都绕不开它。
Python 内置了两个核心模块无缝对接:
email:负责组装“长什么样的邮件”,处理文本、HTML、附件、图片嵌入、邮件头等所有内容smtplib:负责把组装好的邮件“送出去”,建立SMTP连接、登录、传输
1. 准备工作:确认你的邮箱支持SMTP
在写代码前,必须先搞定邮箱的SMTP配置:
- 开启SMTP服务:登录邮箱后台(如QQ邮箱、163、Gmail),在“设置-账户-IMAP/SMTP/POP3”里开启
- 获取授权码:大部分第三方SMTP客户端(包括我们的Python脚本)不能直接用登录密码,必须用邮箱单独生成的「授权码」「应用专用密码」
- 记录SMTP信息:找服务商给的SMTP服务器地址、端口(明文/TLS/SSL各有不同)
2. 第一封:纯文本邮件
2.1 组装邮件内容
用 email.mime.text.MIMEText 就行,这是最基础的MIME(多用途互联网邮件扩展)类型:
2.2 建立连接并发送
用 smtplib.SMTP 建立明文连接(默认25端口),调试模式开1可以看详细的协议交互过程:
3. 邮件不够友好?补全邮件头
上面的邮件发出去后,收件人可能只会看到一串邮箱地址,没有主题、没有发件/收件昵称,得用 email.header.Header 和 email.utils.formataddr 完善:
4. 进阶场景:各种邮件类型
4.1 HTML邮件
只需要把 MIMEText 的第二个参数改成 'html':
4.2 带附件的邮件
需要用 MIMEMultipart 创建一个“容器”,先放正文,再把附件“挂”上去:
4.3 HTML中嵌入本地图片
普通HTML用的是网络图片链接,本地图片需要用 Content-ID(cid)绑定:
4.4 同时支持HTML和纯文本
有些邮箱客户端不支持HTML(或者用户关闭了自动加载HTML),需要用 MIMEMultipart('alternative'),纯文本在前,HTML在后,客户端会自动选能显示的:
5. 安全优先:加密SMTP连接
默认的25端口是明文传输,容易被截获授权码和内容,现在几乎所有邮箱都强制要求加密,有两种方式:
5.1 STARTTLS加密
先用明文连接,握手成功后升级为TLS加密,常用端口587:
5.2 SSL/TLS直连
一开始就建立加密连接,常用端口465:
6. 避坑指南与最佳实践
- 不要硬编码敏感信息:授权码、邮箱可以用环境变量、配置文件(.env/.ini)或密钥管理服务
- 异常处理不能少:网络波动、认证失败、附件过大都会导致报错
- 注意编码:所有邮件内容、头部都用utf-8,避免乱码
- 收件人是列表:
sendmail的第二个参数必须是可迭代对象(比如列表、元组),即使只有一个收件人 - 控制附件大小:大部分个人/免费邮箱限制在10-50MB,大文件建议传云盘发链接
带异常处理的完整示例
7. 简单梳理:email模块的对象关系
了解这个可以帮你更好地选择组装方式:
通过这篇教程,你应该可以快速实现从简单到复杂的邮件发送功能了!根据实际需求选择合适的容器、加密方式,再加上异常处理,就能写出稳定可用的脚本。

