通过Django WinError 10060发送电子邮件连接尝试失败,GetAddrInfo E

2024-04-26 21:56:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我在WindowsR2 2012上运行了一个Django实例一年多了,我遇到了一个障碍。昨天发生了什么事,我不知道会是什么。同样的两个错误会在不同的时间出现,但在尝试发送电子邮件时:

[WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

以及

socket.gaierror: [Errno 11001] getaddrinfo failed

用户可以连接到服务器的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环境变量

The problem, in my case, was that some install at some point defined an environment variable http_proxy on my machine when I had no proxy. Removing the http_proxy environment variable fixed the problem.

As described here

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

^{pr2}$

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内置的电子邮件服务。在


Tags: thedjangoimport服务器httphereserver电子邮件
2条回答

由于您没有更改代码,并且您共享的错误表明这是一个与网络相关的问题。在

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

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

nslookup smptp.mail_host.com

这个命令很可能会失败。在

我想指出你在步骤中犯了什么错:

1)您试图获得您的服务getaddrinfo,您需要将您的smtp服务器主机名放在其中,这将导致相同的错误。套接字是应用层连接的最基本部分,您不需要深入研究。在

2)检查防火墙设置是可以的。在

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

4)这是另一个证据:)

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

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

我把我的答案集中在一个奇怪的事实上:使用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代理”。在

相关问题 更多 >