Тестирование электронной почты в Django

Отправка сообщений электронной почты из веб-приложения часто кажется броском камней в черную дыру. Вы создаете сообщение, передаете его функции отправки почты и надеетесь на лучшее. Вы не контролируете почтовый ящик и почтовый сервер, поэтому весь этот процесс происходит где-то посередине, и вы надеетесь, что он просто работает.

Я думаю, пришло время изменить это. Сообщения электронной почты можно и нужно тестировать, как и любую другую часть веб-приложения. И, к счастью, Django делает этот процесс очень простым.

Чтобы отправить сообщение электронной почты в Django, вы можете использовать различные почтовые серверы: обычный SMTP-сервер, GMAIL или любой другой сервис, такой как mailgun или mailchimp.

Однако, когда мы запускаем тест, средство запуска тестов Django автоматически перенаправляет всю электронную почту, отправленную Django, в фиктивный исходящий ящик, что позволяет вам проверить каждый аспект отправки электронной почты — от количества отправленных сообщений до содержимого каждого сообщения.

Познакомьтесь с django.core.mail.outbox

Во время тестов каждое исходящее письмо вместо отправки во внешний мир сохраняется в django.core.mail.outbox. Таким образом, мы получаем виртуальный почтовый ящик, который мы можем быстро проверить.

Например, вы можете проверить количество сообщений в поле:

from django.core import mail

print(len(mail.outbox))

Или вы можете получить электронное письмо и проверить его содержимое:

from django.core import mail

first_message = mail.outbox[0]
print(first_message.subject)
print(first_message.body)

Имея эти возможности, вы можете писать тесты, проверяющие содержимое и доставку электронной почты.

Вот краткий пример теста электронной почты, написанного для Pytest:

from django.core import mail

def test_send_mail():
   # Use Django send_mail function to construct a message
   # Note that you don't have to use this function at all.
   # Any other way of sending an email in Django would work just fine. 
   mail.send_mail(
        'Example subject here',
        'Here is the message body.',
        'from@example.com',
        ['to@example.com']
    )

    # Now you can test delivery and email contents
    assert len(mail.outbox) == 1, "Inbox is not empty"
    assert mail.outbox[0].subject == 'Subject here'
    assert mail.outbox[0].body == 'Here is the message.'
    assert mail.outbox[0].from_email == 'from@example.com'
    assert mail.outbox[0].to == ['to@example.com']

Вот и все. Надеюсь, вы узнали что-то новое. Если да, пожалуйста, поделитесь этим постом как можно шире. Спасибо за поддержку!

Вернуться на верх