使用Python的SMTP库发邮件,Windows版Outlook无法接收附件问题
问题:Windows版Outlook无法显示邮件附件,其他客户端正常
我正在为应用开发邮件系统,完成特定步骤后需发送带附件(PDF文件)的邮件。测试过的Linux Geary、移动端Outlook、网页版Outlook、基于Roundcube的自研邮件系统都能正常显示附件,但Windows版Outlook客户端接收后看不到附件。尝试更换.png、.jpg、.docx格式附件,问题依旧。
使用的代码如下:
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders import base64 FROM = "sender@mail.com" data = request.data['data'] base64_string = data['file'] base64_string = base64_string.split(',')[1] attachment_data = base64.b64decode(base64_string) PASS = "" SERVER = 'mail.ourhost.be' TO = "receiver@mail.com" msg = MIMEMultipart('alternative') msg['Subject'] = "subject" msg['From'] = FROM msg['To'] = TO html = f"""\ <html style="font-family: Heebo;"> my email content </html> """ part2 = MIMEText(html, 'html') msg.attach(part2) # Add the decoded attachment data to the email part = MIMEBase('application', 'pdf') part.set_payload((attachment_data)) encoders.encode_base64(part) filename = f'name.pdf' part.add_header('Content-Disposition', "attachment; filename= %s" % filename) msg.attach(part)
请问针对Windows版Outlook,有什么需要特别注意的地方吗?
解决方案
核心问题:Multipart类型错误
你使用了MIMEMultipart('alternative'),这个类型的设计目的是提供纯文本和HTML版本的替代内容(让邮件客户端选择显示哪一种),并不适合包含附件。大部分邮件客户端会兼容这种错误,但Windows版Outlook对MIME类型的合规性要求更严格,会忽略alternative类型容器中的附件。
修改方法:将Multipart类型改为mixed(这是带附件邮件的标准类型),直接使用无参数的MIMEMultipart()即可(默认就是mixed):
# 替换原有的msg初始化代码 msg = MIMEMultipart() # 或者显式写MIMEMultipart('mixed')
其他Windows Outlook注意事项
- 文件名编码:如果文件名包含非ASCII字符(比如中文、特殊符号),直接用字符串会导致Outlook显示乱码,建议用
email.header模块处理:from email.header import Header # 设置文件名时替换为 part.add_header('Content-Disposition', f'attachment; filename="{Header(filename, "utf-8").encode()}"') - Content-Type准确性:不同类型的附件要设置对应的MIME类型,比如:
- PNG图片:
MIMEBase('image', 'png') - Word文档:
MIMEBase('application', 'vnd.openxmlformats-officedocument.wordprocessingml.document')
- PNG图片:
- Content-Disposition格式:文件名用双引号包裹更稳妥,避免文件名包含空格等特殊字符时出现解析问题,比如
attachment; filename="name.pdf"而不是不带引号的写法。
内容的提问来源于stack exchange,提问作者Yorbjörn
相关产品推荐
相关产品推荐

