You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Heroku上Flask应用flask-mail生成的Message-ID遭Google修正及投递问题排查

嘿,这个问题我之前帮好几个部署在Heroku上的Flask开发者排查过,咱们一步步理清楚:

原Message-ID被Google判定无效的核心原因

Google的邮件服务器严格遵循RFC 5322邮件标准,而email.utils.make_msgid()在不指定domain参数时生成的ID,在Heroku环境下大概率不符合标准要求:

  • RFC要求Message-ID必须是<本地标识@合法域名>的格式,其中域名部分必须是可公开解析、属于发送方控制的有效域名
  • Heroku的dyno容器默认主机名是内部随机标识(比如类似web.1.dyno.abc123.herokuapp.com甚至localhost),make_msgid()默认会用这个主机名作为domain部分;你给出的示例<5ae0c0a8.c340620a.d15d.d9aaSMTPIN_...更是明显缺失了@和合法域名后缀,完全不符合格式规范
  • Google会判定这种不符合标准的Message-ID无效,所以强制替换成自己生成的合法ID;而Hotmail/Outlook的反垃圾邮件规则更严格,可能直接因为这个格式问题拒绝投递,这就是你遇到投递问题的根源
是否需要自行生成ID覆盖默认逻辑?

必须要,而且实现起来非常简单。你只需要在生成邮件时,手动指定一个可解析的合法域名作为Message-ID的domain部分,替换掉make_msgid()的默认值。

举个具体的实现例子:

from flask_mail import Message
import email.utils

def send_email_with_valid_msgid():
    # 初始化邮件对象
    msg = Message(
        subject="你的邮件主题",
        recipients=["user@gmail.com", "user@outlook.com"],
        body="邮件内容"
    )
    # 用你的Heroku应用域名(比如yourapp.herokuapp.com)或自定义域名作为domain
    valid_domain = "yourapp.herokuapp.com"
    # 生成符合RFC标准的Message-ID
    msg.id = email.utils.make_msgid(domain=valid_domain)
    # 发送邮件
    mail.send(msg)
额外注意事项
  • 确保你用的domain是你实际控制的,并且有正常的DNS解析记录(A/AAAA或MX记录都可以)
  • make_msgid()生成的随机本地标识部分已经足够保证全局唯一,不需要自己额外生成随机字符串
  • 绝对不要用localhost、内部IP或不可公开解析的内部域名作为Message-ID的domain

内容的提问来源于stack exchange,提问作者HoosierDaddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:06:29