Python之email包语法、参数和实际应用案例
Python email 包完整使用指南(功能+安装+语法+8大案例+避坑指南)
Python 内置的email包是专门用于构建、解析、处理电子邮件的标准库,无需依赖第三方工具即可完成邮件的纯文本/HTML/附件/图片嵌入等所有邮件格式操作,是邮件开发的核心工具。
注意:
smtplib库(Python 内置)使用。
一、email 包核心功能总览
email包是 Python 标准库,无需额外安装,核心能力:
- 构建邮件:纯文本邮件、HTML 富文本邮件、带附件邮件、内嵌图片邮件
- 解析邮件:读取邮件内容、提取发件人/收件人/主题/附件/正文
- 编码处理:自动处理邮件标题、附件的中文编码(解决乱码)
- 格式兼容:支持标准 RFC 5322 邮件格式,兼容所有邮箱
核心子模块(必须掌握)
| 模块 | 作用 |
|---|---|
email.mime.text.MIMEText | 构建纯文本/HTML邮件正文 |
email.mime.multipart.MIMEMultipart | 构建复合邮件(正文+附件+图片) |
email.mime.image.MIMEImage | 构建内嵌图片邮件 |
email.mime.base.MIMEBase | 通用附件封装类 |
email.utils | 工具函数(格式化日期、解析邮箱地址) |
email.header | 处理邮件标题中文编码 |
二、安装说明
email是Python 内置标准库,Python 3.3+ 版本自带,直接导入使用即可:
# 直接导入,无需 pip 安装importemailfromemail.mime.textimportMIMEText✅ 验证:终端输入python -c "import email; print(email.__version__)"无报错即正常。
三、核心语法与参数详解
1. MIMEText(文本/HTML 邮件)
语法:
MIMEText(_text,_subtype='plain',_charset=None)参数:
_text:邮件正文内容(字符串)_subtype:邮件类型plain→ 纯文本邮件html→ HTML 富文本邮件
_charset:编码格式(必须设为 utf-8,解决中文乱码)
2. MIMEMultipart(复合邮件)
语法:
MIMEMultipart(_subtype='mixed',**kwargs)参数:
_subtype:复合类型mixed:默认值,包含附件+正文related:包含内嵌图片alternative:纯文本+HTML 兼容
核心方法:
attach(对象):将正文、附件、图片添加到邮件中
3. 邮件通用属性(所有邮件对象通用)
msg['From']='发件人昵称 <发件人邮箱>'# 发件人msg['To']='收件人1,收件人2'# 收件人(多个用逗号分隔)msg['Subject']='邮件标题'# 标题msg['Cc']='抄送人邮箱'# 抄送msg['Bcc']='密送人邮箱'# 密送四、8 个实际应用案例(可直接复制运行)
所有案例都配合smtplib实现构造+发送完整流程,以QQ邮箱为例(需开启 SMTP 服务)。
前置配置(所有案例通用)
importsmtplibfromemail.mime.textimportMIMETextfromemail.mime.multipartimportMIMEMultipart# 邮箱配置SMTP_SERVER='smtp.qq.com'# QQ邮箱SMTP服务器SMTP_PORT=465# SSL端口SENDER_EMAIL='你的QQ邮箱'SENDER_PASSWORD='邮箱授权码'# 非登录密码,需在邮箱开启SMTP获取案例1:发送纯文本邮件(最简单)
# 1. 构建纯文本邮件msg=MIMEText('这是一封Python自动发送的纯文本邮件','plain','utf-8')# 2. 设置邮件头信息msg['From']=SENDER_EMAIL msg['To']='收件人邮箱'msg['Subject']='纯文本邮件测试'# 3. 发送邮件withsmtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)asserver:server.login(SENDER_EMAIL,SENDER_PASSWORD)server.send_message(msg)print("纯文本邮件发送成功!")案例2:发送 HTML 富文本邮件(带样式/链接/表格)
# HTML 正文(支持样式、链接、表格、字体颜色)html_content=""" <h2 style="color:blue">Python HTML 邮件</h2> <p>这是<b>加粗</b>文字,<a href="https://www.baidu.com">点击跳转</a></p> <table border="1"> <tr><th>姓名</th><th>年龄</th></tr> <tr><td>张三</td><td>25</td></tr> </table> """# 构建HTML邮件msg=MIMEText(html_content,'html','utf-8')msg['From']=SENDER_EMAIL msg['To']='收件人邮箱'msg['Subject']='HTML富文本邮件'# 发送withsmtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)asserver:server.login(SENDER_EMAIL,SENDER_PASSWORD)server.send_message(msg)print("HTML邮件发送成功!")案例3:发送带附件的邮件(文档/图片/压缩包)
fromemail.mime.baseimportMIMEBasefromemailimportencodersimportos# 1. 创建复合邮件对象msg=MIMEMultipart()msg['From']=SENDER_EMAIL msg['To']='收件人邮箱'msg['Subject']='带附件的邮件'# 2. 添加正文body=MIMEText('这是带附件的邮件,请查收附件!','plain','utf-8')msg.attach(body)# 3. 添加附件(支持任意文件:txt/pdf/excel/zip/jpg 等)file_path='test.pdf'# 你的附件路径file_name=os.path.basename(file_path)# 读取并编码附件withopen(file_path,'rb')asf:mime=MIMEBase('application','octet-stream')mime.set_payload(f.read())encoders.encode_base64(mime)# 设置附件文件名(解决中文附件名乱码)mime.add_header('Content-Disposition','attachment',filename=file_name)msg.attach(mime)# 发送withsmtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)asserver:server.login(SENDER_EMAIL,SENDER_PASSWORD)server.send_message(msg)print("带附件邮件发送成功!")案例4:发送内嵌图片邮件(图片显示在正文,非附件)
fromemail.mime.imageimportMIMEImage# 1. 创建复合邮件(related 用于内嵌资源)msg=MIMEMultipart('related')msg['From']=SENDER_EMAIL msg['To']='收件人邮箱'msg['Subject']='内嵌图片邮件'# 2. HTML 正文(通过 cid:xxx 引用图片)html=""" <p>这是内嵌图片:</p> <img src="cid:my_image"> <!-- cid 必须和图片ID对应 --> """msg.attach(MIMEText(html,'html','utf-8'))# 3. 添加图片并设置IDwithopen('image.jpg','rb')asf:img=MIMEImage(f.read())img.add_header('Content-ID','<my_image>')# ID 对应 HTML 中的 cid:my_imagemsg.attach(img)# 发送withsmtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)asserver:server.login(SENDER_EMAIL,SENDER_PASSWORD)server.send_message(msg)print("内嵌图片邮件发送成功!")案例5:批量发送邮件(群发)
# 收件人列表receiver_list=['user1@qq.com','user2@163.com','user3@gmail.com']# 构建邮件msg=MIMEText('批量发送测试邮件','plain','utf-8')msg['From']=SENDER_EMAIL msg['To']=', '.join(receiver_list)# 多个收件人用逗号拼接msg['Subject']='Python批量邮件'# 发送withsmtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)asserver:server.login(SENDER_EMAIL,SENDER_PASSWORD)server.sendmail(SENDER_EMAIL,receiver_list,msg.as_string())print(f"批量发送给{len(receiver_list)}人成功!")案例6:发送带抄送/密送的邮件
msg=MIMEText('抄送+密送测试邮件','plain','utf-8')msg['From']=SENDER_EMAIL msg['To']='主收件人邮箱'msg['Cc']='抄送人1@qq.com,抄送人2@163.com'# 抄送(可见)msg['Bcc']='密送人@gmail.com'# 密送(不可见)msg['Subject']='带抄送密送的邮件'# 发送(必须包含所有收件人:主送+抄送+密送)all_receivers=[msg['To'],msg['Cc'],msg['Bcc']]withsmtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)asserver:server.login(SENDER_EMAIL,SENDER_PASSWORD)server.sendmail(SENDER_EMAIL,all_receivers,msg.as_string())print("带抄送密送邮件发送成功!")案例7:解析本地邮件文件(.eml)
# 读取本地 eml 邮件文件并解析withopen('email.eml','r',encoding='utf-8')asf:importemail msg=email.message_from_file(f)# 提取邮件信息print('发件人:',msg.get('From'))print('收件人:',msg.get('To'))print('主题:',msg.get('Subject'))# 提取正文forpartinmsg.walk():ifpart.get_content_type()=='text/plain':print('正文:',part.get_payload(decode=True).decode('utf-8'))案例8:自动提取邮件附件并保存
importemailimportos# 解析 eml 文件并保存附件withopen('email.eml','rb')asf:msg=email.message_from_bytes(f.read())# 遍历邮件内容forpartinmsg.walk():# 跳过正文,只处理附件ifpart.get_content_maintype()=='multipart':continueifpart.get('Content-Disposition')isNone:continue# 获取附件名并保存filename=part.get_filename()iffilename:withopen(filename,'wb')asf:f.write(part.get_payload(decode=True))print(f"附件{filename}保存成功!")五、常见错误与解决方案
1. 中文乱码(标题/正文/附件)
原因:未设置utf-8编码
解决:
- 构建
MIMEText时必须加_charset='utf-8' - 附件名用
filename=filename直接赋值(Python3 自动编码)
2. SMTP 认证失败(登录错误)
原因:用了邮箱登录密码,而非授权码
解决:
- QQ/163/网易邮箱必须开启 SMTP 服务,使用授权码登录
3. 发送失败:550/554 错误
原因:邮件被判定为垃圾邮件
解决:
- 标题不要用「测试」「广告」等敏感词
- 不要短时间高频发送
- 发件人添加昵称
4. 附件无法打开
原因:附件读取模式错误
解决:附件必须用rb(二进制只读)模式读取
5. 内嵌图片不显示
原因:Content-ID格式错误
解决:HTML 中用cid:xxx,图片头必须加<>:Content-ID: <xxx>
六、使用注意事项(避坑必看)
区分 email 和 smtplib
email:造邮件(内容、格式、附件)smtplib:发邮件(连接服务器、发送)
必须使用授权码,而非登录密码
所有主流邮箱(QQ、163、Gmail、企业邮箱)都要求 SMTP 用授权码登录。端口与协议
- SSL 加密:端口
465(推荐,smtplib.SMTP_SSL) - 非加密:端口
25(不推荐,易被拦截)
- SSL 加密:端口
群发限制
个人邮箱有群发限制(QQ 邮箱单次最多 50 人),大量发送需用企业邮箱/邮件服务。编码统一
全程使用utf-8,彻底避免中文乱码。异常处理
正式代码必须加try-except捕获发送异常:try:server.send_message(msg)exceptExceptionase:print(f"发送失败:{e}")
总结
email是 Python内置标准库,专注邮件构造/解析,发送靠smtplib- 核心类:
MIMEText(文本)、MIMEMultipart(复合/附件)、MIMEImage(图片) - 8 大案例覆盖纯文本、HTML、附件、内嵌图片、群发、抄送、解析、提取附件
- 避坑核心:用授权码、设 utf-8、正确处理附件二进制、规范邮件头
《动手学PyTorch建模与应用:从深度学习到大模型》是一本从零基础上手深度学习和大模型的PyTorch实战指南。全书共11章,前6章涵盖深度学习基础,包括张量运算、神经网络原理、数据预处理及卷积神经网络等;后5章进阶探讨图像、文本、音频建模技术,并结合Transformer架构解析大语言模型的开发实践。书中通过房价预测、图像分类等案例讲解模型构建方法,每章附有动手练习题,帮助读者巩固实战能力。内容兼顾数学原理与工程实现,适配PyTorch框架最新技术发展趋势。
