簡體   English   中英

通過Django發送電子郵件 - WinError 10060連接嘗試失敗,GetAddrInfo錯誤

[英]Sending Emails through Django - WinError 10060 A connection attempt failed and GetAddrInfo Error

我已經在Windows R2 2012上運行了一個Django實例超過一年,我來到了一個路障。 昨天發生了什么事,我不知道它會是什么。 在嘗試發送電子郵件時,同樣的兩個錯誤會在不同時間突然出現:

[WinError 10060]連接嘗試失敗,因為連接方在一段時間后沒有正確響應,或者建立的連接失敗,因為連接的主機無法響應

socket.gaierror:[Errno 11001] getaddrinfo失敗

用戶可以連接到服務器的IP地址和Django在192.168.1.5:8000上運行的端口,但他們不能再發送電子郵件了。 盡管所描述的百分比都經過這里 ,但很少。

我嘗試過的事情

1) 這個解決方案

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環境變量修復了問題。

如此處所述

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

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

6) 在這里得到這個答案(有人可以解釋我將如何對django電子郵件功能),我也試過這種方法從這里解決方案包裝它

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的內置電子郵件服務。

由於您沒有更改代碼,因此您共享的錯誤表明它是與網絡相關的問題。

這很可能是一個DNS問題。 在您的settings.py您指定了EMAIL_HOST ,我相信它是一個主機名。 您需要檢查服務器的DNS服務器。

您提到有關檢查防火牆設置但是您所做的錯誤不是檢查實際連接。 要解決此問題,您可以使用幾個命令行實用程序,如telnetnslookup 您可以檢查是否可以解析主機名:

nslookup smptp.mail_host.com

此命令最有可能失敗。

我想指出你在步驟中做錯了什么:

1)您已嘗試獲取您的服務getaddrinfo ,您需要在其中放置您的smtp服務器主機名,這將導致相同的錯誤。 套接字是應用層連接的非常原始的部分,你真的不需要深入研究它。

2)檢查防火牆設置是否正常。

3)這是一個很好的步驟,表明您的服務器網絡連接存在問題。

4)那是另一個證據:)

5)如果您的網絡上有代理服務器連接外部網絡,那么您使用此設置是錯誤的。 但是你配置錯了。 您不應將項目URL設置為代理服務器。

6)這是另一個深層編碼。 你不應該使用這樣的低級腳本,這將導致你在高級模塊中處理的數量問題。

我把我的答案集中在一個奇怪的事實上,你可以使用SOCKS5代理解決問題。 (我相信你。沒有時間向你詢問詳細信息。)您確認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 )不相關,因為它不影響除http和s之外的SMTP和其他協議,因為“ SOCKS的運行級別低於HTTP代理”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM