Любые советы по тестированию отправки электронной почты? Помимо создания учетной записи Gmail, особенно для получения этих писем?
Я хотел бы, может быть, хранить электронные письма локально, в папке по мере их отправки.
Любые советы по тестированию отправки электронной почты? Помимо создания учетной записи Gmail, особенно для получения этих писем?
Я хотел бы, может быть, хранить электронные письма локально, в папке по мере их отправки.
Вы можете использовать файловый сервер для отправки писем, который является очень удобным решением для разработки и тестирования; электронные письма не отправляются, а сохраняются в папке, которую вы можете указать!
В тестовой среде 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')
Если вы участвуете в модульном тестировании, лучшим решением является использование внутренней памяти, предоставляемой 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
Для любого проекта, который не требует отправки вложений, я использую django-mailer, который имеет преимущество в том, что все исходящие письма заканчиваются в очереди, пока я не инициирую их отправку, и даже после того, как они были отправлены, они затем регистрируются - все это видно в Админе, что позволяет легко проверить, какой код электронной почты вы пытаетесь запустить в промежутках.
Django также имеет встроенный адрес электронной почты. Подробнее в документах под Внутренняя память. Это присутствует в Django 1.6, не уверен, что он присутствует в чем-то ранее.
Патчи SMTPLib для тестирования могут помочь протестировать отправку писем без их отправки.
Используйте MailHog
Вдохновленный MailCatcher, проще установить.
Встроенный Go-MailHog работает без установки на нескольких платформах.
Кроме того, у него есть компонент Jim, MailHog Chaos Monkey, который позволяет тестировать отправку писем с различными проблемами:
Что может сделать Джим?
- Отклонить соединения
- Ограничения скорости передачи
- Отклонить аутентификацию
- Отклонить отправителей
- Отклонить получателей
Подробнее об этом здесь.
(В отличие от оригинального mailcatcher, который провалился во мне при отправке писем с emoji, закодированных в UTF-8, и он НЕ НАЙТИ текущий выпуск, MailHog просто работает.)
Использование бэкэнда файла работает хорошо, но я считаю, что немного сложнее совать файловую систему, чтобы посмотреть на электронные письма. Вы можете использовать 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
Почему бы не начать свой собственный действительно простой 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()
, чтобы закончить цикл асинхронизации (остановить прослушивание сервера).
Я предпочитаю настоящую отправку электронной почты через 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)
Мое решение - это запись содержимого в html файл. Этот способ поможет вам понять, как выглядит электронная почта. Я оставляю его здесь htmlfilebased.EmailBackend.
Другой совет: вы можете использовать редактор шаблонов электронной почты django, который поможет вам отредактировать шаблон электронной почты с нулевым встроенным css.
Если у вас есть доступный сервер TomCat или другой механизм сервлетов, тогда хороший подход - "Post Hoc", который является небольшим сервером, который смотрит на приложение точно так же, как SMTP-сервер, но включает в себя пользовательский интерфейс, который позволяет вам для просмотра и проверки отправленных сообщений электронной почты. Он доступен с открытым исходным кодом и свободно доступен.
Найдите его по адресу: Post Hoc GitHub Site
См. сообщение в блоге: PostHoc: Тестирование приложений, отправляющих электронную почту
https://websocket.email предоставляет простой способ проверить отправку электронной почты с минимальной настройкой (вам даже не нужна учетная запись).
Здесь мы свяжем несколько частей вместе, здесь простая настройка, основанная на 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"),
Использовать Maildump.
https://github.com/ThiefMaster/maildump
MailDump - это клон на основе python из удивительного средства MailCatcher. это Цель - предоставить разработчикам возможность отправлять приложениям электронные письма без фактических писем, отправленных кому-либо. Дополнительно ленивый разработчики могут предпочесть это на реальном SMTP-сервере просто для ради этого было намного проще и быстрее настроить.
Однако для этого требуется Python 2.