在Django中测试邮件发送

117 投票
10 回答
64510 浏览
提问于 2025-04-16 04:14

我需要测试我的Django应用程序发送的电子邮件内容是否正确。我不想依赖外部系统(比如临时的gmail账户),因为我并不是在测试实际的电子邮件服务……

我想,也许可以把发送的电子邮件保存在本地的一个文件夹里。有什么建议可以实现这个吗?

10 个回答

28

如果你对单元测试感兴趣,最好的办法就是使用Django提供的内存后端

EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'

举个例子,如何把它当作py.test的一个工具来用。

@pytest.fixture(autouse=True)
def email_backend_setup(self, settings):
    settings.EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'  

在每个测试中,mail.outbox会和服务器一起重置,这样就不会在测试之间产生影响。

from django.core import mail

def test_send(self):
    mail.send_mail('subject', 'body.', 'from@example.com', ['to@example.com'])
    assert len(mail.outbox) == 1

def test_send_again(self):
    mail.send_mail('subject', 'body.', 'from@example.com', ['to@example.com'])
    assert len(mail.outbox) == 1
217

Django的测试框架里有一些内置的工具,可以帮助你进行电子邮件服务的测试。

下面是文档中的一个例子(简短版):

from django.core import mail
from django.test import TestCase

class EmailTest(TestCase):
    def test_send_email(self):
        mail.send_mail('Subject here', 'Here is the message.',
            'from@example.com', ['to@example.com'],
            fail_silently=False)
        self.assertEqual(len(mail.outbox), 1)
        self.assertEqual(mail.outbox[0].subject, 'Subject here')
49

你可以使用一种叫做“文件后端”的方法来发送邮件,这个方法在开发和测试的时候非常方便。这样做的话,邮件不会真正发送出去,而是会保存在你指定的一个文件夹里!

撰写回答