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

Django集成Anymail与Mailgun发送邮件时From地址异常排查求助

Fix: From Address Shows User's Email Instead of Your Domain in Django/Anymail/Mailgun Setup

我一眼就瞅出问题所在了——你在处理联系表单的时候,直接把用户提交的邮箱当成了邮件的from_email参数!这就是Mailgun自动改写发件人地址的核心原因。

为什么会出现这个问题?

Mailgun(几乎所有正规邮件服务商都是如此)不允许你随便用第三方邮箱作为发件人地址——这是反垃圾邮件规则的硬性要求,也是为了保证你的邮件能正常送达收件人邮箱。当你尝试用用户的邮箱当发件人时,Mailgun会自动把地址改成user=domain.com@mail.yourdomain.com这种格式,以此绕过SPF/DKIM验证的问题,但这显然不是你想要的效果。

解决方案:用官方邮箱当发件人,用Reply-To处理回复需求

正确的做法是:始终用你自己的官方邮箱(比如info@mydomain.com)作为发件人,然后通过Reply-To字段来处理不同场景的回复逻辑——这样既符合邮件服务商的规则,又能满足用户和管理员的回复需求。

第一步:更新send_email函数,支持Reply-To字段

先给你的邮件发送函数加上reply_to参数,用来设置回复地址:

def send_email(subject, html_content, text_content=None, from_email=None, recipients=[], attachments=[], bcc=[], cc=[], reply_to=None):
    # send email to user with attachment
    if not from_email:
        from_email = settings.DEFAULT_FROM_EMAIL
    if not text_content:
        text_content = ''
    email = EmailMultiAlternatives(
        subject,
        text_content,
        from_email,
        recipients,
        bcc=bcc,
        cc=cc
    )
    # 添加回复地址设置
    if reply_to:
        email.reply_to = [reply_to]
    email.attach_alternative(html_content, "text/html")
    for attachment in attachments:
        # Example: email.attach('design.png', img_data, 'image/png')
        email.attach(*attachment)
    email.send()

第二步:修改联系表单的邮件逻辑

把from_email换成你的官方邮箱,用reply_to来处理不同场景的回复需求:

def HomePage(request, template='home.html'):
    form = ContactForm(request.POST or None)
    if form.is_valid():
        user_email = form.cleaned_data['from_email']
        # 用你的官方邮箱作为统一发件人(可以直接写死,或者从settings里取)
        official_from_email = settings.DEFAULT_FROM_EMAIL  # 等价于'info@mydomain.com'
        
        # 发给用户的欢迎邮件:发件人是官方邮箱,用户回复会回到你的官方邮箱
        message1 = {
            'subject': 'Test',
            'from_email': official_from_email,
            'reply_to': official_from_email,
            'recipients': [user_email],
            'template': "marketing/welcome.html",
            'context': {
                "user_email": user_email,  # 模板里可以显示用户自己的邮箱
            }
        }
        # 发给管理员的通知邮件:发件人是官方邮箱,管理员回复会直接到用户邮箱
        message2 = {
            'subject': 'Test - Contact',
            'from_email': official_from_email,
            'reply_to': user_email,
            'recipients': ['info@mydomain.com'],
            'template': "marketing/admin.html",
            'context': {
                "user_email": user_email,  # 模板里显示提交表单的用户邮箱
            }
        }
        try:
            send_mass_mail([message1, message2])
        except BadHeaderError:
            return HttpResponse('Invalid header found.')
        return redirect('/thanks/')
    context = {
        "form": form,
    }
    return render(request, template, context)

额外注意事项

  • 确保你的Mailgun域名已经正确配置了SPF和DKIM记录,这是保证邮件正常送达、不被标记为垃圾邮件的关键。
  • 永远不要用用户的邮箱作为发件人,除了会被服务商改写地址,还可能触发反垃圾邮件机制,影响你的域名信誉。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:46:06