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


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

6 63

6 ответов:

вы можете настройка приложения для использования серверной консоли для отправки по электронной почте. Он пишет электронные письма в standard out вместо того, чтобы отправлять их.

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

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

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

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

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

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

вы должны настроить Django для использования этого сервера в вашем settings.py:

EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025

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

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

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

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

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

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

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

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

удачи в кодировании...

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