我最近将我在 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
如果我遗漏了任何重要的信息,我很乐意向其中添加更多信息。这是我第一次尝试将站点部署到远程服务器,所以请记住,这对我来说还是个新事物。
最佳答案
如果您使用 Linode 部署您的网站,请注意端口 587 默认被阻止。 我花了 2 天时间才弄明白。
关于生产服务器上的 Django 电子邮件超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60019945/