Я недавно развернул сайт, который я разработал в Django, на производственном сервере с Ubuntu 19.10 и Apache / 2.4.41. Я смог заставить мой сайт функционировать во всех отношениях, за исключением отправки электронной почты с использованием SMTP. При запуске моего сайта на сервере разработки на моем локальном компьютере Django может отправлять электронные письма без проблем, но на рабочем сервере любая попытка сайта отправить электронную почту зависает и в конечном итоге приводит к ошибке сервера. В Apache error.log я нахожу это в нижней части трассировки: TimeoutError: [Errno 110] Connection timed out
. Любопытно, что эта проблема сохраняется, если я включаю порт 8000 и запускаю этот сайт с сервера разработки Django с удаленного компьютера.
Я убедился, что мой файл settings.py настроен правильно (так как я упомянул, что это прекрасно работает на моем локальном компьютере).
settings.py
...
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = site_config.get('EMAIL_USER')
EMAIL_HOST_PASSWORD = site_config.get('EMAIL_PASS')
Я подозреваю, что проблема должна быть связана с моим брандмауэром, блокирующим исходящий трафик c на порту 587, но я дважды проверил свои настройки и не мог понять, как это могло быть. Я даже вручную установил правила, чтобы разрешить исходящий трафик c через порты 587 и 25, но безуспешно.
ufw status
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
587 ALLOW OUT Anywhere
25/tcp ALLOW OUT Anywhere
587 (v6) ALLOW OUT Anywhere (v6)
25/tcp (v6) ALLOW OUT Anywhere (v6)
Я пытался проверить, что могу установить sh SMTP-соединения вообще, используя совет, предложенный в этом посте , и там также произошла ошибка тайм-аута.
Все похоже, это указывает на какую-то ошибку в настройке моего брандмауэра и / или Apache, но после прочтения ряда сообщений в SO и других местах я чувствую, что у меня закончились идеи.
Наконец, вот что я вижу в журнале ошибок:
/ var / log / apache2 / error.log
log: ERROR - Internal Server>
Traceback (most recent call last):
File "/home/user/mysite/venv>
response = get_response(request)
File "/home/user/mysite/venv>
response = self.process_exception_by_middleware(e,>
File "/home/user/mysite/venv>
response = wrapped_callback(request, *callback_arg>
File "/home/user/mysite/venv>
return self.dispatch(request, *args, **kwargs)
File "/home/user/mysite/venv>
return bound_method(*args, **kwargs)
File "/home/user/mysite/venv>
response = view_func(request, *args, **kwargs)
File "/home/user/mysite/venv>
return super().dispatch(*args, **kwargs)
File "/home/user/mysite/venv>
return handler(request, *args, **kwargs)
File "/home/user/mysite/venv>
return self.form_valid(form)
File "/home/user/mysite/venv>
form.save(**opts)
File "/home/user/mysite/venv>
user_email, html_email_template_name=html_email_te>
File "/home/user/mysite/venv>
email_message.send()
File "/home/user/mysite/venv>
return self.get_connection(fail_silently).send_mes>
File "/home/user/mysite/venv>
new_conn_created = self.open()
File "/home/user/mysite/venv>
self.connection = self.connection_class(self.host,>
File "/usr/lib/python3.7/smtplib.py", line 251, in _>
(code, msg) = self.connect(host, port)
File "/usr/lib/python3.7/smtplib.py", line 336, in c>
self.sock = self._get_socket(host, port, self.time>
File "/usr/lib/python3.7/smtplib.py", line 307, in _>
self.source_address)
File "/usr/lib/python3.7/socket.py", line 727, in cr>
raise err
File "/usr/lib/python3.7/socket.py", line 716, in cr>
sock.connect(sa)
TimeoutError: [Errno 110] Connection timed out
I ' Я с радостью добавлю больше информации, если есть что-то важное, что я пропустил. Это моя первая попытка развертывания сайта на удаленном сервере, поэтому имейте в виду, что для меня все это немного ново.