【问题标题】:How can I send emails in Django using smtp.EmailBackend without authenticating with the mail server如何使用 smtp.EmailBackend 在 Django 中发送电子邮件而无需通过邮件服务器进行身份验证
【发布时间】: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

【问题讨论】:

  • 不,您会收到该错误,因为您的服务器需要身份验证。
  • 我不这么认为....

标签: django email smtp django-settings django-email


【解决方案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 中看到的,这些选项是

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

    【讨论】:

      猜你喜欢
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 2015-05-05
      • 1970-01-01
      相关资源
      最近更新 更多