Django中如何使用用户填写的邮箱作为发件人发送邮件
Django 联系表单自定义发件人问题解决方案
问题根因
主流邮件服务商(如Gmail、腾讯邮箱、企业邮箱等)出于反垃圾邮件规则限制,会强制校验SMTP登录账号和发件人地址的一致性,若两者不匹配,会自动将发件人替换为
settings.py中配置的EMAIL_HOST_USER,甚至直接拦截邮件。
最优兼容方案(推荐)
绝大多数业务场景下,不需要强制修改发件人地址,只要保证收件人点击回复时,能直接发送到用户提交的邮箱即可。该方案适配所有邮件服务商,不会触发拦截规则:
- 替换原本的
send_mail方法,使用Django提供的EmailMessage类配置自定义回复地址 - 保留站点固定邮箱作为发件人,将用户提交的邮箱设置为
reply_to参数值
修改后的视图代码示例:
from django.core.mail import EmailMessage from django.conf import settings def contact(request): if request.method == 'POST': name = request.POST['name'] email = request.POST['email'] subject = request.POST['subject'] phone = request.POST['phone'] message = request.POST['message'] try: email_msg = EmailMessage( subject=subject, body=message, from_email=f"{name} <{settings.EMAIL_HOST_USER}>", to=['to@gmail.com'], reply_to=[email] ) email_msg.send(fail_silently=False) messages.success(request, 'We get your message and reply shortly...') except: messages.error(request, "failed") return render(request, 'pages/contact.html')
强制自定义发件人方案(不推荐)
如果业务确实要求发件人直接显示用户提交的邮箱,需要先满足两个前提:
- 使用自建SMTP服务器,未配置发件人地址校验规则
- 用户提交邮箱的域名SPF、DKIM记录已配置允许你的SMTP服务器IP代发,否则邮件会被判定为垃圾邮件甚至拒收
满足前提的前提下,可调整send_mail的发件人参数格式提高兼容性:
send_mail( subject=subject, message=message, from_email=f"{name} <{email}>", recipient_list=['to@gmail.com'], fail_silently=False )
注意事项
- Gmail、Outlook、QQ邮箱等公共SMTP服务均不支持自定义发件人,使用这类服务时请优先选择第一种方案
- 提交的表单字段建议增加合法性校验,避免恶意输入导致邮件发送失败
内容的提问来源于stack exchange,提问作者Zahidul Islam
相关产品推荐
相关产品推荐

