【问题标题】:Django does not Send Email on TestCase, but It Does on ShellDjango 不在 TestCase 上发送电子邮件,但它在 Shell 上发送
【发布时间】:2018-06-13 02:13:51
【问题描述】:

我有一个奇怪的问题。每当我尝试从TestCase 发送电子邮件时,我都收不到它。但是,我在 Django shell 上尝试了相同的方法,它成功发送了电子邮件。这是我的TestCase

class DefaultEmailTestCase(TestCase):
    def test_send(self):
        msg = EmailMessage(
            "Test Message",
            "This is a test message.",
            to=["foo@bar.com", "foo@baz.com"]
        )
        val = msg.send()
        self.assertEqual(val, 1)

它成功完成,但我没有收到电子邮件。这是我在 Django 的 shell 上所做的:

from django.core.mail import EmailMessage

receivers = ["foo@bar.com", "foo@baz.com"]

msg = EmailMessage(
    "Test Message",
    "This is a test message."
    to=receivers
)

msg.send()

我成功收到了消息。

这是我按顺序排列的设置(带有虚拟信息):

EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
EMAIL_HOST = "foo.bar.com"
EMAIL_PORT = 465 # This is the port that my email provider uses.
EMAIL_HOST_USER = "foo@bar.com"
EMAIL_HOST_PASSWORD = "123456"
# EMAIL_USE_TLS = True # Django raised an error saying that I cannot use both TLS and SSL. So I commented it out.
EMAIL_USE_SSL = True
DEFAULT_FROM_EMAIL = "Bar Testing Message <foo@bar.com>"

我也将django.core.mail.backends.smtp.EmailBackend 用作EMAIL_BACKEND,但没有运气。

测试用例和 Django shell 都使用我的开发设置,所以它们是一样的。我不知道为什么这不起作用。

提前致谢。


环境

  • Python 3.6.5
  • Django 2.0.4

【问题讨论】:

    标签: python django email


    【解决方案1】:

    这是来自 Django documentation:

    “locmem”后端将消息存储在 django.core.mail 模块的特殊属性中。发件箱属性是在发送第一条消息时创建的。这是一个列表,其中包含将要发送的每条消息的 EmailMessage 实例。

    基本上,当 Django 设置测试环境时,它会将电子邮件后端更改为内存中的后端(您在案例中指定的那个)。因此,即使指定django.core.mail.backends.smtp.EmailBackend,它也会被 Django 覆盖。

    如果您需要覆盖该行为,这里有一个解决方案:

    from django.test.utils import override_settings
    
    @override_settings(EMAIL_BACKEND='django.core.mail.backends.smtp.EmailBackend')
    class DefaultEmailTestCase(TestCase):
        ...
    

    注意

    设置此 Django 行为是为了避免在运行测试时可能发送数百封电子邮件,因此请记住这一点。

    如果您想查看首选实现,请查看this

    TL;DR

    from django.core import mail
    
    # Test that one message has been sent.
    self.assertEqual(len(mail.outbox), 1)
    

    因此,这将测试是否会发送电子邮件

    【讨论】:

    • 对不起。我也使用过django.core.mail.backends.smtp.EmailBackend,但效果不佳。我将立即将此详细信息添加到问题中。
    • 我马上应用修饰的方法并带来结果。
    • 好的,这个答案效果很好。看来我一开始没有尝试smtp.EmailBackend。 ||对于 Google 员工:您可能会收到诸如“此邮件被视为垃圾邮件”之类的消息,它似乎不适用于 Gmail。
    • @ErdinEray 虽然我提供了这个解决方案,但请阅读我的说明和 TL;DR
    • 感谢 NoteTL;DR。我也想知道我是否可以测试我发送的电子邮件。
    猜你喜欢
    • 2019-08-29
    • 2018-02-20
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    相关资源
    最近更新 更多