如何在通过Gmail发送的Django电子邮件中覆盖发件人地址

9

在我的settings.py中,我有以下这些值:

EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'user@gmail.com'
EMAIL_HOST_PASSWORD = 'pass'
EMAIL_USE_TLS = True

然后在我的视图中,我从模型中获取电子邮件地址,例如:

#models.py
class Profile(models.Model):
    name = models.CharField(...)
    email_address = models.EmailField()

假设在Profile模型中,email_addresssample@gmail.com

#views
def send_email(request,profile_id):
   profile = Profile.objects.get(pk=profile_id)
   email = profile.email_address

当我发送邮件时,

send_mail('subject', 'content', email, ['example1@example.com'])

当邮件已经发送时,发件人邮箱仍然是user@gmail.com。有人能教我如何覆盖这个电子邮件地址吗?谢谢。

3个回答

11

DEFAULT_FROM_EMAIL 设置就是默认值。在 Django 自动发送邮件的地方(例如错误报告给 ADMINS),会用到这个设置。如果你直接调用 send_mail 方法,你必须提供 from_email 参数。即使你希望使用 DEFAULT_FROM_EMAIL,你也需要从 django.conf.settings 导入并传递参数。

我最好的猜测是 Gmail 才是罪魁祸首。据我所知,Gmail 不允许指定自定义的发送者,因为已经有太多人试图使用 Gmail 发送垃圾邮件,他们想要阻止这种做法。

基本上,当你的电子邮件通过 Gmail 的发件服务器发送时,它会忽略你发送的自定义标头,并从你的实际 Gmail 帐户用户发送邮件。你可能可以通过将要使用的自定义发件人电子邮件添加为 Gmail 设置中的有效发件人来解决此问题。前往“设置”,然后选择“帐户和导入”选项卡。找到标题为“发送邮件”的部分,然后单击“添加你拥有的另一个电子邮件地址”的链接。你可以在那里添加要发送的新电子邮件帐户,并通过电子邮件确认该地址(因此它需要是可以接收电子邮件的有效地址)。


嗯,克里斯,关于你说的话,你能给我一些例子吗?顺便说一下,我正在使用的电子邮件是有效的。 :D - david
什么样的例子?这并不是关于你想要发送的电子邮件地址是否有效的问题,而是关于它是否在你的Gmail账户中设置为允许的发件人。如果没有进行设置,Gmail将不会允许你使用它作为发件人。 - Chris Pratt

1

首先,您需要在setting.py中删除EMAIL_HOST_USER和EMAIL_HOST_PASSWORD,并使用auth_user和auth_password。

auth_user:如果未指定EMAIL_HOST_USER,或者您想要覆盖它,则将使用此用户名进行SMTP服务器身份验证。

auth_password:如果未指定EMAIL_HOST_PASSWORD,则将使用此密码进行SMTP服务器身份验证。

mail.send_mail(
        subject='here your subject',
        message='message',
        from_email='fromepython@gmail.com',
        recipient_list=[to_email],
        auth_user = 'fromepython@gmail.com',
        auth_password = 'password',
        fail_silently=True,

)

0

David,你确定你的示例中电子邮件发送成功了吗?

来自文档:https://docs.djangoproject.com/en/dev/topics/email/ from_email:发件人地址。fred@example.com 和 Fred 都是合法的格式。如果省略,则使用 DEFAULT_FROM_EMAIL 设置。

此外:https://docs.djangoproject.com/en/dev/topics/email/#django.core.mail.send_mail 你的使用看起来是正确的:

from django.core.mail import send_mail
send_mail('Subject here', 'Here is the message.', 'from@example.com',
    ['to@example.com'], fail_silently=False)

覆盖可能不是问题。你的电子邮件可能只是空白的?

希望这有所帮助。


是的,尽管我正在使用个人资料的电子邮件,但在发送时,电子邮件用户正在覆盖它。因此,我希望发件人电子邮件是个人资料的电子邮件。 - david
嗯,你说电子邮件可能是空白的,但实际上不是。我已经输入了一个有效的电子邮件地址。 - david
是的,但在代码的这一点上它是空白的吗:send_mail('subject', 'content', email, ['example1@example.com'])?您能否将该电子邮件对象作为内容发送以查看其是否正常传递? - Duke Hall
假设Profile模型中的email_address是sample@gmail.com。因此在上述视图中,您可以看到send_mail中的电子邮件确实有值。 - david

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接