Тестирование отправки электронной почты
любые советы по тестированию отправки электронной почты? Кроме, может быть, создания gmail учетная запись, особенно для получения этих писем?
Я хотел бы, возможно, хранить электронные письма локально, в папке по мере их отправки.
13 ответов:
можно использовать файл сервер для отправки электронной почты это очень удобное решение для разработки и тестирования; электронные письма не отправляются, но хранятся в папке, которую вы можете указать!
Django test framework имеет некоторые встроенные помощники, чтобы помочь вам с тестированием e-mail service.
пример из документов (краткая версия):
from django.core import mail from django.test import TestCase class EmailTest(TestCase): def test_send_email(self): mail.send_mail('Subject here', 'Here is the message.', 'from@example.com', ['to@example.com'], fail_silently=False) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].subject, 'Subject here')
если вы занимаетесь модульным тестированием, лучшим решением является использование в памяти серверной предоставлено django.
EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
возьмите случай использования его как py.тест приспособление
@pytest.fixture(autouse=True) def email_backend_setup(self, settings): settings.EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
в каждом испытании,
mail.outbox
сброс с сервера, так что нет никаких побочных эффектов между тестами.from django.core import mail def test_send(self): mail.send_mail('subject', 'body.', 'from@example.com', ['to@example.com']) assert len(mail.outbox) == 1 def test_send_again(self): mail.send_mail('subject', 'body.', 'from@example.com', ['to@example.com']) assert len(mail.outbox) == 1
для любого проекта, который не требует отправки вложений, я использую django-mailer, который имеет преимущество во всех исходящих сообщений в очереди, пока не вызвать их отправки, и даже после того как они были отправлены, они затем вошли, все из которых виден в админке, что делает его легко и быстро проверить, какие вам по электронной почте код пытается выстрелить в межтрубочные.
Django также имеет бэкэнд электронной почты в памяти. Более подробная информация в документах под бэкэнд в памяти. Это присутствует в Django 1.6 не уверен, что он присутствует в чем-либо раньше.
использование файла backend работает хорошо, но я нахожу его немного громоздким, чтобы совать вокруг файловой системы, чтобы посмотреть на электронную почту. Вы можете использовать mailcatcher,https://github.com/sj26/mailcatcher, чтобы захватить электронные письма и отображать их в веб-интерфейсе.
чтобы использовать mailcatcher с Django вам нужно будет добавить что - то вроде следующего settings.py:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = '127.0.0.1' EMAIL_HOST_USER = '' EMAIL_HOST_PASSWORD = '' EMAIL_PORT = 1025 EMAIL_USE_TLS = False
использовать MailHog
вдохновленный MailCatcher, проще в установке.
построенный с Go-MailHog работает без установки на нескольких платформах.
кроме того, он имеет компонент, называемый Джим на MailHog Chaos Monkey, что позволяет проверить отправку писем с различными проблемами происходит:
Что может сделать Джим?
- отклонить соединений
- ограничение скорости соединения
- отклонить проверки подлинности
- отклонить отправителей
- отклонить получателей
подробнее о здесь.
(В отличие от оригинального mailcatcher, который не удалось на меня при отправке писем с emoji, закодированных в UTF-8 и это не было действительно исправлено в текущем выпуске, MailHog просто работать.)
мое решение-это запись содержимого в html-файл. Этот способ может помочь вам увидеть, как выглядит электронная почта. Я оставляю его здесь htmlfilebased.EmailBackend.
другой совет: Вы можете использовать редактор шаблонов электронной почты django который может помочь вам редактировать шаблон электронной почты с нулевым встроенным css.
почему бы не запустить свой собственный очень простой SMTP-сервер путем наследования от
smtpd.SMTPServer
иthreading.Thread
:class TestingSMTPServer(smtpd.SMTPServer, threading.Thread): def __init__(self, port=25): smtpd.SMTPServer.__init__( self, ('localhost', port), ('localhost', port), decode_data=False ) threading.Thread.__init__(self) def process_message(self, peer, mailfrom, rcpttos, data, **kwargs): self.received_peer = peer self.received_mailfrom = mailfrom self.received_rcpttos = rcpttos self.received_data = data def run(self): asyncore.loop()
process_message вызывается всякий раз, когда ваш SMTP-сервер получает почтовый запрос, вы можете делать все, что хотите.
в тестовом коде сделайте что-то вроде этого:
smtp_server = TestingSMTPServer() smtp_server.start() do_thing_that_would_send_a_mail() smtp_server.close() self.assertIn(b'hello', smtp_server.received_data)
помните
close()
theasyncore.dispatcher
по телефонуsmtp_server.close()
чтобы завершить цикл asyncore(остановить сервер от прослушивания.)
Если у вас есть сервер TomCat или другой механизм сервлетов, то хорошим подходом является "Post Hoc", который представляет собой небольшой сервер, который выглядит для приложения точно так же, как SMTP-сервер, но включает в себя пользовательский интерфейс, который позволяет просматривать и проверять отправленные сообщения электронной почты. Это с открытым исходным кодом и в свободном доступе.
найти его по адресу: Post Hoc Сайт GitHub
смотрите сообщение в блоге:PostHoc: тестирование приложений, которые отправляют Электронная почта
https://websocket.электронная почта обеспечивает простой способ проверить отправку электронной почты с минимальной настройкой (вам даже не нужна учетная запись).
Использовать Maildump.
https://github.com/ThiefMaster/maildump
Это требуется Python 2.MailDump-это клон на основе python удивительного инструмента MailCatcher. Свой цель состоит в том, чтобы предоставить разработчикам способ разрешить приложениям отправлять электронные письма без фактических писем, отправленных кому-либо. Дополнительно ленивый разработчики могут предпочесть это над реальным SMTP-сервером просто для ради того, чтобы это было намного проще и быстрее настроить.