使用Office 365与Flask-Mail发邮件遇winmail.dat问题,求HTML格式配置
嘿,这个问题我之前帮人排查过,winmail.dat本质是Outlook生成的TNEF(传输中性封装格式)文件,一般是因为邮件被当成了富文本格式发送导致的。要改成HTML格式正常发送,你得从Flask-Mail的配置和发送代码两方面调整,具体步骤如下:
一、调整Flask-Mail的核心配置
首先得确保你的邮件配置明确指定了正确的内容类型,同时禁用可能触发TNEF的设置:
- 强制设置邮件默认内容类型为HTML:在Flask配置里添加
MAIL_DEFAULT_SENDER(Office365要求必须验证发件人,这个是必填项),然后设置MAIL_CONTENT_TYPE = 'html',这样默认发送的邮件就是HTML格式。 - 配置Office365的SMTP参数,一定要准确:
划重点:如果你的Office365开启了多因素认证(MFA),一定要用应用专用密码,不能用普通的登录密码,否则会认证失败。app.config['MAIL_SERVER'] = 'smtp.office365.com' app.config['MAIL_PORT'] = 587 app.config['MAIL_USE_TLS'] = True app.config['MAIL_USE_SSL'] = False app.config['MAIL_USERNAME'] = '你的Office365邮箱地址' app.config['MAIL_PASSWORD'] = '你的邮箱密码或应用专用密码' app.config['MAIL_DEFAULT_SENDER'] = ('自定义显示名称', '你的Office365邮箱地址') app.config['MAIL_CONTENT_TYPE'] = 'html'
二、修改邮件发送代码,明确指定HTML内容
就算配置了默认类型,发送时也得明确指定HTML内容,避免Flask-Mail自动 fallback到纯文本或富文本:
- 使用
msg.html属性来设置HTML内容,同时可以搭配msg.body设置纯文本降级内容(兼容不支持HTML的邮件客户端,可选但建议加上):from flask import Flask from flask_mail import Mail, Message app = Flask(__name__) # 把上面的配置代码放在这里 mail = Mail(app) def send_html_email(): # 创建邮件对象 msg = Message( 'HTML格式邮件测试', recipients=['收件人邮箱@example.com'] ) # 纯文本降级内容(当收件人客户端不支持HTML时显示) msg.body = '如果看不到HTML内容,请切换到支持HTML的邮件客户端查看' # 核心HTML内容,支持所有HTML标签 msg.html = ''' <h1>这是HTML邮件的标题</h1> <p>这里是邮件正文,支持<b>加粗</b>、<i>斜体</i>、<a href="#">链接</a>等格式</p> <img src="https://example.com/your-image.jpg" alt="示例图片"> ''' # 发送邮件 mail.send(msg) - 另外,添加附件时尽量用通用格式(比如PDF、JPG等),避免使用Outlook专属的文件类型,防止触发TNEF封装。
三、额外排查点(如果还是出现winmail.dat)
要是配置和代码都改了还是有问题,可能是Office365端的设置在搞鬼:
- 登录你的Office365邮箱,进入设置页面,找到「邮件」→「撰写和回复」,确保默认发送格式设置为「HTML」,而不是「富文本」或「纯文本」。
- 检查是否有自动邮件规则强制转换了发送格式,比如某些规则会把 outgoing邮件改成富文本,把这类规则暂时禁用试试。
内容的提问来源于stack exchange,提问作者fouad09
相关产品推荐
相关产品推荐

