有关测试电子邮件发送的任何提示吗?除了可能创建一个gmail帐户,特别是接收这些电子邮件?
我想将本地电子邮件存储在发送文件夹中。
答案 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.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,您可以随意执行任何操作。
在测试代码中,执行以下操作:
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"这是一个小型服务器,它与应用程序完全一样地查看应用程序,但它包含一个用户界面,允许您查看和检查已发送的电子邮件。它是开源的,免费提供。
找到它答案 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。