Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中测试电子邮件发送_Python_Django_Email_Smtp_Django Testing - Fatal编程技术网

Python 在Django中测试电子邮件发送

Python 在Django中测试电子邮件发送,python,django,email,smtp,django-testing,Python,Django,Email,Smtp,Django Testing,我需要测试我的Django应用程序是否发送内容正确的电子邮件。我不想依赖外部系统(如临时帐户),因为我没有测试实际的电子邮件服务 我想,也许,存储在本地的电子邮件,在一个文件夹中,因为他们是发送。 关于如何实现它的任何提示?您可以使用一个非常方便的开发和测试解决方案;电子邮件不会发送,但会存储在您可以指定的文件夹中 为测试目的修补SMTPLib可以帮助测试在不发送邮件的情况下发送邮件 对于任何不需要发送附件的项目,我使用,它的好处是所有出站电子邮件都会在队列中结束,直到我触发它们的发送,甚至

我需要测试我的Django应用程序是否发送内容正确的电子邮件。我不想依赖外部系统(如临时帐户),因为我没有测试实际的电子邮件服务

我想,也许,存储在本地的电子邮件,在一个文件夹中,因为他们是发送。
关于如何实现它的任何提示?

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

为测试目的修补SMTPLib可以帮助测试在不发送邮件的情况下发送邮件


对于任何不需要发送附件的项目,我使用,它的好处是所有出站电子邮件都会在队列中结束,直到我触发它们的发送,甚至在它们被发送后,它们也会被记录下来-所有这些都可以在管理员中看到,使您能够轻松快速地检查发送电子邮件的代码试图发送到Intertube中的内容。

Django测试框架有一些内置的帮助程序来帮助您进行测试

文档示例(简短版本):


Django还有一个内存中的电子邮件后端。更多详细信息,请参阅下面的文档。这在Django 1.6中存在,不确定它是否存在于任何早期版本中。

如果您正在进行单元测试,最好的解决方案是使用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
都会被服务器重置,因此测试之间没有副作用

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
使用

灵感来源于MailCatcher,易于安装

使用Go-MailHog构建,无需在多个平台上安装


此外,它还有一个名为“Jim”的组件,即“MailHog混沌猴子”(MailHog Chaos Monkey),它使您能够在出现各种问题时测试发送电子邮件:

吉姆能做什么

  • 拒绝连接
  • 速率限制连接
  • 拒绝认证
  • 拒绝发件人
  • 拒绝收件人
阅读更多关于它的信息



(与原始的mailcatcher不同,MailHog在当前版本中并没有得到真正的修复,它只起作用。)

为什么不通过继承和启动您自己的真正简单的SMTP服务器呢:

只要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循环(停止服务器侦听)。

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

请访问:


请参阅博文:

将其中的几部分放在一起,下面是一个基于
filebased.EmailBackend
的简单设置。这将呈现一个链接到各个日志文件的列表视图,这些日志文件具有方便的时间戳文件名。单击列表中的链接将在浏览器中显示该消息(原始):

设置

EMAIL_BACKEND = "django.core.mail.backends.filebased.EmailBackend"
EMAIL_FILE_PATH = f"{MEDIA_ROOT}/email_out"
path("mailcheck/", view=mailcheck, name="mailcheck"),
查看

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 %}

此外,django mailer创建的消息对象意味着您也可以在单元测试中生成它们(并检查它们的内容)(我知道测试套件中有针对虚拟邮箱的出站邮箱支持,但使用django mailer不会发送邮件,除非管理命令发送邮件,这意味着您不能使用该邮箱对象)更新,从我的原始答案开始:也支持附件+1好答案。但我觉得这对复杂的案子没用,当
send\u-mail
无法使用时。更准确地说,文档在这里:如果您测试一个调用send\u-mail的函数,因此无法访问
mail
,您将如何执行此操作?@MatthewDrill在另一个函数中调用
send\u-mail
时,您仍然可以访问
mail.outbox
。@pymarco如果您从核心,
mail.outbox[0]。正文
将向您显示发送的电子邮件,即使在其他地方执行了
发送邮件
。有关电子邮件后端的详细信息:。有时,即使是简单的控制台后端也足够了。但是在(自动)测试期间,有没有办法访问生成的电子邮件?主持人:请锁定此问题。答案中添加了大量垃圾邮件,提出的解决方案复杂得可笑,只是为了推广外部服务。
{% 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"),