【问题标题】:Django Email Timeout on Production Server生产服务器上的 Django 电子邮件超时
【发布时间】: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

如果我遗漏了任何重要的信息,我很乐意为此添加更多信息。这是我第一次尝试将站点部署到远程服务器,所以请记住,这对我来说有点陌生。

【问题讨论】:

    标签: django apache ubuntu smtp


    【解决方案1】:

    如果您使用 Linode 部署您的网站,请注意默认情况下会阻止 587 端口。 我花了 2 天时间才弄明白。

    【讨论】:

      猜你喜欢
      • 2017-11-04
      • 2021-04-28
      • 1970-01-01
      • 2018-01-02
      • 2012-01-12
      • 2013-11-13
      • 2021-05-25
      • 2012-08-24
      • 2012-04-04
      相关资源
      最近更新 更多