如何更改Django邮件的发件人地址?

2 投票
2 回答
1809 浏览
提问于 2025-04-17 03:13

正如文档中提到的SERVER_EMAIL这个设置应该能改变Django(1.3.1)服务器发送给ADMINS的崩溃邮件中的“发件人”地址。

但实际上并没有改变。

在1.3.1版本中,这个功能对你有效吗?(或者其他任何Django版本)

Django坚持只用我的EMAIL_HOST_USER,也就是我的邮箱登录名/实际地址,作为发件人地址。我使用的是Gmail作为SMTP服务器,所以我在想这是否有关系。Gmail会阻止这种操作吗?我发誓之前是能成功的。

这有点让人烦,因为我们有多个项目似乎都在用同一个地址发邮件,我们得翻看错误追踪信息才能知道是哪个项目发的。

2 个回答

1

从我看到的代码(1.3.1)来看,堆栈跟踪的邮件是通过 mail_admins 方法发送的,发件人地址是 SERVER_EMAIL:

mail = EmailMultiAlternatives(u'%s%s' % (settings.EMAIL_SUBJECT_PREFIX, subject),
                message, settings.SERVER_EMAIL, [a[1] for a in settings.ADMINS],
                connection=connection)

这个地址是这样定义的:

class EmailMultiAlternatives(EmailMessage):
   [...]
   def __init__(self, subject='', body='', from_email=None, to=None, bcc=None,
            connection=None, attachments=None, headers=None, alternatives=None,
            cc=None):

我建议把跟踪输出放在 EmailMultiAlternatives 中,这样可以确认使用的是正确的邮箱地址。

3

问题出在Gmail上。从smtplib这个库开始,正确的发件人地址已经设置好,这个库也会把正确的地址发送给Gmail。

这个Gmail支持页面暗示(特别是在页面底部的“POP/IMAP用户注意”部分)你需要在Gmail的设置中将一个地址添加为“附加邮箱地址”,才能通过Gmail的SMTP服务器从这个地址发送邮件。

当然,这需要验证;因为我的发件人地址没有收件箱(它是假的!),所以我现在无法做到。不过至少这不是Django的错误!: )

(注意:这显然是Gmail为了防止你发送垃圾邮件而采取的措施,我相信这就是他们这么做的原因。)

撰写回答