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
相关产品推荐
相关产品推荐

