测试电子邮件发送
回答
您可以使用file backend for sending emails这是一个非常方便的开发和测试解决方案;电子邮件不会发送,但存储在您可以指定的文件夹中!
有关电子邮件后端的更多信息:https://docs.djangoproject.com/en/dev/topics/email/#email-backends。 有时候,即使是简单的控制台后端也是足够的。 – Jeewes 2014-05-14 19:26:56
为测试目的修补SMTPLib可以帮助测试发送邮件而不发送邮件。
对于不需要发送附件的任何项目,我用django-mailer,它在队列中结束了,直到我触发其发送所有出站电子邮件的利益,甚至后他们已经被发送,然后他们被记录下来 - 所有这些都可以在管理员中看到,这样就可以很容易地快速检查你的电子邮件代码试图发送到intertubes中。
除此之外,由django-mailer创建的消息对象意味着你可以在单元测试中刺激它们(并检查它们的内容)(我知道测试套件中有出站邮箱支持对于一个虚拟邮箱,但使用Django的邮件不发送邮件,除非管理命令发送它,这意味着你不能使用该邮箱对象) – 2010-09-16 16:38:48
更新,从我原来的回答年龄:https://github.com/SmileyChris/django-mailer-2也支持附件 – 2013-05-04 21:22:14
Django测试框架有一些内置的帮助程序来帮助您测试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.',
'[email protected]', ['[email protected]'],
fail_silently=False)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].subject, 'Subject here')
+1好答案。但是当我不能使用'send_mail'的时候,它对于复杂的情况并不有用。 – santiagobasulto 2013-02-08 19:21:45
更确切地说,文档在这里:https://docs.djangoproject.com/en/1.8/topics/email/#in-memory-backend – nimiq 2015-11-30 13:21:30
如果你测试了一个调用send_mail的函数,你会如何做到这一点,无法访问邮件? – 2017-06-18 02:03:47
使用文件后端运作良好,但我觉得有点繁琐闲逛文件系统看电子邮件。您可以使用mailcatcher,https://github.com/sj26/mailcatcher来捕获电子邮件并将其显示在Web UI中。
要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
的Django也有一个内存中的电子邮件后端。更多详情,请参阅In-memory backend下的文档。这在Django 1.6中是存在的,不知道它是否存在于任何早期的东西中。
使用Maildump。
https://github.com/ThiefMaster/maildump
MailDump是真棒MailCatcher工具的基于Python的克隆。其 的目的是为开发者提供一种让应用程序发送电子邮件 的方式,而无需将实际的电子邮件发送给任何人。另外,懒惰的 开发人员可能更喜欢使用真实的SMTP服务器,因为它设置起来更简单快捷。
但是它需要Python 2
如果你到单元测试的最佳解决方案就是使用Django提供的In-memory backend。
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.', '[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
我的解决方案是将内容写入html文件。这样可以帮助您了解电子邮件的外观。我把它留在这里htmlfilebased.EmailBackend。
其他提示:您可以使用django email template editor,它可以帮助您编辑您的电子邮件模板与零内联CSS。
使用MailHog
通过MailCatcher的启发,更容易安装。
使用Go构建 - MailHog无需在多个平台上安装即可运行。
此外,它有一个名为吉姆,则MailHog混沌猴组件,它使您能够测试各种问题发送电子邮件发生的事情:
能有什么吉姆做?
- 拒绝连接
- 限速连接
- 拒绝认证
- 拒绝发件人
- 拒绝收件人
了解更多关于它here。
(不像原来mailcatcher,这failed on me when sending emails with emoji, encoded in UTF-8,它并没有真正固定在当前版本中,MailHog只是工作。)
为什么不继承smtpd.SMTPServer
开始自己的非常简单的SMTP服务器和threading.Thread
:每当你的SMTP服务器接收邮件请求
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_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()
结束asyncore环路(从听停止服务器)。
如果您有TomCat服务器或其他servlet引擎,那么一个很好的方法是“Post Hoc”,它是一个小型服务器,它看起来像应用程序一样完全像SMTP服务器,但它包含一个用户界面,允许您可以查看和检查发送的电子邮件。它是开源的,免费提供。
https://websocket.email提供了一种简单的方法来测试电子邮件以最小的设置发送(你甚至不需要一个账户)。
- 1. 从测试发送电子邮件
- 2. 测试电子邮件发送? - Python/Django
- 3. Django测试发送电子邮件
- 4. 电子邮件发送集成测试
- 5. 检测电子邮件发送的电子邮件客户端
- 6. 测试发送电子邮件没有电子邮件服务器
- 7. 发送电子邮件操作不发送电子邮件
- 8. PHP发送电子邮件多次发送电子邮件
- 9. Laravel单元测试如何使用电子邮件测试事件而不发送电子邮件
- 10. JVM尝试发送电子邮件
- 11. 试图与Python发送电子邮件
- 12. Python:试图发送电子邮件href
- 13. 错误尝试发送电子邮件
- 14. 调试:用PHP发送电子邮件
- 15. 测试事件在Laravel发送电子邮件
- 16. 在Hudson发送测试邮件时发生错误电子邮件通知
- 17. 确定电子邮件发件人并发送电子邮件
- 18. 发送电子邮件Godaddy
- 19. 发送电子邮件proble
- 20. PHP发送电子邮件
- 21. 发送电子邮件nodemailer
- 22. aspx:发送电子邮件
- 23. 发送电子邮件
- 24. django发送电子邮件
- 25. IIS7 - 发送电子邮件
- 26. SparkPost发送电子邮件
- 27. 发送电子邮件
- 28. 发送电子邮件Progrmmatically
- 29. 发送电子邮件?
- 30. 发送电子邮件
主持人:请锁定这个问题。答案中增加了大量垃圾邮件,提出的解决方案非常复杂以促进外部服务。 – nemesisdesign 2018-02-18 15:59:00