Python使用MIMEMultipart发送邮件无法正确附加PDF文件求助
Python构造邮件附加PDF文件的解决方案
错误根因
- 第一个报错的核心问题是
MIMEText仅用于处理文本类内容,初始化时会自动对输入内容执行编码操作,你用rb模式读取PDF得到的是二进制bytes对象,不存在encode方法,因此触发属性错误。 - 第二个PDF损坏的原因是PDF属于二进制格式文件,用文本模式
r读取时会强制按文本编码规则解码二进制数据,errors='ignore'会直接丢弃所有无法解码的字节,最终写入附件的内容和原文件完全不符,无法正常打开。
正确实现方案
处理二进制附件请使用MIMEApplication类,不要用MIMEText,完整实现代码如下:
# 导入依赖 from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication # 初始化邮件对象 msg = MIMEMultipart() # 此处可自行添加邮件主题、发件人、收件人、正文等常规配置 # 处理PDF附件 with open("out.pdf", "rb") as f: pdf_attachment = MIMEApplication(f.read(), _subtype="pdf") # 设置附件属性,filename为收件人端显示的文件名 pdf_attachment.add_header("Content-Disposition", "attachment", filename="out.pdf") # 将附件添加到邮件中 msg.attach(pdf_attachment)
如果你使用的是Python 3.3之前的旧版本,可使用MIMEBase兼容实现:
from email.mime.base import MIMEBase from email import encoders msg = MIMEMultipart() # 常规邮件配置略 with open("out.pdf", "rb") as f: pdf_attachment = MIMEBase("application", "pdf") pdf_attachment.set_payload(f.read()) # 对二进制内容做base64编码适配邮件传输 encoders.encode_base64(pdf_attachment) pdf_attachment.add_header("Content-Disposition", "attachment", filename="out.pdf") msg.attach(pdf_attachment)
内容的提问来源于stack exchange,提问作者Jerud
相关产品推荐
相关产品推荐

