测试邮件发送

时间:2010-09-16 16:08:12

标签: python django email smtp django-testing

有关测试电子邮件发送的任何提示吗?除了可能创建一个gmail帐户,特别是接收这些电子邮件?

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

14 个答案:

答案 0 :(得分:159)

Django测试框架有一些内置帮助程序来帮助您测试e-mail service

docs(简短版)的例子:

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

答案 1 :(得分:35)

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

答案 2 :(得分:12)

如果您正在进行单元测试,最佳解决方案是使用django提供的In-memory backend

replicate

以将其用作 py.test 夹具

的情况为例
EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'

在每次测试中,@pytest.fixture(autouse=True) def email_backend_setup(self, settings): settings.EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend' 都会随服务器重置,因此测试之间没有副作用。

mail.outbox

答案 3 :(得分:5)

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

答案 4 :(得分:4)

Django还有一个内存中的电子邮件后端。 In-memory backend下的文档中的更多详细信息。这存在于Django 1.6中,不确定它是否存在于更早的任何内容中。

答案 5 :(得分:3)

修补SMTPLib以进行测试可以帮助测试发送邮件而不发送邮件。

答案 6 :(得分:2)

使用 MailHog

  

受MailCatcher的启发,更易于安装。

     

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


此外,它还有一个名为 Jim 的组件, MailHog Chaos Monkey ,可让您测试发送各种问题的电子邮件:

  

吉姆可以做什么?

     
      
  • 拒绝连接
  •   
  • 费率限制连接
  •   
  • 拒绝身份验证
  •   
  • 拒绝发件人
  •   
  • 拒绝收件人
  •   

详细了解here


(与原始邮件捕获程序不同,failed on me when sending emails with emoji, encoded in UTF-8并且它在当前版本中并未真正修复,MailHog才有效。)

答案 7 :(得分:1)

使用文件后端效果很好,但我发现在文件系统周围查看电子邮件有点麻烦。您可以使用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

答案 8 :(得分:1)

为什么不通过继承smtpd.SMTPServerthreading.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,您可以随意执行任何操作。

在测试代码中,执行以下操作:

smtp_server = TestingSMTPServer()
smtp_server.start()
do_thing_that_would_send_a_mail()
smtp_server.close()
self.assertIn(b'hello', smtp_server.received_data)

通过调用smtp_server.close()来结束asyncore循环(停止服务器监听),只需记住close() asyncore.dispatcher

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

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

Post Hoc GitHub Site

找到它

请参阅博文:PostHoc: Testing Apps that Send Email

答案 11 :(得分:0)

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

答案 12 :(得分:0)

结合这里的一些内容,这是一个基于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 %}

网址

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

答案 13 :(得分:-1)

使用Maildump。

https://github.com/ThiefMaster/maildump

  

MailDump是一个基于python的真棒MailCatcher工具的克隆。它的   目的是为开发人员提供一种让应用程序发送电子邮件的方法   没有实际的电子邮件发送给任何人。另外懒惰   开发人员可能更喜欢这个而不是真正的SMTP服务器   为了更容易和更快地设置它。

但是它需要Python 2。