Python smtplib发信时M365域内收件人HTML附件损坏问题求助
问题原因
- 核心原因是公司域下的M365 Exchange Online对域内传递的邮件有默认的安全扫描和内容净化规则:会自动识别附件内容类型,只要检测到是HTML文件,就会自动移除其判定为可疑的内容(包括嵌入式脚本、base64编码的内联资源、外部资源引用、可疑的CSS样式等),如果被移除的内容占比过高,就会导致HTML文件结构损坏、大小缩水,打开为空白页。
- 发往外部收件人的邮件不会触发域内专属的内容净化策略,因此附件可以正常保留完整内容。
- 修改MIME类型不生效的原因是Exchange不会仅通过MIME类型判定文件格式,会对附件二进制内容做实际的格式识别,只要解析出是HTML结构就会触发处理逻辑。
可行解决方案
- 方案1:将HTML文件打包为ZIP/RAR等压缩格式后作为附件发送。压缩包不会被Exchange的HTML净化规则识别,可完整保留原文件内容,收件人解压后即可正常打开,改造成本最低。
- 方案2:联系公司Exchange管理员,将发信账号/发信服务IP加入安全白名单,跳过对应邮件的HTML附件内容净化策略,适合企业内部固定业务场景长期使用。
- 方案3:将业务报告从HTML格式转换为PDF格式后发送。PDF不会触发HTML专属的内容清理规则,且兼容性更好,适合需要直接预览附件的场景。
- 方案4:如果必须发送原生HTML附件,可尝试显式指定附件的base64编码,代码修改参考:
import email.encoders fsubtype = ftype.split('/')[1] ftype = ftype.split('/')[0] with open(file, mode='rb') as fh: content = fh.read() msg.add_attachment(content, maintype=ftype, subtype=fsubtype, filename=fname, encoder=email.encoders.encode_base64)
强制base64编码可以降低Exchange内容识别的概率,部分场景下可绕过轻量的内容扫描规则。
内容的提问来源于stack exchange,提问作者chrisxfire
相关产品推荐
相关产品推荐

