Тест отправки электронной почты без почтового сервера - PullRequest
64 голосов
/ 10 января 2011

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

Ответы [ 6 ]

124 голосов
/ 10 января 2011

Вы можете настроить ваше приложение на использование консоли Concee Backend для отправки электронной почты.Он записывает электронные письма в стандартный формат вместо их отправки.

Измените ваш settings.py, включив в него следующую строку:

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

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

71 голосов
/ 10 января 2011

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

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

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

EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025
37 голосов
/ 10 января 2011

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

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

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

32 голосов
/ 12 января 2011

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

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

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

11 голосов
/ 17 октября 2013

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

EMAIL_BACKEND = 'bandit.backends.smtp.HijackSMTPBackend'
BANDIT_EMAIL = 'your_email@example.com'

В верхней части ваших расчетов по электронной почте. Все электронные письма будут перенаправлены на ваш_email@example.com.

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

10 голосов
/ 13 ноября 2014

Это уточняет ответ от Вениамина. Один из способов проверить электронную почту, если у меня не установлен локальный почтовый сервер, такой как 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.', 'messanger@localhost.com',['any@email.com'], fail_silently=False)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...