2010-09-16 128 views
56

测试电子邮件发送的任何提示?除了可能创建一个Gmail帐户,尤其是接收这些电子邮件?测试电子邮件发送

我想将电子邮件本地存储在发送文件夹中。

+0

主持人:请锁定这个问题。答案中增加了大量垃圾邮件,提出的解决方案非常复杂以促进外部服务。 – nemesisdesign 2018-02-18 15:59:00

回答

31

您可以使用file backend for sending emails这是一个非常方便的开发和测试解决方案;电子邮件不会发送,但存储在您可以指定的文件夹中!

+1

有关电子邮件后端的更多信息:https://docs.djangoproject.com/en/dev/topics/email/#email-backends。 有时候,即使是简单的控制台后端也是足够的。 – Jeewes 2014-05-14 19:26:56

4

对于不需要发送附件的任何项目,我用django-mailer,它在队列中结束了,直到我触发其发送所有出站电子邮件的利益,甚至后他们已经被发送,然后他们被记录下来 - 所有这些都可以在管理员中看到,这样就可以很容易地快速检查你的电子邮件代码试图发送到intertubes中。

+0

除此之外,由django-mailer创建的消息对象意味着你可以在单元测试中刺激它们(并检查它们的内容)(我知道测试套件中有出站邮箱支持对于一个虚拟邮箱,但使用Django的邮件不发送邮件,除非管理命令发送它,这意味着你不能使用该邮箱对象) – 2010-09-16 16:38:48

+0

更新,从我原来的回答年龄:https://github.com/SmileyChris/django-mailer-2也支持附件 – 2013-05-04 21:22:14

139

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') 
+3

+1好答案。但是当我不能使用'send_mail'的时候,它对于复杂的情况并不有用。 – santiagobasulto 2013-02-08 19:21:45

+2

更确切地说,文档在这里:https://docs.djangoproject.com/en/1.8/topics/email/#in-memory-backend – nimiq 2015-11-30 13:21:30

+2

如果你测试了一个调用send_mail的函数,你会如何做到这一点,无法访问邮件? – 2017-06-18 02:03:47

1

使用文件后端运作良好,但我觉得有点繁琐闲逛文件系统看电子邮件。您可以使用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 
4

的Django也有一个内存中的电子邮件后端。更多详情,请参阅In-memory backend下的文档。这在Django 1.6中是存在的,不知道它是否存在于任何早期的东西中。

-1

使用Maildump。

https://github.com/ThiefMaster/maildump

MailDump是真棒MailCatcher工具的基于Python的克隆。其 的目的是为开发者提供一种让应用程序发送电子邮件 的方式,而无需将实际的电子邮件发送给任何人。另外,懒惰的 开发人员可能更喜欢使用真实的SMTP服务器,因为它设置起来更简单快捷。

但是它需要Python 2

6

如果你到单元测试的最佳解决方案就是使用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 
0

我的解决方案是将内容写入html文件。这样可以帮助您了解电子邮件的外观。我把它留在这里htmlfilebased.EmailBackend

其他提示:您可以使用django email template editor,它可以帮助您编辑您的电子邮件模板与零内联CSS。

0

使用MailHog

通过MailCatcher的启发,更容易安装。

使用Go构建 - MailHog无需在多个平台上安装即可运行。


此外,它有一个名为吉姆,则MailHog混沌猴组件,它使您能够测试各种问题发送电子邮件发生的事情:

能有什么吉姆做?

  • 拒绝连接
  • 限速连接
  • 拒绝认证
  • 拒绝发件人
  • 拒绝收件人

了解更多关于它here


(不像原来mailcatcher,这failed on me when sending emails with emoji, encoded in UTF-8,它并没有真正固定在当前版本中,MailHog只是工作。)

0

为什么不继承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环路(从听停止服务器)。

0

如果您有TomCat服务器或其他servlet引擎,那么一个很好的方法是“Post Hoc”,它是一个小型服务器,它看起来像应用程序一样完全像SMTP服务器,但它包含一个用户界面,允许您可以查看和检查发送的电子邮件。它是开源的,免费提供。

搜寻在:Post Hoc GitHub Site

查看博客文章:PostHoc: Testing Apps that Send Email

0

https://websocket.email提供了一种简单的方法来测试电子邮件以最小的设置发送(你甚至不需要一个账户)。