У меня есть приложение Django, которое отправляет электронное письмо. На производственном сервере есть сервер электронной почты, но на моем локальном ящике его нет. Я хотел бы иметь возможность протестировать отправку электронной почты локально. Есть ли способ заставить django не отправлять его через почтовый сервер, а просто распечатать в файл или на консоль?
Тестовая отправка электронной почты без почтового сервера
Ответы (6)
Вы можете настроить приложение на использование серверной части консоли для отправки электронной почты. Он записывает электронные письма в стандартный формат, а не отправляет их.
Измените свой settings.py, чтобы включить эту строку:
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
Не забудьте удалить его для производства.
mail_admins
, не забудьте установить < a href="https://docs.djangoproject.com/en/stable/ref/settings/#std:setting-ADMINS" rel="nofollow noreferrer">ADMINS
чему-то, иначе ничего не будет напечатано стандартный выход. Аналогично для mail_managers
.
- person Flimm; 28.03.2016
Python имеет встроенный небольшой SMTP-сервер. Вы можете запустить его во второй консоли с помощью этой команды:
python -m smtpd -n -c DebuggingServer localhost:1025
Это просто распечатает все письма, отправленные localhost:1025
в консоли.
Вы должны настроить Django для использования этого сервера в вашем settings.py
:
EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025
fail_silently=False
используется по умолчанию для send_mail
.
- person Tim Fletcher; 26.03.2013
Вы можете настроить свое приложение для записи электронных писем во временные файлы вместо их отправки (аналогично ответу Дэниела Хеппера).
EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = 'tmp/email-messages/'
Это сохраняет каждое новое сообщение в виде отдельного файла. Полезно, если вы отправляете кучу писем и не хотите использовать прокрутку.
Если ваши тесты простираются от 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.
Это уточняет ответ Бенджамина. Один из способов, которым я тестирую электронные письма, если у меня нет локального почтового сервера, такого как 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, для дальнейшего тестирования.
Для этого есть отличное приложение от caktus https://github.com/caktus/django-email-bandit. Просто добавьте это в свой файл settings.py:
EMAIL_BACKEND = 'bandit.backends.smtp.HijackSMTPBackend'
BANDIT_EMAIL = '[email protected]'
В дополнение к вашим настройкам электронной почты.. Все электронные письма будут перенаправлены на «[email protected]».
Удачного кодирования...