Подтвердить что ты не робот

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

Любые советы по тестированию отправки электронной почты? Помимо создания учетной записи Gmail, особенно для получения этих писем?

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

4b9b3361

Ответ 1

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

Ответ 2

В тестовой среде 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

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

Ответ 5

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

Ответ 7

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

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

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


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

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

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

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


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

Ответ 8

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

Ответ 9

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

Ответ 10

Я предпочитаю настоящую отправку электронной почты через 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)

Ответ 11

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

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

Ответ 12

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

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

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

Ответ 13

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

Ответ 14

Здесь мы свяжем несколько частей вместе, здесь простая настройка, основанная на filebased.EmailBackend. Это отображает представление списка, связанное с отдельными файлами журнала, которые имеют удобные метки времени. Нажав на ссылку в списке, вы увидите это сообщение в браузере (необработанное):

настройки

EMAIL_BACKEND = "django.core.mail.backends.filebased.EmailBackend"
EMAIL_FILE_PATH = f"{MEDIA_ROOT}/email_out"

Посмотреть

import os

from django.conf import settings
from django.shortcuts import render

def mailcheck(request):

    path = f"{settings.MEDIA_ROOT}/email_out"
    mail_list = os.listdir(path)

    return render(request, "mailcheck.html", context={"mail_list": mail_list})

шаблон

{% if mail_list %}
  <ul>
  {% for msg in mail_list %}
    <li>
      <a href="{{ MEDIA_URL }}email_out/{{msg}}">{{ msg }}</a>
    </li>
  {% endfor %}
  </ul>
{% else %}
  No messages found.
{% endif %}

URLs

path("mailcheck/", view=mailcheck, name="mailcheck"),

Ответ 15

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

https://github.com/ThiefMaster/maildump

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

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