Django电子邮件后端(始终从错误的“发件人”发送电子邮件)

6

我在我的项目中有几个实例,尝试在Django视图中发送电子邮件。

我想能够在视图中硬编码电子邮件发送者。但是,当我尝试这样做时,它仍然从设置文件中指定的默认帐户发送电子邮件。

以下是一个示例:

        if testform.is_valid():
            beta=testform.save()
            subject="Hi Beta Tester"  
            sender="correct@email.com"

            recipient=[testform.cleaned_data['email']]

            text=loader.get_template('registration/beta_email.txt')
            html=loader.get_template('registration/beta_email.html')

            site_name='mysite'
            d=Context({'site_name':site_name})
            text_content=text.render(d)
            html_content=html.render(d)
                #This sends two mail versions, plain text and html
            msg=EmailMultiAlternatives(subject, text_content, sender, recipient)
            msg.attach_alternative(html_content, "text/html")
            msg.send()

            return HttpResponseRedirect('/splash/')

我以为可以在这里显式指定发件人参数。但是,当我测试它时,电子邮件仍然从我的设置文件中列出的地址发送,如下所配置:

       EMAIL_USE_TLS=True

       EMAIL_HOST='smtp.gmail.com'

       EMAIL_HOST_USER='wrong@email.com'

       EMAIL_HOST_PASSWORD='private'

       DEFAULT_FROM_EMAIL='wrong@email.com'

我只需要删除DEFAULT_FROM_EMAIL常量就可以使它工作吗?我尝试这样做,它似乎正在工作,但我很困惑。在Django文档中,建议在视图中设置sender应该覆盖DEFAULT。


看起来应该可以工作。Django的版本是什么?查看主干版本的源代码:https://code.djangoproject.com/browser/django/trunk/django/core/mail/message.py#L198。当您将其传递给`EmailMultiAlternatives`时,您绝对确定`sender`不是None吗?我建议在交互式shell和pdb中尝试一下。 - Brian Neal
嗨 Brian,我正在使用v1.2版本。如果您查看下面的注释,我认为我的问题变得更加清晰。 - Ben
你确定不是SMTP服务器重写了发件人地址吗?例如:Gmail进行了一些垃圾邮件保护。 - John Mee
嗨John,我对smtp服务器还不熟悉,不知道如何进行调试。这是纯开发环境,所以我的电子邮件没有被标记为垃圾邮件。不确定这是否有影响。 - Ben
我知道addThis(社交媒体分享网络服务)能够从任何Gmail帐户发送电子邮件到任何其他Gmail帐户。 - Ben
2个回答

7

我终于找到了问题所在。不幸的是,当使用验证的smtp时,gmail会重新编写发件人和信封。

如果你想避免这种情况,你需要使用第三方邮件服务器(不会像gmail那样挑剔),然后向gmail用户发送邮件。


2

对于发件人电子邮件,尝试将其放在 < > 中,并添加名称:

sender = "Formal Name <correct@email.com>"

这正是我在发送电子邮件视图中使用的语法,它有效。

添加名称不应该改变发送方式,但也许值得尝试,而且您可能想要一个易于阅读的名称。


我刚刚测试了一下,我认为这是解决方案。让我再多测试一下。 - Ben
好的,这里发生了一些有趣的事情。我的所有电子邮件都默认来自EMAIL_HOST_USER常量。该常量的真实值是一个Google应用帐户(基本上是help@mysite.com)。当我尝试从brendan@gmail.com发送邮件时,它会恢复到EMAIL_HOST_USER值。然而,当我从Google应用程序帐户内的另一个用户(即support@mysite.com)发送邮件时,它使用support而不是help。这很有趣,我不知道该怎么办。 - Ben
@Brendan 非常有趣...所以你正在尝试从用户发送消息到用户?你是托管他们的电子邮件帐户还是他们都是 Gmail 帐户? - j_syk
嘿J,我正在尝试从用户向用户发送消息。他们都是Gmail帐户。我曾经以为这是可能的...就像我上面提到的addThis一样。任何人都可以欺骗发件人字段,对吧? - Ben
我已经注释掉了DEFAULT_FROM_EMAIL,所以现在默认为EMAIL_HOST_USER。我的问题是如何在Django模块内进行欺骗?我还打印出了“sender”,它的值与预期相同。 - Ben
显示剩余5条评论

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