如何使用 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_USER
和EMAIL_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_USER
和EMAIL_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 中发送电子邮件而无需通过邮件服务器进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章