Тестирование отправки электронной почты


любые советы по тестированию отправки электронной почты? Кроме, может быть, создания gmail учетная запись, особенно для получения этих писем?

Я хотел бы, возможно, хранить электронные письма локально, в папке по мере их отправки.

13 61

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 не уверен, что он присутствует в чем-либо раньше.

исправление SMTPLib для целей тестирования может помочь проверить отправку писем без их отправки.

использование файла 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() the asyncore.dispatcher по телефону smtp_server.close() чтобы завершить цикл asyncore(остановить сервер от прослушивания.)

Если у вас есть сервер TomCat или другой механизм сервлетов, то хорошим подходом является "Post Hoc", который представляет собой небольшой сервер, который выглядит для приложения точно так же, как SMTP-сервер, но включает в себя пользовательский интерфейс, который позволяет просматривать и проверять отправленные сообщения электронной почты. Это с открытым исходным кодом и в свободном доступе.

найти его по адресу: Post Hoc Сайт GitHub

смотрите сообщение в блоге:PostHoc: тестирование приложений, которые отправляют Электронная почта

https://websocket.электронная почта обеспечивает простой способ проверить отправку электронной почты с минимальной настройкой (вам даже не нужна учетная запись).

Использовать Maildump.

https://github.com/ThiefMaster/maildump

MailDump-это клон на основе python удивительного инструмента MailCatcher. Свой цель состоит в том, чтобы предоставить разработчикам способ разрешить приложениям отправлять электронные письма без фактических писем, отправленных кому-либо. Дополнительно ленивый разработчики могут предпочесть это над реальным SMTP-сервером просто для ради того, чтобы это было намного проще и быстрее настроить.

Это требуется Python 2.