如何使用 Sudo 在生产服务器上配置 Django 电子邮件

问题描述

我最近将我在 Django 中开发的网站部署到了运行 Ubuntu 和 Apache 的生产服务器上。

除了在我配置要发送的电子邮件的任何地方发送电子邮件外,该网站在各个方面都在运行,页面不断加载并且没有任何反应,尽管在后端所做的任何信息都像联系我们一样被保存。

在本地主机上,电子邮件运行良好,而在部署的站点上,它只是不发送,页面不断加载。

这是联系我们配置views.py的示例

def contact_us(request):
    if request.method == 'POST':  # check post
        form = ContactForm(request.POST)
        if form.is_valid():
            data = ContactMessage()  # create relation with model
            data.name = form.cleaned_data['name']  # get form input data
            data.email = form.cleaned_data['email']
            data.subject = form.cleaned_data['subject']
            data.message = form.cleaned_data['message']
            data.save()  # save data to table
            messages.success(request,"Your message has ben sent. Thank you for your message.")
            template = render_to_string("marketing/contact_us_email.html",{'first_name': request.user.first_name,'last_name': request.user.last_name,'form': form})

            msg = EmailMessage('Contact Us Message',template,settings.EMAIL_HOST_USER,['email@email.com'])
            msg.content_subtype = "html"  # Main content is Now text/html
            msg.fail_silently = False
            msg.send()
            return HttpResponseRedirect('/')

    form = ContactForm
    context = {'form': form}
    template = 'marketing/contact_us.html'
    return render(request,context)

这是部署 settings.py 中的电子邮件配置

import json
from pathlib import Path

with open('/etc/config.json') as config_file:
    config= json.load(config_file)

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = config.get('EMAIL_USER')
EMAIL_HOST_PASSWORD = config.get('EMAIL_PASSWORD')

在我的 json 文件

{
        "SECRET_KEY":".............................","EMAIL_USER":"............................","EMAIL_PASSWORD":"...................."
}

我已尝试检查 ufw 状态

Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)

我是部署项目的新手,我不知道如何调试这个特定问题。

我尝试了以下命令:

(venv) user@django-server:~/Project$ /var/log/apache2/access.log
-bash: /var/log/apache2/access.log: Permission denied

这是我使用时的日志:sudo tail /var/log/syslog

Jan 24 20:42:48 django-server kernel: [ 6559.610360] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=180.76.76.76 DST=172.105.20.139 LEN=84 TOS=0x00 PREC=0x00 TTL=43 ID=11161 PROTO=ICMP TYPE=0 CODE=0 ID=10784 SEQ=0
Jan 24 20:42:57 django-server kernel: [ 6568.510344] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=194.147.140.103 DST=172.105.20.139 LEN=40 TOS=0x00 PREC=0x00 TTL=245 ID=36909 PROTO=TCP SPT=48813 DPT=4308 WINDOW=1024 RES=0x00 SYN URGP=0
Jan 24 20:43:05 django-server kernel: [ 6576.489136] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=223.5.5.5 DST=172.105.20.139 LEN=84 TOS=0x00 PREC=0x00 TTL=116 ID=11169 PROTO=ICMP TYPE=0 CODE=0 ID=10784 SEQ=0
Jan 24 20:43:16 django-server kernel: [ 6588.096503] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=175.176.40.44 DST=172.105.20.139 LEN=60 TOS=0x08 PREC=0x00 TTL=41 ID=5992 DF PROTO=TCP SPT=58866 DPT=554 WINDOW=65535 RES=0x00 SYN URGP=0
Jan 24 20:43:22 django-server kernel: [ 6594.383419] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=142.250.78.106 DST=172.105.20.139 LEN=60 TOS=0x00 PREC=0x80 TTL=50 ID=14200 PROTO=TCP SPT=443 DPT=53584 WINDOW=65535 RES=0x00 ACK SYN URGP=0
Jan 24 20:43:37 django-server kernel: [ 6609.134643] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=129.6.15.29 DST=172.105.20.139 LEN=76 TOS=0x00 PREC=0x20 TTL=52 ID=33054 PROTO=UDP SPT=123 DPT=123 LEN=56
Jan 24 20:43:42 django-server kernel: [ 6614.123887] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=142.250.78.106 DST=172.105.20.139 LEN=60 TOS=0x00 PREC=0x80 TTL=50 ID=65111 PROTO=TCP SPT=443 DPT=53582 WINDOW=65535 RES=0x00 ACK SYN URGP=0
Jan 24 20:43:56 django-server kernel: [ 6627.945386] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=45.155.205.32 DST=172.105.20.139 LEN=40 TOS=0x00 PREC=0x20 TTL=244 ID=1247 PROTO=TCP SPT=51101 DPT=7993 WINDOW=1024 RES=0x00 SYN URGP=0
Jan 24 20:44:02 django-server kernel: [ 6633.768443] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=142.250.78.106 DST=172.105.20.139 LEN=60 TOS=0x00 PREC=0x80 TTL=50 ID=11134 PROTO=TCP SPT=443 DPT=53579 WINDOW=65535 RES=0x00 ACK SYN URGP=0
Jan 24 20:44:16 django-server kernel: [ 6647.454385] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=154.73.167.39 DST=172.105.20.139 LEN=62 TOS=0x00 PREC=0x00 TTL=51 ID=62076 DF PROTO=UDP SPT=58743 DPT=554 LEN=42
(venv) ahesham@django-server:~/Project$ sudo tail /var/log/syslog
Jan 24 20:44:57 django-server kernel: [ 6688.601259] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=188.210.155.24 DST=172.105.20.139 LEN=60 TOS=0x00 PREC=0x00 TTL=244 ID=29174 DF PROTO=TCP SPT=17692 DPT=554 WINDOW=65535 RES=0x00 SYN URGP=0
Jan 24 20:45:01 django-server CRON[3699]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jan 24 20:45:06 django-server kernel: [ 6698.191321] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=5.52.105.55 DST=172.105.20.139 LEN=40 TOS=0x00 PREC=0x00 TTL=231 ID=3396 DF PROTO=TCP SPT=53854 DPT=554 WINDOW=0 RES=0x00 ACK RST URGP=0
Jan 24 20:45:17 django-server kernel: [ 6709.135708] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=129.6.15.28 DST=172.105.20.139 LEN=76 TOS=0x00 PREC=0x20 TTL=52 ID=46172 PROTO=UDP SPT=123 DPT=123 LEN=56
Jan 24 20:45:36 django-server kernel: [ 6727.528369] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=176.54.129.234 DST=172.105.20.139 LEN=60 TOS=0x08 PREC=0x40 TTL=128 ID=11651 DF PROTO=TCP SPT=25663 DPT=554 WINDOW=65535 RES=0x00 SYN URGP=0
Jan 24 20:45:57 django-server kernel: [ 6748.751374] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=51.39.168.251 DST=172.105.20.139 LEN=1228 TOS=0x00 PREC=0x00 TTL=44 ID=34033 DF PROTO=UDP SPT=2775 DPT=554 LEN=1208
Jan 24 20:46:01 django-server kernel: [ 6752.489383] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=223.5.5.5 DST=172.105.20.139 LEN=84 TOS=0x00 PREC=0x00 TTL=116 ID=11291 PROTO=ICMP TYPE=0 CODE=0 ID=10784 SEQ=0
Jan 24 20:46:04 django-server kernel: [ 6755.471870] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=119.29.29.29 DST=172.105.20.139 LEN=84 TOS=0x08 PREC=0x00 TTL=50 ID=52379 PROTO=ICMP TYPE=0 CODE=0 ID=10784 SEQ=0
Jan 24 20:46:07 django-server kernel: [ 6758.426753] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=114.114.114.114 DST=172.105.20.139 LEN=84 TOS=0x08 PREC=0x20 TTL=80 ID=60475 PROTO=ICMP TYPE=0 CODE=0 ID=10784 SEQ=0
Jan 24 20:46:17 django-server kernel: [ 6769.135354] [UFW BLOCK] IN=eth0 OUT= MAC=f2:3c:92:6a:a2:2e:5a:b0:f6:f2:ad:52:08:00 SRC=129.6.15.28 DST=172.105.20.139 LEN=76 TOS=0x00 PREC=0x20 TTL=52 ID=47969 PROTO=UDP SPT=123 DPT=123 LEN=56

我的问题是这个错误的原因是什么以及如何解决它?

解决方法

要检查您的服务器和 gmail 之间的连接,您只需使用 telnet:

telnet smtp.gmail.com 587

如果你看到这样的东西

Trying 173.194.76.108...
Connected to smtp.gmail.com.
Escape character is '^]'.
220 smtp.gmail.com ESMTP a184sm19715075wme.35 - gsmtp

连接正常,问题出在其他地方(可能在您的代码中)。 如果您收到“连接被拒绝”或“连接超时”的消息,则说明您存在网络问题:您无法通过端口 587 访问 gmail,这可能是由于您和 gmail 之间存在防火墙。您必须启用从服务器到 TCP 端口 587 的传出流量(您或您的网络管理员必须这样做)。我不知道 ufw,但您可以尝试禁用它以查明它是否导致您出现问题:如果它解决了问题,正如我之前所写,您必须配置您的防火墙以允许出站流量到端口 587 TCP。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...