2011-12-09 35 views
5

我想發送一封電子郵件在Python中。這是我的代碼。發送電子郵件與蟒蛇smtplib不工作,困惑的「從」字段

import smtplib 

if __name__ == '__main__': 
SERVER = "localhost" 

FROM = "[email protected]" 
TO = ["[email protected]"] # must be a list 

SUBJECT = "Hello!" 

TEXT = "This message was sent with Python's smtplib." 

# Prepare actual message 

message = """\ 
From: %s 
To: %s 
Subject: %s 

%s 
""" % (FROM, ", ".join(TO), SUBJECT, TEXT) 

# Send the mail 

server = smtplib.SMTP(SERVER) 
server.sendmail(FROM, TO[0], message) 
server.quit() 
print "Message sent!" 

運行沒有錯誤,但沒有電子郵件發送到[email protected]

問題

有一件事我不明白這個代碼---我有什麼限制設置FROM場是什麼時候?

難道我不知何故不得不說它來自我的電腦嗎?

什麼是防止我欺騙他人的電子郵件?

或者我可以自由地做到這一點?

+1

爲什麼TO [0]而不是TO? – sherpya

+0

我想也許我不是想通過一個列表,但我想這不是問題。 (我試過兩種方式,沒有什麼區別) – WillHaack

+0

它爲我工作,打印sendmail函數的結果應該是一個空字典,也請嘗試server.set_debuglevel(1) – sherpya

回答

6

運行沒有錯誤,但沒有電子郵件發送到[email protected]

這通常意味着,郵件已轉移到'localhost'上的MTA(郵件服務器),但該服務器無法將其轉發給Gmail。它可能會嘗試將退回郵件發送到「[email protected]」,但也失敗了。或者它成功發送的消息,但它在Gmail的垃圾郵件文件夾登陸(該消息可能引發的垃圾郵件規則,因爲它缺少一個日期頭)

有一件事我不明白這個代碼---什麼做限制我有什麼時候設置FROM字段?

它必須是一個語法上有效的電子郵件地址

難道我莫名其妙不得不說,這是從我的電腦?

沒有。但這可能是爲什麼它沒有交付的問題。您的電腦是家庭/動態/撥號IP嗎? gmail(以及許多許多其他提供商)不接受來自這些IP的郵件。您郵件服務器的HELO可能是錯誤的,DNS設置可能不正確等,您需要檢查服務器日誌。您可能必須配置本地郵件服務器才能通過智能主機中繼郵件,而不是直接聯繫目標服務器。

什麼是到位,以阻止我欺騙別人的電子郵件?

不多,這就是爲什麼我們有這麼多來自僞造地址的垃圾郵件。像SPF/DKIM這樣的東西可以提供一些幫助,但SMTP協議本身並不能防止欺騙。

還是我可以自由地做到這一點?

從技術上說是的。

0

好吧,既然你沒有指定你使用的郵件服務器的類型及其設置,這裏有幾個可能是錯誤的。 首先,您需要指定服務器的HOST和PORT並連接到它。 例子:

HOST = "smtp.gmail.com" 
PORT = "587" 
SERVER = smtplib.SMTP() 
SERVER.connect(HOST, PORT) 

然後,你需要指定一個用戶和他的密碼到該主機。 示例:

USER = "[email protected]" 
PASSWD = "123456" 

某些服務器需要TLS協議。 例如:

SERVER.starttls() 

然後您需要登錄。 例子:

SERVER.login(USER,PASSWD) 

只有這樣,你可以用你的sendmail發送電子郵件。 這個例子在大多數普通的服務器上工作得很好。 如果您使用的是自己的服務器,則沒有太多需要應用的更改。但是你需要知道這臺服務器有什麼樣的要求。

相關問題