Django send_mail не работает, в то время как smtplib работает

У меня есть установка, в которой я использую "send_mail" для отправки писем пользователям, использующим учетную запись gmail. По какой-то причине эта функция возвращает "smtplib.SMTPServerDisconnected: Соединение неожиданно закрыто".

Я использую учетную запись gmail с включенной двухфакторной защитой и паролем приложения.

Если я просто создаю скрипт с использованием smtplib, он работает. Я не уверен, как именно отлаживать эту проблему.


Редактирование 1: 'send_mail' Кажется, работает, если я удалю "**connection_params" из передачи в "self.connection_class" на строке 81 в 'django/core/mail/backends/smtp.py'

Редактирование 2: Замена "smtpObj = smtplib.SMTP('smtp-relay.gmail.com', 587)" на "smtpObj = smtplib.SMTP('smtp-relay.gmail.com', 587, local_hostname='localhost')" приводит к той же ошибке в случае smtplib

Похоже, что проблема заключается в следующем: значение "localhost" присваивается "connection_params" на строке 69 в 'django/core/mail/backends/smtp.py' следующим образом:

...
        # If local_hostname is not specified, socket.getfqdn() gets used.
        # For performance, we use the cached FQDN for local_hostname.
        connection_params = {"local_hostname": DNS_NAME.get_fqdn()}
...

Проблема в том, что нет способа назначить 'local_hostname', насколько я могу судить, и нет способа установить его в None

Редактирование 3: Похоже, что Django пытается сделать 'socket.getfqdn()', который возвращает 'localhost', но 'localhost' не является полностью квалифицированным. Smtplib делает тот же 'socket.getfqdn()', но проверяет наличие localhost и вместо него устанавливает значение '127.0.0.1'.

Это похоже на ошибку, поскольку нет возможности установить значение 'local_hostname', и оно автоматически устанавливается на 'localhost', который не является полностью квалифицированным.


Ниже приведены фрагменты кода:

settings.py

...
EMAIL_HOST = 'smtp-relay.gmail.com' 
EMAIL_HOST_USER = "myemail@costumgmail.com" 
EMAIL_HOST_PASSWORD = "mypass" 
EMAIL_PORT = 587 
EMAIL_USE_TLS = True
...

djangotest.py

from django.core.mail import send_mail
send_mail('Django mail', 'This e-mail was sent with Django.', "myemail@costumgmail.com" , ['some.other@mail.com'], fail_silently=False)
# smtplib.SMTPServerDisconnected: Connection unexpectedly closed

smtplibtest.py

from email.message import EmailMessage
import smtplib

email_sender = "myemail@costumgmail.com" 
email_password="mypass"
email_reciever ='some.other@mail.com'

subject = "test"
body = "test"
em = EmailMessage()
em['sender'] = email_sender
em['to'] = email_reciever
em['subject'] = subject
em.set_content(body)

smtpObj = smtplib.SMTP('smtp-relay.gmail.com', 587)
smtpObj.ehlo() # (250, b'smtp-relay.gmail.com at your service, [188.26.233.149]\nSIZE 157286400\n8BITMIME\nSTARTTLS\nENHANCEDSTATUSCODES\nPIPELINING\nCHUNKING\nSMTPUTF8')

smtpObj.starttls() # (220, b'2.0.0 Ready to start TLS')

smtpObj.login(email_sender, email_password) # (235, b'2.7.0 Accepted')

smtpObj.sendmail(email_sender, email_reciever, em.as_string()) # OK

traceback from django:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/root/.virtualenvs/myenv/lib/python3.10/site-packages/django/core/mail/__init__.py", line 87, in send_mail
    return mail.send()
  File "/root/.virtualenvs/myenv/lib/python3.10/site-packages/django/core/mail/message.py", line 298, in send
    return self.get_connection(fail_silently).send_messages([self])
  File "/root/.virtualenvs/myenv/lib/python3.10/site-packages/django/core/mail/backends/smtp.py", line 124, in send_messages
    new_conn_created = self.open()
  File "/root/.virtualenvs/myenv/lib/python3.10/site-packages/django/core/mail/backends/smtp.py", line 87, in open
    self.connection.starttls(
  File "/usr/lib/python3.10/smtplib.py", line 769, in starttls
    self.ehlo_or_helo_if_needed()
  File "/usr/lib/python3.10/smtplib.py", line 612, in ehlo_or_helo_if_needed
    (code, resp) = self.helo()
  File "/usr/lib/python3.10/smtplib.py", line 441, in helo
    (code, msg) = self.getreply()
  File "/usr/lib/python3.10/smtplib.py", line 405, in getreply
    raise SMTPServerDisconnected("Connection unexpectedly closed")
smtplib.SMTPServerDisconnected: Connection unexpectedly closed
Вернуться на верх