Python3 发送邮件
Python邮件发送核心要点:使用smtplib和email模块实现SMTP邮件发送功能。smtplib负责服务器连接(SMTP_SSL端口465),email.mime处理邮件内容(MIMEText/MIMEMultipart)。支持纯文本、HTML、带附件(二进制读取)和嵌入图片(需Content-ID对应)邮件。关键注意事项:使用授权码而非密码登录,统一utf-8编码避免乱码,邮件头部用He
·
一、核心基础
1. 核心模块与类
| 模块 / 类 | 作用描述 |
|---|---|
smtplib |
封装 SMTP 协议,提供服务器连接、登录、发送邮件功能(核心对象:SMTP/SMTP_SSL) |
email.mime.text.MIMEText |
构造邮件内容(支持纯文本plain、HTML 格式html) |
email.mime.multipart.MIMEMultipart |
构造混合类型邮件(带附件、HTML 嵌入图片,参数:related/ 默认) |
email.mime.image.MIMEImage |
处理邮件中嵌入的图片(需配合Content-ID引用) |
email.header.Header |
规范邮件头部(发件人、收件人、主题)的编码格式,避免中文乱码 |
2. 核心流程(固定模板)

3. 关键参数速记
| 参数类型 | 核心参数 | 示例值 |
|---|---|---|
| 服务器配置 | mail_host |
QQ:smtp.qq.com;网易:smtp.163.com |
mail_port |
SSL:465;非 SSL:25 | |
| 认证信息 | mail_user |
发送者邮箱账号(如123456@qq.com) |
mail_pass |
邮箱授权码(非登录密码!) | |
| 邮件内容 | sender |
发送者邮箱(同mail_user) |
receivers |
收件人列表(如["a@qq.com", "b@163.com"]) |
|
msg |
邮件对象(需用as_string()转换) |
二、分类实例总结
1. 纯文本邮件(最基础)
核心代码
# 构造邮件内容
msg = MIMEText("邮件正文", 'plain', 'utf-8')
# 服务器连接(QQ邮箱示例)
smtp_obj = smtplib.SMTP_SSL(mail_host, 465)
关键要点
subtype必须设为plain,编码统一用utf-8- 支持换行、特殊符号,无需额外排版
2. HTML 格式邮件(带排版 / 链接)
核心代码
html_content = "<h1 style='color:red'>HTML邮件</h1><a href='https://www.baidu.com'>百度</a>"
msg = MIMEText(html_content, 'html', 'utf-8')
关键要点
subtype设为html,内容支持所有 HTML 标签(表格、样式、超链接等)- 需注意 HTML 语法正确性,否则可能显示异常
3. 带附件邮件(单个 / 多个)
核心代码
# 1. 创建混合邮件对象
msg = MIMEMultipart()
# 2. 添加正文
msg.attach(MIMEText("带附件邮件", 'plain', 'utf-8'))
# 3. 添加附件
att = MIMEText(open("test.txt", 'rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
att["Content-Disposition"] = 'attachment; filename="test.txt"' # 附件显示名
msg.attach(att)
关键要点
- 必须用
MIMEMultipart对象,附件需通过attach方法绑定 - 支持任意文件类型(txt、图片、Excel 等),读取方式均为
rb(二进制)
4. HTML 嵌入图片(非附件)
核心代码
# 1. 创建related类型邮件对象
msg = MIMEMultipart('related')
# 2. HTML正文(通过cid引用图片)
html_content = "<img src='cid:image1'>"
msg.attach(MIMEText(html_content, 'html', 'utf-8'))
# 3. 嵌入图片
with open("test.png", 'rb') as f:
img = MIMEImage(f.read())
img.add_header('Content-ID', '<image1>') # 与cid一致
msg.attach(img)
关键要点
- 邮件对象类型必须为
MIMEMultipart('related') Content-ID需用<>包裹,与 HTML 中的cid严格对应
三、易错点与解决方案
| 常见问题 | 原因分析 | 解决方案 |
|---|---|---|
| 中文乱码 | 邮件头部未指定编码 | 用Header类包装:message['Subject'] = Header("主题", 'utf-8') |
| 连接失败(超时 / 拒绝) | 端口错误或 SMTP 服务未开启 | 1. SSL 用 465 端口,非 SSL 用 25;2. 开启邮箱 POP3/SMTP 服务 |
| 登录失败(认证错误) | 用了邮箱登录密码而非授权码 | 登录邮箱→设置→账户→生成授权码,替换mail_pass |
| 附件无法打开 / 乱码 | 未用二进制读取或编码错误 | 读取文件用rb模式,编码指定为utf-8 |
| 图片不显示(嵌入形式) | cid 与 Content-ID 不匹配或邮件对象类型错误 | 1. 确保cid:image1与<image1>一致;2. 用MIMEMultipart('related') |
四、实战技巧
-
配置项抽离:将服务器地址、账号、授权码单独封装为配置文件(如
config.py),便于维护和复用。# config.py MAIL_HOST = "smtp.qq.com" MAIL_PORT = 465 MAIL_USER = "123456@qq.com" MAIL_PASS = "abcdefghijklmnop" -
异常捕获优化:细化异常类型,便于定位问题。
try: # 发送逻辑 except smtplib.SMTPAuthenticationError: print("认证失败:请检查授权码是否正确") except smtplib.SMTPConnectError: print("连接失败:请检查服务器地址和端口") except FileNotFoundError: print("文件不存在:请检查附件路径") except Exception as e: print(f"其他错误:{str(e)}") -
多收件人 / 抄送:
receivers支持列表格式,抄送可通过添加Cc头部实现。receivers = ["a@qq.com", "b@163.com"] # 收件人 cc_list = ["c@qq.com"] # 抄送 message['Cc'] = Header(",".join(cc_list), 'utf-8') smtp_obj.sendmail(sender, receivers + cc_list, message.as_string()) # 发送时需合并列表
五、拓展应用
- 自动化邮件:结合定时任务(
schedule模块),实现每日 / 每周报表自动发送(如实验数据统计、日志汇总)。 - 日志告警:在程序异常时自动发送邮件告警(含错误信息、堆栈跟踪),便于及时排查问题。
- 批量邮件发送:结合 Excel 读取(
pandas模块),批量向收件人发送个性化邮件(如通知、报告)。
六、核心考点速记口诀
- 模块两核心:
smtplib连服务器,email造内容; - 授权码是关键,端口 465(SSL)记心间;
- 纯文本用
plain,HTML 用html,附件要靠MIMEMultipart; - 嵌入图片
related类型,cid对应Content-ID; - 中文乱码别发愁,
Header类来解烦忧。
更多推荐


所有评论(0)