Django 1.11 - Как отправлять почту, используя почтовый сервер, который поддерживает только аутентификацию NTLM - PullRequest
0 голосов
/ 20 апреля 2020

Я использую Django 1.11 и хочу отправлять почту, используя сервер Exchange 2013, который поддерживает только NTLM для аутентификации SMTP. Я понял, что бэкэнд электронной почты по умолчанию django.core.mail.backends.smtp.EmailBackend поддерживает только LOGIN, PLAIN или CRAM-MD5 для аутентификации. К счастью, я нашел другой многообещающий бэкэнд (https://github.com/shadiakiki1986/django-smtp-ntlm-backend) для SMTP с аутентификацией NTLM. Установка серверной части прошла успешно, но она не работает.

На консоли 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

Эти настройки работают нормально при тестировании SMTP инструмент под названием Swaks. У кого-нибудь есть опыт использования аутентификации Exchange и NTLM для отправки писем с Django 1.11? Я могу себе представить, что с более новой версией Django и Python 3 все может быть проще из-за изменений в базовом smtplib, но я застрял на Django 1.11. Я благодарен за любые подсказки.

1 Ответ

0 голосов
/ 24 апреля 2020

Отладка smtplib выявила фактический ответ об ошибке Exchange:

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

Оказалось, что Exchange проверяет имя и / или домен отправляющего хоста. Моим именем хоста был случайный идентификатор контейнера, назначенный Docker. Мне пришлось изменить полное доменное имя на что-то реальное (например, mail.google.com) в файле Docker Compose, и тогда оно заработало.

...