生产服务器上的 Django 电子邮件超时

标签 django apache ubuntu smtp

我最近将我在 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/

相关文章:

python - Django - 自定义模板标签传递关键字参数

php - 如何在 .htaccess 文件中禁用 mod_security?

java - Wicket setPageExpiredErrorPage 仅针对特定页面?

apache - 如何更正(Wicket in)Tomcat at/myapp behinds Apache proxy at/that send incorrect redirect to/myapp/xxx instead of/xxx?

java - 如何将数据从bash脚本正确传递到java应用程序

ruby-on-rails - 错误 : Error installing racc: ERROR: Failed to build gem native extension

docker - Gitlab-runner:在根目录中找不到docker或docker-compose,但它们已经安装

sql - PostgreSQL、外键、插入速度和 Django

jquery - 从下拉菜单中获取选定元素的列表到 Django View

django - 在 Django 中的多个字段上进行关键字搜索