在没有电子邮件服务器的情况下测试发送电子邮件

Posted

技术标签:

【中文标题】在没有电子邮件服务器的情况下测试发送电子邮件【英文标题】:Test sending email without email server 【发布时间】:2011-06-06 05:37:44 【问题描述】:

我有一个发送电子邮件的 Django 应用程序。生产服务器有一个电子邮件服务器,但我的本地盒子没有。我希望能够在本地测试发送电子邮件。有什么方法可以让 django 不通过电子邮件服务器发送它,而只是打印到文件或控制台?

【问题讨论】:

你的本地盒子的操作系统可能是一个有用的东西在这里知道......你实际上并不需要盒子上的电子邮件服务器,你所需要的只是一个电子邮件的网络连接服务器通过 SMTP 端口...和可能的用户/密码。 Dummy SMTP Server for testing apps that send email 的可能重复项 【参考方案1】:

您可以configure your application to use the Console Backend 发送电子邮件。它将电子邮件写入标准输出而不是发送。

更改您的 settings.py 以包含此行:

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

不要忘记将其删除以进行生产。

【讨论】:

更好的是,将其放在开发设置文件中,不要将其添加到生产环境中。 或者更好的是,do it with environment variables。 如果您使用mail_admins,请记住将ADMINS 设置为某个值,否则不会打印到标准输出。 mail_managers 也是如此。【参考方案2】:

Python 有一个小型 SMTP 服务器 built-in。您可以使用以下命令在第二个控制台中启动它:

python -m smtpd -n -c DebuggingServer localhost:1025

这将简单地在控制台中打印所有发送到localhost:1025 的邮件。

您必须配置 Django 以在您的 settings.py 中使用此服务器:

EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025

【讨论】:

请注意,如果您的应用在电子邮件服务器未启动时尝试发送电子邮件,则可能会引发异常。 fail_silently=Falsesend_mail 的默认值。 虽然 Daniel Hepper 的回答对于所提出的问题无疑是正确的,但我更喜欢这个答案,因为它是一种适用于任何环境的通用解决方案。 (当然,两者都赞成。)【参考方案3】:

您可以将您的应用程序配置为将电子邮件写入临时文件而不是发送它们(类似于 Daniel Hepper 的回答)。

EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = 'tmp/email-messages/'

这会将每条新消息保存为单独的文件。如果您要发送大量电子邮件并且不想使用回滚,这很有用。

【讨论】:

【参考方案4】:

如果您的测试从 django.test.testcases.TestCase 扩展而来,则无需执行任何操作。 Django 会将 EmailBackend 替换为“特殊”的。然后你可以测试这样发送的内容:

def testMethodThatSendAEmail(self):
    ...
    from django.core import mail
    object.method_that_send_email(to='me@example.com')
    self.assertEqual(len(mail.outbox), 1)
    self.assertEqual(mail.outbox[0].to, ['me@example.com'])
    ...#etc

发件箱对象是一个特殊的对象,当 python manage.py 测试运行。

【讨论】:

这太棒了。【参考方案5】:

这详细说明了本杰明的回答。如果我没有安装 postfix、sendmail 或 exim 等本地电子邮件服务器,我测试电子邮件的一种方法是运行 python 电子邮件服务器。您可以使用 sudo 在端口 25 上运行它,或者只使用 > 1024 的端口(保留端口):

python -m smtpd -n -c DebuggingServer localhost:1025
#sudo python -m smtpd -n -c DebuggingServer localhost:25

为了使用您当前的 django 应用程序代码进行测试,您可以临时更改 settings.py 以将其包含在底部:

EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USER, EMAIL_HOST_PASSWORD = 'localhost', 1025, None, None

现在测试您的电子邮件,或者您可以在另一个终端窗口的 ./manage.py shell 中执行此操作,如下所示:

python manage.py shell

并粘贴此代码以发送电子邮件:

from django.core.mail import send_mail​
send_mail('Subject here', 'Here is the message.', 'messanger@localhost.com',['any@email.com'], fail_silently=False)

无需使用任何真实的电子邮件,因为您会在终端中看到所有内容。您可以将其转储到适当的容器中,例如 .html 以进行进一步测试。

【讨论】:

【参考方案6】:

caktus https://github.com/caktus/django-email-bandit 有一个很酷的应用程序 只需将其添加到您的 settings.py 文件中:

EMAIL_BACKEND = 'bandit.backends.smtp.HijackSMTPBackend'
BANDIT_EMAIL = 'your_email@example.com'

在您的电子邮件设置之上..所有电子邮件都将被转移到“your_email@example.com”

编码愉快...

【讨论】:

以上是关于在没有电子邮件服务器的情况下测试发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 SMTP 的情况下从 PHPMAILER 发送电子邮件

如何在没有邮件接收客户端的情况下验证 Mandrill 自定义发送域?

如何在没有通知和确认过程的情况下更改 WordPress 中的主管理员电子邮件地址

使用 play 1.2.4 框架发送电子邮件

如何在没有选择器的情况下从应用程序发送电子邮件? [复制]

是否可以在没有 Mandrill 的情况下使用 Mailchimp 发送交易电子邮件?