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

58

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

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

  • 0
    Модераторы: пожалуйста, заблокируйте этот вопрос. Много спама добавляется в ответах, предлагая решения, которые до смешного сложны только для продвижения внешних услуг.
Теги:
email
smtp
django-testing

14 ответов

31
Лучший ответ

Вы можете использовать файловый сервер для отправки писем, который является очень удобным решением для разработки и тестирования; электронные письма не отправляются, а сохраняются в папке, которую вы можете указать!

  • 1
    Дополнительная информация о почтовых серверах : docs.djangoproject.com/en/dev/topics/email/#email-backends . Иногда достаточно даже простого консольного бэкенда ..
  • 0
    Но есть ли способ получить доступ к сгенерированной электронной почте во время (автоматического) тестирования?
138

В тестовой среде Django есть встроенные помощники, которые помогут вам в тестировании службы электронной почты.

Пример из документации (короткая версия):

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.',
            '[email protected]', ['[email protected]'],
            fail_silently=False)
        self.assertEqual(len(mail.outbox), 1)
        self.assertEqual(mail.outbox[0].subject, 'Subject here')
  • 3
    +1 Хороший ответ. Но это не полезно для сложных случаев, когда send_mail не может быть использован.
  • 2
    Точнее документ здесь: docs.djangoproject.com/en/1.8/topics/email/#in-memory-backend
Показать ещё 5 комментариев
6

Если вы участвуете в модульном тестировании, лучшим решением является использование внутренней памяти, предоставляемой django.

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

Возьмите пример использования py.test

@pytest.fixture(autouse=True)
def email_backend_setup(self, settings):
    settings.EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'  

В каждом тесте mail.outbox есть reset с сервером, поэтому между тестами нет побочных эффектов.

from django.core import mail

def test_send(self):
    mail.send_mail('subject', 'body.', '[email protected]', ['[email protected]'])
    assert len(mail.outbox) == 1

def test_send_again(self):
    mail.send_mail('subject', 'body.', '[email protected]', ['[email protected]'])
    assert len(mail.outbox) == 1
4

Django также имеет встроенный адрес электронной почты. Подробнее в документах под Внутренняя память. Это присутствует в Django 1.6, не уверен, что он присутствует в чем-то ранее.

4

Для любого проекта, который не требует отправки вложений, я использую django-mailer, который имеет преимущество всех исходящих писем, заканчивающихся в очереди, пока я не инициирую их отправку, и даже после того, как они были отправлены, они будут записаны в журнал - все это видно в Admin, что позволяет быстро проверить, что вы пытаетесь отправить по электронной почте в межтрубку.

  • 0
    В дополнение к этому объекты Message, созданные django-mailer, означают, что вы можете подталкивать их (и проверять их содержимое) также в модульных тестах (я знаю, что в наборе тестов для фиктивного почтового ящика есть поддержка исходящих почтовых ящиков, но использование django-mailer отправлять почту, если только команда управления не отправит ее, что означает, что вы не можете использовать этот объект почтового ящика)
  • 0
    Обновление, возраст от моего первоначального ответа: github.com/SmileyChris/django-mailer-2 тоже поддерживает вложения
3

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

1

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

1

Используйте MailHog

Вдохновленный MailCatcher, проще установить.

Встроенный Go-MailHog работает без установки на нескольких платформах.


Кроме того, у него есть компонент Jim, MailHog Chaos Monkey, который позволяет тестировать отправку писем с различными проблемами:

Что может сделать Джим?

  • Отклонить соединения
  • Ограничения скорости передачи
  • Отклонить аутентификацию
  • Отклонить отправителей
  • Отклонить получателей

Подробнее об этом здесь.


(В отличие от оригинального mailcatcher, который провалился во мне при отправке писем с emoji, закодированных в UTF-8, и он НЕ НАЙТИ текущий выпуск, MailHog просто работает.)

1

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

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

0

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

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

См. сообщение в блоге: PostHoc: Тестирование приложений, отправляющих электронную почту

0

Мое решение - это запись содержимого в html файл. Этот способ поможет вам понять, как выглядит электронная почта. Я оставляю его здесь htmlfilebased.EmailBackend.

Другой совет: вы можете использовать редактор шаблонов электронной почты django, который поможет вам отредактировать шаблон электронной почты с нулевым встроенным css.

0

Я предпочитаю настоящую отправку электронной почты через mailinator сервис:

import time
import uuid
import unittest
import urllib2

class TestEmailSending(unittest.TestCase):

    def test_sending(self):

        random = str(uuid.uuid4())
        mailbox_name = random
        email_addr = "%[email protected]" % mailbox_name
        email_subject = "subject-"+random

        # Send email
        ...............

        print "Wait for 30 sec..."
        time.sleep(30)

        mailbox_feed = "http://mailinator.com/feed?to=" + mailbox_name
        response = urllib2.urlopen(mailbox_feed)
        mailbox_data = response.read()

        self.assertTrue(("<title>%s</title>" % email_subject) in mailbox_data)
0

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

https://github.com/ThiefMaster/maildump

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

Однако для этого требуется Python 2.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню