如何解决Django中发件人与收件人邮箱相同的问题?
问题排查与解决:邮件发件人显示为自身邮箱而非用户邮箱
问题原因
Gmail的SMTP服务器有严格的反垃圾邮件规则,它会强制替换你在send_mail里指定的from_email为你配置的EMAIL_HOST_USER,不允许随意伪造发件人地址,这就是你收到的邮件发件人是自己邮箱的核心原因。
解决方案
方案1:添加回复地址+在邮件内容中标注用户信息(推荐,适配Gmail规则)
无需修改SMTP配置,仅调整send_mail的调用逻辑即可解决识别问题:
- 将用户邮箱设置为回复地址,点击邮件回复时直接发送到用户邮箱
- 在邮件内容里嵌入用户的姓名和邮箱,方便你直接识别发件人身份
修改后的views.py代码:
def ContactME(request): if request.method == "POST": MessageSenderName = request.POST.get('name') SenderMessage = request.POST.get('message') SenderEmail = request.POST.get('email') Contact.objects.create( Name=MessageSenderName, Email=SenderEmail, Message=SenderMessage, ) # 构造带用户身份信息的邮件内容 email_content = f"发件人姓名:{MessageSenderName}\n发件人邮箱:{SenderEmail}\n\n留言内容:\n{SenderMessage}" send_mail( '(Portfolio)' + MessageSenderName, email_content, # 此处必须使用你的Gmail邮箱(Gmail强制要求发件人匹配配置的邮箱) 'xxxxxx@gmail.com', ['XXXX@gmail.com'], # 添加回复地址,指向用户提交的邮箱 reply_to=[SenderEmail] ) return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
方案2:更换支持自定义发件人的SMTP服务商
如果一定要让邮件显示用户邮箱为发件人,Gmail无法满足该需求,你需要更换到支持自定义发件人的邮件服务(如SendGrid、Mailgun、阿里云邮件推送等)。这类服务商允许你配置域名后自定义发件人地址,但需要完成额外的域名验证和服务配置步骤。
额外检查项
- 确认
SenderEmail能正确获取用户提交的邮箱地址,可在创建Contact对象后添加打印日志验证 - 若你的Gmail开启了两步验证,
EMAIL_HOST_PASSWORD必须使用应用专用密码而非原账号密码
内容的提问来源于stack exchange,提问作者Mossaddak
相关产品推荐
相关产品推荐

