testing邮件发送
testing电子邮件发送的任何提示? 除了可能创build一个Gmail帐户,尤其是接收这些电子邮件?
我想也许将电子邮件本地存储在发送的文件夹中。
您可以使用文件后端来发送电子邮件 ,这是一个非常方便的开发和testing解决scheme; 电子邮件不发送,但存储在您可以指定的文件夹!
Djangotesting框架有一些内置的帮助程序来帮助您testing电子邮件服务 。
文档示例(简短版本):
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.', 'from@example.com', ['to@example.com'], fail_silently=False) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].subject, 'Subject here')
如果您正在进行unit testing,最好的解决scheme是使用由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'
在每个testing中, mail.outbox
与服务器重置,所以testing之间没有副作用。
from django.core import mail def test_send(self): mail.send_mail('subject', 'body.', 'from@example.com', ['to@example.com']) assert len(mail.outbox) == 1 def test_send_again(self): mail.send_mail('subject', 'body.', 'from@example.com', ['to@example.com']) assert len(mail.outbox) == 1
对于任何不需要发送附件的项目,我都会使用django-mailer ,它有所有出站邮件的优势,直到我触发它们的发送,甚至在它们被发送之后,所有这一切都可以在pipe理员中看到,这样就可以很容易地快速检查您的电子邮件代码是否正尝试将其发送到触发器中。
Django也有一个内存中的电子邮件后端。 内存后端文档中的更多细节。 这是目前在Django 1.6不知道它是否存在于任何早些时候。
为testing目的修补SMTPLib可以帮助testing发送邮件而不发送邮件。
使用文件后端工作得很好,但是我发现在文件系统中查看电子邮件有点麻烦。 您可以使用mailcatcher https://github.com/sj26/mailcatcher来捕获电子邮件并将其显示在Web UI中。
要在Django中使用mailcatcher,您需要在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
使用MailHog
受MailCatcher的启发,更易于安装。
使用Go构build – MailHog在多个平台上运行,无需安装。
此外,它还有一个名为Jim的组件,即MailHog Chaos Monkey ,它可以让您testing发送的各种问题的电子邮件:
吉姆能做什么?
- 拒绝连接
- 速率限制连接
- 拒绝authentication
- 拒绝发件人
- 拒绝收件人
在这里阅读更多关于它。
(不同于原始邮件捕捉器, 当发送带有表情符号的电子邮件时失败了,以UTF-8编码,而且在当前发行版本中没有真正修复,MailHog就可以工作。)
为什么不从smtpd.SMTPServer
和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()
只要您的SMTP服务器收到邮件请求,就会调用process_message,您可以在其中执行任何操作。
在testing代码中,执行如下操作:
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循环(停止服务器的侦听)。
使用Maildump。
https://github.com/ThiefMaster/maildump
MailDump是一个真棒MailCatcher工具的基于python的克隆。 其目的是为开发人员提供一种让应用程序发送电子邮件而不发送实际电子邮件给任何人的方法。 另外懒惰的开发人员可能更喜欢这个实际的SMTP服务器,只是为了更容易,更快速的设置。
但是它需要Python 2。
我更喜欢通过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 = "%s@mailinator.com" % 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)
我的解决scheme是将内容写入一个html文件。 这样可以帮助你看到电子邮件的样子。 我把它留在这里htmlfilebased.EmailBackend 。
其他技巧:您可以使用django电子邮件模板编辑器 ,它可以帮助您编辑您的电子邮件模板与零内联CSS。
如果你有一个TomCat服务器或者其他的servlet引擎,那么一个好的方法就是“Post Hoc”,它是一个小型的服务器,它像一个SMTP服务器一样查看应用程序,但是它包括一个用户界面,允许你查看和检查发送的电子邮件。 它是开源的,免费提供。
find它: Post Hoc GitHub网站
查看博客文章: PostHoc:testing发送电子邮件的应用程序