2012-11-16 47 views
1

我想從我的服務器發送電子郵件。我正嘗試使用我已有的hotmail帳戶發送。通過python中的hotmail發送電子郵件

user = "[email protected]" 
passwd = "xxxxxxxxx" 

from_addr = "[email protected]" 
to_addr = "[email protected]" 
smtp_srv = "smtp.live.com" 

subject = "Home Server Uptime" 
message = "The server has been online for: %s" %(uptime) 

smtp = smtplib.SMTP(smtp_srv,587) 
smtp.ehlo() 
smtp.starttls() 
smtp.ehlo() 
smtp.login(user, passwd) 
smtp.sendmail(from_addr, to_addr, message) 
smtp.quit() 

我得到這個錯誤:

Traceback (most recent call last): 
    File "sendemail.py", line 23, in <module> 
    smtp.starttls() 
    File "/usr/lib/python2.7/smtplib.py", line 636, in starttls 
    (resp, reply) = self.docmd("STARTTLS") 
    File "/usr/lib/python2.7/smtplib.py", line 385, in docmd 
    return self.getreply() 
    File "/usr/lib/python2.7/smtplib.py", line 358, in getreply 
    + str(e)) 
smtplib.SMTPServerDisconnected: Connection unexpectedly closed: [Errno 104] Connection reset by peer 

我不知道如何解決這個。

這裏是set_debuglevel的輸出(1)彌敦道建議:

send: 'ehlo [127.0.1.1]\r\n' 
reply: '250-BLU0-SMTP190.blu0.hotmail.com Hello [my-ip-address]\r\n' 
reply: '250-TURN\r\n' 
reply: '250-SIZE 41943040\r\n' 
reply: '250-ETRN\r\n' 
reply: '250-PIPELINING\r\n' 
reply: '250-DSN\r\n' 
reply: '250-ENHANCEDSTATUSCODES\r\n' 
reply: '250-8bitmime\r\n' 
reply: '250-BINARYMIME\r\n' 
reply: '250-CHUNKING\r\n' 
reply: '250-VRFY\r\n' 
reply: '250-TLS\r\n' 
reply: '250-STARTTLS\r\n' 
reply: '250 OK\r\n' 
reply: retcode (250); Msg: BLU0-SMTP190.blu0.hotmail.com Hello [my-ip-address] 
TURN 
SIZE 41943040 
ETRN 
PIPELINING 
DSN 
ENHANCEDSTATUSCODES 
8bitmime 
BINARYMIME 
CHUNKING 
VRFY 
TLS 
STARTTLS 
OK 
send: 'STARTTLS\r\n' 
Traceback (most recent call last): 
    File "sendemail.py", line 24, in <module> 
    smtp.starttls() 
    File "/usr/lib/python2.7/smtplib.py", line 636, in starttls 
    (resp, reply) = self.docmd("STARTTLS") 
    File "/usr/lib/python2.7/smtplib.py", line 385, in docmd 
    return self.getreply() 
    File "/usr/lib/python2.7/smtplib.py", line 358, in getreply 
    + str(e)) 
smtplib.SMTPServerDisconnected: Connection unexpectedly closed: [Errno 104] Connection reset by peer 
+0

你試過'smtp.set_debuglevel(1)'?你可能會得到更多有用的輸出。 –

+0

在主文章中粘貼了set_debuglevel(1)的輸出 – koogee

回答

1

看起來試圖啓動TLS(smtp.starttls())當你的代碼失敗。我剛剛測試了smtp.live.com,我可以在您的代碼中嘗試登錄,因此可能是由於您的網絡設置方式。

這是不相關的,但根據smtplib文檔,你必須在消息的開頭添加fromto地址標題​​:

parts = ("From: " + from_addr, 
     "To: " + to_addr, 
     "Subject: " + subject, 
     "", 
     message)  
msg = '\r\n'.join(parts) 
+0

添加了'msg =「到:%s \ n來自:%s \ n主題:%s \ n \ n%s」%(to_addr,from_addr,subject,message) '並更改了'smtp.sendmail(from_addr,to_addr,msg)'。還是同樣的錯誤:( – koogee

+0

它基本上是一個運行samba連接到路由器的Ubuntu文件服務器。我沒有設置任何郵件服務器或網絡的任何特殊更改。我關掉了防火牆,看看是否導致問題仍然無法通過Hotmail進行身份驗證可以通過網絡瀏覽器進行身份驗證 – koogee

+1

這似乎適用於OSX和Ubuntu Server上的我 –

7

試試這個

import email 
import smtplib 

msg = email.message_from_string('warning') 
msg['From'] = "[email protected]" 
msg['To'] = "[email protected]" 
msg['Subject'] = "helOoooOo" 

s = smtplib.SMTP("smtp.live.com",587) 
s.ehlo() # Hostname to send for this command defaults to the fully qualified domain name of the local host. 
s.starttls() #Puts connection to SMTP server in TLS mode 
s.ehlo() 
s.login('[email protected]', 'pass') 

s.sendmail("[email protected]", "[email protected]", msg.as_string()) 

s.quit() 
+5

您應該解釋爲什麼您的代碼正在修復提問者問題。 – morkro