【发布时间】:2020-12-07 22:18:32
【问题描述】:
我最近将我用 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')
我怀疑这个问题一定与我的防火墙阻止了端口 587 上的传出流量有关,但我仔细检查了我的设置,但看不出这是怎么回事。我什至手动设置规则以确保端口 587 和 25 上的传出流量,但没有任何成功。
ufw 状态
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)
我已经尝试使用this post 中提供的建议测试我是否能够建立 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
如果我遗漏了任何重要的信息,我很乐意为此添加更多信息。这是我第一次尝试将站点部署到远程服务器,所以请记住,这对我来说有点陌生。
【问题讨论】: