У меня есть настройка, в которой я использую «send_mail» для отправки электронных писем пользователям, использующим учетную запись Gmail. По какой -то причине эта функция возвращает «smtplib.smtpserverdisconnected: соединение неожиданно закрыто». > Если я просто создаю скрипт с помощью Smtplib, он работает. Я не уверен, как именно отлаживать эту проблему. < /P>
Изменить 1:
'send_mail', кажется, работает, если я удалю "** connection_params "От перехода в" self.connection_class "в строке 81 в 'django/core/mail/backends/smtp.py'
Редактировать 2:
изменение" Smtpobj = smtplib .Smtp ('smtp-relay.gmail.com', 587) "to" smtpobj = smtplib.smtp ('smtp-relay.gmail.com', 587, local_hostname = 'localhost') «Результаты в той же ошибке в случае Smtplib
Проблемы, по -видимому, заключаются в следующем:
значение "localhost" назначается "connection_params" в строке 69 в 'django/core/mail/backends/smtp .py 'Следующим образом (вы можете заметить, что нет «if», проверка, как гласит комментарий): < /p>
...
# 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()}
...
< /code>
Проблема в том, что, насколько я вижу, невозможно назначить 'local_hostname', и нет способа установить его ни один < /p>
РЕДАКТИРОВАТЬ 3:
Похоже, Django пытается сделать «socket.getfqdn ()», который возвращает «localhost», но «Localhost» не полностью квалифицирован. Smtplib делает то же самое «socket.getfqdn ()», но проверьте на локальный хост и устанавливает его на '127.0.0.1' вместо Значение «local_hostname» и автоматическое установление его в «Localhost», которое не полностью квалифицировано. settings.py < /p>
...
EMAIL_HOST = 'smtp-relay.gmail.com'
EMAIL_HOST_USER = "myemail@costumgmail.com"
EMAIL_HOST_PASSWORD = "mypass"
EMAIL_PORT = 587
EMAIL_USE_TLS = True
...
< /code>
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
< /code>
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
< /code>
traceback от django: < /p>
Traceback (most recent call last):
File "", line 1, in
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
Подробнее здесь: https://stackoverflow.com/questions/730 ... plib-works