Python—發郵件總結
來自: http://my.oschina.net/jhao104/blog/613774
1、登錄SMTP服務器
首先使用網上的方法(這里使用163郵箱,smtp.163.com是smtp服務器地址,25為端口號):
import smtplib server = smtplib.SMTP('smtp.163.com', 25) server.login('j_hao104@163.com', 'password')
Traceback (most recent call last): File "C:/python/t.py", line 192, in <module> server.login('j_hao104@163.com', 'password') File "C:\Python27\lib\smtplib.py", line 622, in login raise SMTPAuthenticationError(code, resp) smtplib.SMTPAuthenticationError: (535, 'Error: authentication failed')
發現返回: smtplib.SMTPAuthenticationError: (535, 'Error: authentication failed'),提示驗證失敗。
網上給了很多解決辦法有很多:
http://markmail.org/message/3ub3itxq4aqwaikx
https://segmentfault.com/q/1010000003802498
有說python不支持SMTP服務,或是服務沒開啟之類的。但是我想起上次我用foxmail登錄我的163郵箱的時候,郵箱密碼都輸對了還是提示我密碼錯誤,最后的解決辦法是:像QQ和163郵箱現在都有個客戶端密碼,用第三方登錄時需用客戶端密碼登錄才行,python也是如此,因此去設置好客戶端密碼,再用客戶端密碼登錄。
import smtplib server = smtplib.SMTP('smtp.163.com', 25) server.login('j_hao104@163.com', 'clientPassword')
此時便返回登錄成功提示:
(235, 'Authentication successful')
2、發送郵件
首先使用網上給出的代碼:
import smtplib from email.mime.text import MIMEText server = smtplib.SMTP('smtp.163.com', 25) server.login('j_hao104@163.com', 'clientPassword') msg = MIMEText('hello, send by Python...', 'plain', 'utf-8') server.sendmail('j_hao104@163.com', ['946150454@qq.com'], msg.as_string())
構造MIMEText對象時,第一個參數是郵件正文,第二個參數是MIME的subtype,最后個是編碼方式。
sendmail是發郵件方法,第一個參數是發件郵箱,第二個參數是收件人郵箱,是一個列表,代表可以同時發給多個人,as_string是把MIMEText對象變成str。
但是執行結果并不能得到網上說的結果:
而是:
Traceback (most recent call last): File "C:/python/t.py", line 195, in <module> server.sendmail('j_hao104@163.com', ['946150454@qq.com'], msg.as_string()) File "C:\Python27\lib\smtplib.py", line 746, in sendmail raise SMTPDataError(code, resp) smtplib.SMTPDataError: (554, 'DT:SPM 163 smtp11,D8CowEDpDkE427JW_wQIAA--.4996S2 1454562105,please see http://mail.163.com/help/help_spam_16.htm?ip=171.221.144.51&hostid=smtp11&time=1454562105')
網上一查才知道:smtplib.SMTPDataError: (554, 'DT:SPM 163 smtp11……的錯誤是因為信封發件人和信頭發件人不匹配。可以看出看出圖片中并沒有發件人和主題,所以需要對代碼做如下修改:
import smtplib from email.header import Header from email.mime.text import MIMEText server = smtplib.SMTP('smtp.163.com', 25) server.login('j_hao104@163.com', 'clientPassword') msg = MIMEText('hello, send by Python...', 'plain', 'utf-8') msg['From'] = 'j_hao104@163.com <j_hao104@163.com>' msg['Subject'] = Header(u'text', 'utf8').encode() msg['To'] = u'飛輪海 <jinghao5849312@qq.com>' server.sendmail('j_hao104@163.com', ['946150454@qq.com'], msg.as_string())
這樣就能成功發出郵件啦
msg里的具體信息可以用一般發郵件方式發封郵件測試下
3、參考
http://jingyan.baidu.com/article/b24f6c822784b886bfe5dabe.html