代码之家  ›  专栏  ›  技术社区  ›  Eray Erdin

django不在testcase上发送电子邮件,但在shell上发送

  •  3
  • Eray Erdin  · 技术社区  · 7 年前

    我有个奇怪的问题。每当我试图从 TestCase ,我无法接收。不过,我在django shell上尝试了同样的方法,它成功地发送了电子邮件。这是我的 测试用例 :

    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的壳上做的:

    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
    • Django 2.0.4
    1 回复  |  直到 7 年前
        1
  •  4
  •   scharette    7 年前

    这是从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 .

    DR

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

    因此,这将测试 会是 发送。