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

Django中如何使用用户填写的邮箱作为发件人发送邮件

Django 联系表单自定义发件人问题解决方案

问题根因

主流邮件服务商(如Gmail、腾讯邮箱、企业邮箱等)出于反垃圾邮件规则限制,会强制校验SMTP登录账号和发件人地址的一致性,若两者不匹配,会自动将发件人替换为settings.py中配置的EMAIL_HOST_USER,甚至直接拦截邮件。

最优兼容方案(推荐)

绝大多数业务场景下,不需要强制修改发件人地址,只要保证收件人点击回复时,能直接发送到用户提交的邮箱即可。该方案适配所有邮件服务商,不会触发拦截规则:

  1. 替换原本的send_mail方法,使用Django提供的EmailMessage类配置自定义回复地址
  2. 保留站点固定邮箱作为发件人,将用户提交的邮箱设置为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:06:01