【问题标题】:Sending Emails through Django - WinError 10060 A connection attempt failed and GetAddrInfo Error通过 Django 发送电子邮件 - WinError 10060 连接尝试失败和 GetAddrInfo 错误
【发布时间】:2018-12-29 03:35:02
【问题描述】:

我已经在 Windows R2 2012 上运行 Django 实例一年多了,但遇到了障碍。昨天出事了,不知道怎么回事。尽管在尝试发送电子邮件时,相同的两个错误会在不同的时间不断弹出:

[WinError 10060] 连接尝试失败,因为已连接 当事人在一段时间后没有正确回应,或建立 连接失败,因为连接的主机没有响应

socket.gaierror: [Errno 11001] getaddrinfo 失败

用户可以连接到服务器的 IP 地址和 Django 在192.168.1.5:8000 上运行的端口,但他们不能再发送电子邮件了。尽管确实有百分比通过here 的描述,但很少。

我尝试过的事情

1) This solution

import socket
socket.getaddrinfo('localhost', 8000)

因为我在做python manage.py runserver 192.168.1.5:8000,所以我添加了那个IP,什么也没添加。

2) 我进入防火墙设置并确保端口都正常。在我的 Django 项目的 setting.py 文件中声明的 SMTP 和 25 个。所有这些,入站和出站。

3) 我尝试在本地机器上发送东西,它确实有效。我使用了其他不使用 Django 的程序来发送电子邮件,它们确实在除服务器之外的所有其他机器上进行处理。所以我知道这不是我的电子邮件服务器。

4) 我更改了电子邮件配置以使用我的 Gmail 帐户,并且它确实在除服务器之外的所有其他机器上处理。所以必须是环境。

5)编辑http_proxy环境变量

就我而言,问题是某些安装在某个时间点已定义 一个 当我没有代理时,我的机器上的环境变量 http_proxy。 删除 http_proxy 环境变量解决了这个问题。

As described here

在我的 Django 项目中的 wsgi.y 文件中:

os.environ['http_proxy'] = "http://192.168.1.5:8080"
os.environ['https_proxy'] = "http://192.168.1.5:8080"

6) 鉴于此答案here(有人可以解释一下我将如何处理 django 电子邮件功能),我也尝试过这种从解决方案 here 包装它的方法

import smtplib
import socks

#socks.setdefaultproxy(TYPE, ADDR, PORT)
socks.setdefaultproxy(socks.SOCKS5, '192.168.1.5', 8080)
socks.wrapmodule(smtplib)

smtpserver = 'smtp.live.com'
AUTHREQUIRED = 1 
smtpuser = 'example@hotmail.fr'  
smtppass = 'mypassword'  

RECIPIENTS = 'mailto@gmail.com'
SENDER = 'example@hotmail.fr'
mssg = "test message"
s = mssg   

server = smtplib.SMTP(smtpserver,587)
server.ehlo()
server.starttls() 
server.ehlo()
server.login(smtpuser,smtppass)
server.set_debuglevel(1)
server.sendmail(SENDER, [RECIPIENTS], s)
server.quit()

虽然我不喜欢使用这种方法,但我更喜欢使用 Django 的内置电子邮件服务。

【问题讨论】:

  • 您是否尝试运行telnet your_email_hostname_or_ip 25,它将检查端口是否响应。

标签: python django email getaddrinfo


【解决方案1】:

我的回答集中在一个奇怪的事实上,即您可以使用 SOCKS5 代理解决问题。 (我相信你。没有时间向你询问细节。)你验证了你的example solution by SOCKS5 适合你。 Django 使用相同的smtplib,您可以通过添加到wsgi.py 的代码以相同的方式轻松包装它。

import smtplib
import socks    # it is the package SocksiPy or PySocks

socks.setdefaultproxy(socks.SOCKS5, '192.168.1.5', 8080)
socks.wrapmodule(smtplib)

Http(s) 代理(第 5 段)不相关,因为它不影响 SMTP 和除 http(s) 之外的其他协议,因为“SOCKS 在比 HTTP 代理更低的级别上运行”。

【讨论】:

    【解决方案2】:

    由于您没有更改代码,因此您分享的错误表明这是与网络相关的问题。

    这很可能是 DNS 问题。在您的settings.py 中,您指定了EMAIL_HOST,我相信这是一个主机名。您需要检查服务器的 DNS 服务器。

    您提到检查防火墙设置,但您做错的不是检查实际连接。 要解决这个问题,您可以使用几个命令行实用程序,例如 telnetnslookup。您可以检查是否可以解析主机名:

    nslookup smptp.mail_host.com
    

    这个命令很可能会失败。

    我想指出您在步骤中做错了什么:

    1) 您已尝试获取您的服务getaddrinfo,您需要在其中放置您的 smtp 服务器主机名,这将导致相同的错误。套接字是应用层连接中非常原始的部分,您实际上不需要深入研究。

    2)检查防火墙设置即可。

    3)这是一个很好的步骤,表明您的服务器网络连接存在问题。

    4)这是另一个证据:)

    5)你错了,如果你的网络上有代理服务器来连接外部网络,那么你就使用了这个设置。但是你配置错了。您不应该将您的项目 url 设置为代理服务器。

    6) 这是另一种深度编码。你不应该使用这样的低级脚本,这会给你带来很多问题,这些问题本来可以在高级模块中处理。

    【讨论】:

    • 您的 DNS 评论让我进一步探索,发现这是一个 DHCP 问题!我重新启动了修复 DHCP 问题的服务器,然后为服务器分配了一个静态 IP,它现在似乎可以正常工作了。我会奖励你的赏金,因为它引导我。谢谢!
    • 我很高兴听到!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 2023-01-30
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2023-04-01
    相关资源
    最近更新 更多