2013-02-19 109 views
0
import smtplib 

fromaddress = '[email protected]' 
toaddress = [fromaddress] 
message = """ 
From: %s 
To: %s 
Subject: test 

Hello 

Goodbye 
""" % (fromaddress, toaddress) 

server = smtplib.SMTP('mydomain.com') 
server.set_debuglevel(1) 
server.sendmail(fromaddress, toaddress, message) 

此代碼打開一個套接字確定,但然後在發送失敗與'連接意外關閉'錯誤的sendmail。從查看smtplib source這發生在從smtp服務器返回空響應時。蟒蛇smtplib sendmail失敗

我從上面的代碼中錯過了什麼?我正在廉價的webhost上運行這個腳本作爲cgi腳本,作爲他們服務的一部分,他們安裝了sendmail和python服務。在他們的文檔中,他們有標準的「在php中發送電子郵件」的代碼示例,不需要認證,所以我假設python應該也是一樣。

任何人有任何見解?主機是hostgator,如果有幫助的話。

編輯:

底層誤差是SMTP服務器發出一個硬「由對等連接復位」復位即TCP。在什麼情況下電子郵件服務器會這樣做?

+0

如果認爲是垃圾郵件它可能關閉連接。例如,如果發件人地址確實是「[email protected]」。或者你可能連接到錯誤的SMTP服務器。檢查HELO交換並確認你有合適的服務器。 「mydomain.com」是否解析爲指向hostgator的smtp服務器的A記錄?最後,嘗試使用telnet並手動運行SMTP協議。也許你會注意到一個有意義的錯誤信息。 – 2013-02-19 22:32:31

+0

沒有telnet訪問:( – user1561108 2013-02-19 22:50:45

+0

你不需要Telnet訪問你的服務器,你只需要任何類型的shell訪問。一旦你登錄你的服務器,*然後*你運行「telnet mydomain.com 25」。 – 2013-02-19 22:51:44

回答

2

我認爲toaddress應該是一個列表。

fromaddress = '[email protected]' 
toaddress = [fromaddress] 
+1

,我相信標題和正文之間應該有一個空行(即在「Subject:..」行後)。 – isedev 2013-02-19 21:51:59

+0

感謝球員,做出了這兩個改變,但仍然是同樣的問題 – user1561108 2013-02-19 22:03:51

2

您試圖通過SMTP發送郵件,這通常是通過某種身份驗證(用戶名+密碼)實現的。如果您沒有進行身份驗證(或您的IP地址在給定時間間隔內失敗了多次驗證失敗),大多數SMTP服務器將立即終止連接。

通過調用smtplib.SMTP([host[, port[, local_hostname[, timeout]]]]),您試圖打開與mydomain.com的連接。大多數虛擬主機將具有與shell系統分離的集中式郵件系統(SMTP/IMAP)。

我還沒有在一段時間(或在Python下使用SMTP)調試SMTP的東西,但你通過跳入網絡主機並做telnet mydomain.com 25這應該讓你看看SMTP服務器是否願意接受你的連接...或正在離開。

您也可以嘗試在你的虛擬主機提供商做的phpinfo(),看他們是否有建於任何特殊的SMTP認證的東西。

除此之外,我建議您嘗試管道郵件到sendmail的(兼容)二進制,並讓服務器處理SMTP。

它會是這個樣子......

p= os.popen("/usr/sbin/sendmail -t -i -f" , "w") 
p.write(message) 
status = p.close() 
if status : 
    raise RuntimeError("Could not excecute sendmail properly")