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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django 1.11-如何使用仅支持NTLM身份验证的邮件服务器发送邮件相关的知识,希望对你有一定的参考价值。

我正在使用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。我很感谢任何提示。

答案

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),然后它才起作用。

以上是关于Django 1.11-如何使用仅支持NTLM身份验证的邮件服务器发送邮件的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.11 的 django-pyodbc

WCF - 如何为 NTLM 身份验证配置 netTcpBinding?

Python 中的 NTLM 身份验证

同时使用 SSL 加密和 NTLM 身份验证的 HttpClient 失败

使用 Windows Auth NTLM 进行身份验证

在 Java 应用程序中使用 NTLM 身份验证