如何使用 smtp.EmailBackend 在 Django 中发送电子邮件而无需通过邮件服务器进行身份验证

Posted

技术标签:

【中文标题】如何使用 smtp.EmailBackend 在 Django 中发送电子邮件而无需通过邮件服务器进行身份验证【英文标题】:How can I send emails in Django using smtp.EmailBackend without authenticating with the mail server 【发布时间】:2019-07-07 08:11:55 【问题描述】:

有没有办法明确告诉 Django 在发送电子邮件时不要向邮件服务器进行身份验证。

我目前在我的 settings.py 中使用以下设置来发送电子邮件。

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'my-mail-server'
EMAIL_PORT = 25

请注意我没有EMAIL_HOST_USEREMAIL_HOST_PASSWORD,而且我使用的 smtp 邮件服务器不需要客户端进行身份验证

编辑: 当我使用这些设置时,我会收到此错误

smtp.SMTPSenderRefused: Client was not authenticated

【问题讨论】:

不,您会收到该错误,因为您的服务器需要身份验证。 我不这么认为.... 【参考方案1】:

您可以使用控制台银行。

它将电子邮件写入标准输出而不是发送。

请参考这个link

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

此后端不适合在生产中使用 - 它是为了在开发过程中使用方便而提供的。

python 也有这个内置的 smtp 服务器here

【讨论】:

感谢您的回答。我有兴趣发送电子邮件而不是将它们记录在控制台上,这就是我使用 django.core.mail.backends.smtp.EmailBackend 的原因【参考方案2】:

如果服务器不需要身份验证,例如 Gmail SMTP 中继(通过 IP 进行身份验证),则需要跳过身份验证步骤。

如果您使用的是django.core.mail.backends.smtp.EmailBackend,您可以在它的代码中找到:

if self.username and self.password:
    self.connection.login(self.username, self.password)

这意味着如果您的用户名或密码为空,EmailBackend 将跳过服务器上的身份验证。

因此,您需要将EMAIL_HOST_USEREMAIL_HOST_PASSWORD 保留为空,或者根本不指定它们。

【讨论】:

【参考方案3】:

就我而言,我使用的是 Gmail 帐户。为此,必须添加您的 settings.py

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = '587'
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'tiagomartinsperes@gmail.com'
EMAIL_HOST_PASSWORD = 'password'

然后,需要确保我的 Gmail 帐户允许应用代表我发送电子邮件。

在 Gmail 中,点击右上角带有图片的图标

然后转到“管理您的 Google 帐户”。

在那里,点击“应用密码”,点击下拉菜单“选择应用”并选择“其他(自定义名称)。

提供您的应用名称,这将生成一个密码。将其复制并粘贴到您的 settings.py 中的EMAIL_HOST_PASSWORD = 'password'

然后该应用出现在列表中

您可以随时删除它。

然后,如果您再次测试,该应用应该可以正常发送电子邮件。


尽管我在这里使用了 Gmail 的特定案例,但类似的过程也必须应用于其他应用程序,例如 Mailgun。


如果您运行的是开发环境,您还有其他选择,即

使用EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'将文件保存到控制台。 使用EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend' 将文件保存到特定文件夹并添加路径EMAIL_FILE_PATH = os.path.join(BASE_DIR,'static','media','email')(这将保存在静态/媒体/电子邮件中)。 使用EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend' 将文件保存为 django.core.mail 的特殊属性(这是 Djano 的测试运行程序自动用于测试的) 使用虚拟后端,它对使用 EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend' 的消息没有任何作用。

请注意,正如我们在documentation 中看到的,这些选项是

不打算在生产中使用——它是为了方便而提供的 可以在开发过程中使用

【讨论】:

以上是关于如何使用 smtp.EmailBackend 在 Django 中发送电子邮件而无需通过邮件服务器进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

yandex 邮件不使用 smtp 发送

Django 1.11-如何使用仅支持NTLM身份验证的邮件服务器发送邮件

使用django进行发送 邮件

在 django 中发送(发件人)邮件配置

利用表单发送邮件

46)django-发送邮件