Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

настроить приложение для использования Консолирования для отправки электронной почты. Он отправляет электронные письма по стандарту вместо их отправки.

Измените параметры settings.py, чтобы включить эту строку:

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

Не забудьте удалить его для производства.

Ответ 2

Python имеет небольшой SMTP-сервер встроенный. Вы можете запустить его во второй консоли с помощью этой команды:

python -m smtpd -n -c DebuggingServer localhost:1025

Это просто напечатает все письма, отправленные на localhost:1025 в консоли.

Вам нужно настроить Django на использование этого сервера в settings.py:

EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025

Ответ 3

Вы можете настроить приложение для записи электронных писем во временные файлы вместо их отправки (аналогично ответам Дэниела Хеппера).

EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = 'tmp/email-messages/'

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

Ответ 4

Если ваши тесты проходят от django.test.testcases.TestCase, тогда ничего не должно быть сделано. Django заменит EmailBackend на "специальный". Затем вы можете проверить, что было отправлено следующим образом:

def testMethodThatSendAEmail(self):
    ...
    from django.core import mail
    object.method_that_send_email(to='[email protected]')
    self.assertEqual(len(mail.outbox), 1)
    self.assertEqual(mail.outbox[0].to, ['[email protected]'])
    ...#etc

Исходный объект - это специальный объект, который вводится в почту, когда Выполняется тест python manage.py.

Ответ 5

Для этого есть классное приложение caktus https://github.com/caktus/django-email-bandit Просто добавьте это в свой файл settings.py:

EMAIL_BACKEND = 'bandit.backends.smtp.HijackSMTPBackend'
BANDIT_EMAIL = '[email protected]'

В дополнение к настройкам электронной почты. Все электронные письма будут перенаправлены на адрес '[email protected]'

Счастливое кодирование...

Ответ 6

Это уточняет ответ Бенджамина. Один из способов проверки электронной почты, если у меня нет локального почтового сервера, такого как postfix, sendmail или exim, - запустить почтовый сервер python. Вы можете запустить его на порту 25 с помощью sudo или просто использовать порт > 1024 (зарезервированные порты):

python -m smtpd -n -c DebuggingServer localhost:1025
#sudo python -m smtpd -n -c DebuggingServer localhost:25

Для тестирования с помощью вашего текущего кода приложения django вы можете временно изменить settings.py, чтобы включить его в боту:

EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USER, EMAIL_HOST_PASSWORD = 'localhost', 1025, None, None

Теперь протестируйте свои электронные письма, или вы можете сделать это в оболочке. /manage.py в другом окне терминала, например:

python manage.py shell

И вставьте этот код, чтобы отправить электронное письмо:

from django.core.mail import send_mail​
send_mail('Subject here', 'Here is the message.', '[email protected]',['[email protected]'], fail_silently=False)

Не нужно использовать настоящие электронные письма, так как вы увидите все в своем терминале. Вы можете сбросить его в соответствующий контейнер, например .html, для дальнейшего тестирования.