【问题标题】:Django 1.11 - How to send mails using a mail server which supports NTLM authentication onlyDjango 1.11 - 如何使用仅支持 NTLM 身份验证的邮件服务器发送邮件
【发布时间】:2020-08-02 16:44:42
【问题描述】:

我正在使用 Django 1.11 并希望使用仅支持 NTLM 进行 SMTP 身份验证的 Exchange 2013 服务器发送邮件。我意识到默认的电子邮件后端django.core.mail.backends.smtp.EmailBackend 仅支持 LOGIN、PLAIN 或 CRAM-MD5 进行身份验证。幸运的是,我为带有 NTLM 身份验证的 SMTP 找到了另一个有前途的后端 (https://github.com/shadiakiki1986/django-smtp-ntlm-backend)。后端安装成功,但无法正常工作。

Python 控制台会发生以下情况:

>>> from django.core.mail import send_mail
>>> send_mail('test subject', 'message', 'email@address.com', ['recipient@gmail.com'], fail_silently=False,)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/django/core/mail/__init__.py", line 62, in send_mail
    return mail.send()
  File "/usr/local/lib/python2.7/site-packages/django/core/mail/message.py", line 348, in send
    return self.get_connection(fail_silently).send_messages([self])
  File "/usr/local/lib/python2.7/site-packages/django/core/mail/backends/smtp.py", line 111, in send_messages
    sent = self._send(message)
  File "/usr/local/lib/python2.7/site-packages/django/core/mail/backends/smtp.py", line 127, in _send
    self.connection.sendmail(from_email, recipients, message.as_bytes(linesep='\r\n'))
  File "smtplib.py", line 736, in sendmail
    self.rset()
  File "smtplib.py", line 470, in rset
    return self.docmd("rset")
  File "smtplib.py", line 395, in docmd
    return self.getreply()
  File "smtplib.py", line 369, in getreply
    raise SMTPServerDisconnected("Connection unexpectedly closed")
smtplib.SMTPServerDisconnected: Connection unexpectedly closed

settings.py中的相关设置:

EMAIL_ENABLE=True
EMAIL_BACKEND=django_smtp_ntlm_backendNTLMEmail 
EMAIL_HOST=<mailserver>
EMAIL_PORT=25
EMAIL_HOST_USER=<domain>\<user>
EMAIL_HOST_PASSWORD=<password>
DEFAULT_FROM_EMAIL=<email>
EMAIL_USE_SSL=False                                                                                                       EMAIL_USE_TLS=False

使用名为 Swaks 的 SMTP 测试工具,这些设置可以正常工作。有人有使用 Exchange 和 NTLM 身份验证通过 Django 1.11 发送电子邮件的经验吗?我可以想象,由于底层 smtplib 的变化,使用更新的 Django 版本和 Python 3 可能会更容易,但我坚持使用 Django 1.11。我很感激任何提示。

【问题讨论】:

    标签: django python-2.7


    【解决方案1】:

    smtplib 的调试揭示了 Exchange 的实际错误响应:

    resp: 5.7.1 This message has been blocked because the HELO/EHLO domain is invalid.

    事实证明,Exchange 会检查发送主机的名称和/或域。我的主机名是 Docker 分配的随机容器 ID。我必须在 Docker Compose 文件中将 FQDN 更改为真实的东西(例如 mail.google.com),然后它才能工作。

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 2016-04-07
      • 2019-07-07
      • 2015-06-06
      • 1970-01-01
      相关资源
      最近更新 更多