TimeoutError - Traceback (последний вызов был последним), Django-app - отправка электронной почты.питон - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь использовать mailgun и gmail mail для отправки писем из моего приложения Django, но каждый раз получаю сообщение об ошибке.

В моем приложении у меня есть следующий код:

settings.py

EMAIL_HOST = 'smtp.mailgun.org'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'aaa@mg.xxx.com'
EMAIL_HOST_PASSWORD = '#########'
EMAIL_USE_TLS = True

, затем я запускаю команду из командной строки:

manage.py shell

[1] from django.core.mail import send_mail
[2] send_mail('subject', 'body of the message', 'aaa@mg.xxx.com', ['
recipient@aaa.com'])

Я использую gmail, или с 'mailguna' всегда получаю ту же ошибку

Ошибка:

TimeoutError                              Traceback (most recent call last)
<ipython-input-27-4c559962ca7f> in <module>()
----> 1 send_mail('subject', 'body of the message', '###@mg.###.com', ['###@###.com'])

~\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\mail\__init__.py in send_mail(subject, message, from_email, recipient_list, fail_silently, auth_user, auth_password, connection, html_message)
     58         mail.attach_alternative(html_message, 'text/html')
     59
---> 60     return mail.send()
     61
     62

~\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\mail\message.py in send(self, fail_silently)
    289             # send to.
    290             return 0
--> 291         return self.get_connection(fail_silently).send_messages([self])
    292
    293     def attach(self, filename=None, content=None, mimetype=None):

~\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\mail\backends\smtp.py in send_messages(self, email_messages)
    101             return
    102         with self._lock:
--> 103             new_conn_created = self.open()
    104             if not self.connection or new_conn_created is None:
    105                 # We failed silently on open().

~\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\mail\backends\smtp.py in open(self)
     61             })
     62         try:
---> 63             self.connection = self.connection_class(self.host, self.port, **connection_params)
     64
     65             # TLS/SSL are mutually exclusive, so only attempt TLS over

~\AppData\Local\Programs\Python\Python37-32\lib\smtplib.py in __init__(self, host, port, local_hostname, timeout, source_address)
    249
    250         if host:
--> 251             (code, msg) = self.connect(host, port)
    252             if code != 220:
    253                 self.close()

~\AppData\Local\Programs\Python\Python37-32\lib\smtplib.py in connect(self, host, port, source_address)
    334         if self.debuglevel > 0:
    335             self._print_debug('connect:', (host, port))
--> 336         self.sock = self._get_socket(host, port, self.timeout)
    337         self.file = None
    338         (code, msg) = self.getreply()

~\AppData\Local\Programs\Python\Python37-32\lib\smtplib.py in _get_socket(self, host, port, timeout)
    305             self._print_debug('connect: to', (host, port), self.source_address)
    306         return socket.create_connection((host, port), timeout,
--> 307                                         self.source_address)
    308
    309     def connect(self, host='localhost', port=0, source_address=None):

~\AppData\Local\Programs\Python\Python37-32\lib\socket.py in create_connection(address, timeout, source_address)
    725
    726     if err is not None:
--> 727         raise err
    728     else:
    729         raise error("getaddrinfo returns an empty list")

~\AppData\Local\Programs\Python\Python37-32\lib\socket.py in create_connection(address, timeout, source_address)
    714             if source_address:
    715                 sock.bind(source_address)
--> 716             sock.connect(sa)
    717             # Break explicitly a reference cycle
    718             err = None

TimeoutError: [WinError 10060]

Я пытался изменить настройки «TLS», «почтовый порт» и «SSL», но они всегда заканчивались одной и той же ошибкой.

Когда код выполняется снаружив приложении все отлично работает:

file_works_properly.py

import smtplib

from email.mime.text import MIMEText

msg = MIMEText('Title')  #Tresc wiadomosci
msg['Subject'] = "Hello world"
msg['From']    = "XXX@mg.bbb.com"
msg['To']      = "ccc@ccc.com"

s = smtplib.SMTP('smtp.mailgun.org', 587)

s.login('###@mg.bbb.com', '3###baa5e1f3###-26fa###0987')
s.sendmail(msg['From'], msg['To'], msg.as_string())
s.quit()

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 28 ноября 2018

Добавление трех импортов решило мою проблему (для 'python manage.py shell' или в файл views.py):

импорт (в views.py/shell):

from django.contrib import messages
from django.core.mail import send_mail
from django.conf import settings

Остальные действия без изменений:

settings.py

[...]
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'myemail@gmail.com'
EMAIL_HOST_PASSWORD = 'mypassowrd'
EMAIL_PORT = 587

Для отправки электронной почты(в views.py/shell)

send_mail(subject, message, from_email, [to_list_email])

(* Важно для gmail.com) - и часто этот параметр должен быть включен.

...