it-roy-ru.com

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

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

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

71
RadiantHex

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

35
Bernhard Vallant

В тестовой среде 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')
161
Davor Lucic

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

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
12
kiril

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

5
Steve Jalim

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

Вдохновлен MailCatcher, проще в установке.

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


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

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

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

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


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

4
Greg Dubicki

У Django также есть бэкэнд электронной почты в памяти. Больше подробностей в документации в разделе Бэкэнд в памяти . Это присутствует в Django 1.6, но не уверен, есть ли оно ранее.

4
Josh K

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

3
pyfunc

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

Почему бы не запустить свой собственный действительно простой 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
frogcoder

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

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

0
Phuong Vu

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

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

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

0
AgilePro

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

0
Andrew Chambers

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

Настройки

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

View

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 %}

RL

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