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

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


person asawilliams    schedule 09.01.2011    source источник
comment
Здесь может быть полезно знать операционную систему вашего локального ящика... Вам в любом случае не нужен почтовый сервер на ящике, все, что вам нужно, это сетевое подключение к почтовому серверу через порт SMTP... и возможный пользователь/пароль.   -  person Spacedman    schedule 10.01.2011


Ответы (6)


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

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

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

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

person Daniel Hepper    schedule 09.01.2011
comment
А еще лучше поместите его в файл настроек разработки и не добавляйте в производство. - person leech; 11.03.2014
comment
Или, что еще лучше, сделайте это с переменными среды. - person meshy; 23.04.2015
comment
Если вы используете 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
person Benjamin Wohlwend    schedule 09.01.2011
comment
Обратите внимание, что ваше приложение может вызвать исключение, если попытается отправить электронное письмо, когда сервер электронной почты не запущен. fail_silently=False используется по умолчанию для send_mail. - person Tim Fletcher; 26.03.2013
comment
Хотя ответ Даниэля Хеппера, несомненно, является правильным в отношении поставленного вопроса, мне этот ответ нравится больше, потому что это общее решение, которое работает независимо от среды. (Конечно, плюсы в обоих случаях.) - person Teekin; 09.05.2017

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

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

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

person Matthew Schinckel    schedule 09.01.2011

Если ваши тесты простираются от 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.

person Julien Grenier    schedule 12.01.2011
comment
Мужик это здорово. - person Tolgahan ÜZÜN; 05.02.2021

Это уточняет ответ Бенджамина. Один из способов, которым я тестирую электронные письма, если у меня нет локального почтового сервера, такого как 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, для дальнейшего тестирования.

person radtek    schedule 13.11.2014

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

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

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

Удачного кодирования...

person Njogu Mbau    schedule 17.10.2013