這兩天對Python的郵件模塊比較感興趣,于是就查了查資料。同時在實際的編碼過程中也遇到了各種各樣的問題。下面我就來分享一下我與smtplib的故事。
前提條件
我的上一篇博文里面講解了,發送郵件必須的條件。這里同樣是適用的。大致就是要開啟郵箱的SMPT/POP服務等等。
核心知識點
因為今天主要講解的是如何發送帶有附件的郵件,那么核心肯定是附件了。怎么才能發附件呢?
其實我們換個思路,就不難理解了。因為我們發送郵件,經過了應用層–>> 傳輸層–>> 網絡層–>>數據鏈路層–>>物理層。這一系列的步驟,全都變成了比特流了。所以無論是純文本,圖片,亦或是其他類型的文件。在比特流的面前,都是平等的。所以我們發送附件,也是按照發送純文本的模式來做就行,只不過加上一些特殊的標記即可。
/# 首先是xlsx類型的附件xlsxpart = MIMEApplication(open('test.xlsx', 'rb').read())xlsxpart.add_header('Content-Disposition', 'attachment', filename='test.xlsx')msg.attach(xlsxpart)/# jpg類型的附件jpgpart = MIMEApplication(open('beauty.jpg', 'rb').read())jpgpart.add_header('Content-Disposition', 'attachment', filename='beauty.jpg')msg.attach(jpgpart)/# mp3類型的附件mp3part = MIMEApplication(open('kenny.mp3', 'rb').read())mp3part.add_header('Content-Disposition', 'attachment', filename='benny.mp3')msg.attach(mp3part)經過這三小段的代碼,想必你已經很清楚了吧。無非就是使用MIMEApplication進行包裝一下,然后設置一下內容。最后添加到郵件內容。就是這幾步,就搞定了。
完整的代碼
# coding:utf-8#  __author__ = 'Mark sinoberg'#  __date__ = '2016/5/26'#  __Desc__ = 實現發送帶有各種附件類型的郵件import urllib, urllib2import smtplibfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.mime.application import MIMEApplicationusername = '156408XXXXX@163.com'password = 'XXXXXXXX'sender = usernamereceivers = ','.join(['10643XXXX2@qq.com'])# 如名字所示: Multipart就是多個部分msg = MIMEMultipart()msg['Subject'] = 'Python mail Test'msg['From'] = sendermsg['To'] = receivers# 下面是文字部分,也就是純文本puretext = MIMEText('我是純文本部分,')msg.attach(puretext)# 下面是附件部分 ,這里分為了好幾個類型# 首先是xlsx類型的附件xlsxpart = MIMEApplication(open('test.xlsx', 'rb').read())xlsxpart.add_header('Content-Disposition', 'attachment', filename='test.xlsx')msg.attach(xlsxpart)# jpg類型的附件jpgpart = MIMEApplication(open('beauty.jpg', 'rb').read())jpgpart.add_header('Content-Disposition', 'attachment', filename='beauty.jpg')msg.attach(jpgpart)# mp3類型的附件mp3part = MIMEApplication(open('kenny.mp3', 'rb').read())mp3part.add_header('Content-Disposition', 'attachment', filename='benny.mp3')msg.attach(mp3part)## 下面開始真正的發送郵件了try:  client = smtplib.SMTP()  client.connect('smtp.163.com')  client.login(username, password)  client.sendmail(sender, receivers, msg.as_string())  client.quit()  print '帶有各種附件的郵件發送成功!'except smtplib.SMTPRecipientsRefused:  print 'Recipient refused'except smtplib.SMTPAuthenticationError:  print 'Auth error'except smtplib.SMTPSenderRefused:  print 'Sender refused'except smtplib.SMTPException,e:  print e.message            
新聞熱點
疑難解答