上篇文章已經介紹了利用Python發送文本消息的用法,也在文末遺留了如何發送圖片和附件的問題,本章主要來回答這兩個問題。html
本章主要包含知識點:緩存
1. 如何將圖片放到郵件主體中發送app
2. 如何發送附件框架
問題一: 如何將圖片放在郵件主體中發送測試
從上篇中應該都已知道,其實發送郵件,就是發送Html格式的字符串,那麼發送圖片時,可不能夠也放到html中去呢?答案是確定的,可是html中有一個指定圖片的地址或來源,那麼郵件中該指向何處呢?答案是附件。優化
根據這個思路,在發送文本的代碼上進行一個優化,先上代碼:spa
1 class Email4Pic(Email): 2 ''' 3 入參爲filenames 即圖片列表,便可以一次發送多張圖片 4 ''' 5 def __init__(self, filenames : list): 6 super(Email4Pic, self).__init__() 7 self.filenames = filenames 8 9 def message_init(self, html): 10 message = MIMEMultipart() 11 message['subject'] = Header(self.subject, 'utf-8') 12 message['From'] = self.sender 13 message['To'] = ', '.join(self.receiver) 14 message['Cc'] = ', '.join(self.cc) 15 16 # 解決亂碼, html是html格式的str 17 message_context = MIMEText(html, _subtype='html', _charset='utf-8') 18 19 # 郵件正文內容 20 message.attach(message_context) 21 22 # 郵件加入圖片 23 cid = 0 24 for filename in self.filenames: 25 m_file = MIMEBase('image','jpg') 26 m_file.add_header('Content-Disposition', 'attachment') # 將圖片放進附件 27 m_file.add_header('Content-ID', '<' + str(cid) + '>') # 設置圖片id 28 29 f = open(filename, 'rb') 30 m_file.set_payload(f.read()) 31 encoders.encode_base64(m_file) 32 message.attach(m_file) 33 cid += 1 34 return message 35 36 if __name__ == '__main__': 37 print('start……') 38 39 pic1 = "C:\\Users\\Administrator\\Pictures\\Python.png" 40 pic2 = "C:\\Users\\Administrator\\Pictures\\IMG_9676.jpg" 41 pics = [] 42 pics.append(pic1) 43 pics.append(pic2) 44 45 sendpic = Email4Pic(pics) 46 47 sendpic.smtp = 'smtp.163.com' 48 sendpic.username = 'wjian.coming@163.com' 49 sendpic.password = 'passwd' 50 sendpic.subject = 'Test/測試郵件' 51 sendpic.sender = 'wjian.coming@163.com' 52 sendpic.receiver.append('948001879@qq.com') 53 sendpic.cc.append('948001879@qq.com') 54 55 strs = '''<span>This is the first picture</span><br> <img src='cid:0'><br> 56 <span>This is the Second picture</span><br> <img src='cid:1'>''' 57 58 sendpic.send_email(strs) 59 60 print('end')
沒錯!發送圖片即在原來的父類上作了個子類,並複用了父類中的屬性和部分方法(send_email),並在message_init方法基礎上添加了圖片處理的一些邏輯。code
第6行:即繼承父類的屬性htm
第25~32行:將圖片放進附件緩存中,並將每一個圖片標記ID,再讀取後放入郵件主體文本中blog
第55~56行:此字符串就是即將發送的html格式文件,其中 <img src='cid:0'> 即讀取編號爲0的圖片,從附件緩存中讀取的,做爲html文件的圖片來源
第58行:調用父類的send_email方法,發送郵件
如上執行後,咱們看下發送後的效果(圖片2太大,沒有徹底截圖出來)。
這樣就能夠理解,只要編輯好Html就能夠發送任意內容啦~
問題二: 如何發送附件
這時,又有人出來問了,你這是兩張圖片,那要是100張呢,那不得用附件形式才更合理? 這正是接下來準備講的,如何發送附件呢?
一樣,有了上面的經驗,咱們也寫一個子類,只不過此次只要將文件讀入附件便可,不須要寫到郵件主體中,代碼以下:
1 class Email4Attr(Email): 2 ''' 3 入參爲filenames 即文件列表,便可以一次發送多個附件 4 ''' 5 def __init__(self, filenames : list): 6 super(Email4Attr, self).__init__() 7 self.filenames = filenames 8 9 def message_init(self, html): 10 message = MIMEMultipart() 11 message['subject'] = Header(self.subject, 'utf-8') 12 message['From'] = self.sender 13 message['To'] = ', '.join(self.receiver) 14 message['Cc'] = ', '.join(self.cc) 15 16 # 解決亂碼, html是html格式的str 17 message_context = MIMEText(html, _subtype='html', _charset='utf-8') 18 19 # 郵件正文內容 20 message.attach(message_context) 21 22 # 郵件加入圖片 23 for filename in self.filenames: 24 name = os.path.split(filename)[-1] # 從絕對路徑中取出文件名 25 m_file = MIMEBase('image','jpg') 26 m_file.add_header('Content-Disposition', 'attachment', filename = name) # 將文件放入附件 27 f = open(filename, 'rb') 28 29 m_file.set_payload(f.read()) 30 encoders.encode_base64(m_file) 31 message.attach(m_file) 32 return message 33 34 if __name__ == '__main__': 35 print('start……') 36 37 pic1 = "C:\\Users\\Administrator\\Pictures\\Python.png" 38 pic2 = "C:\\Users\\Administrator\\Pictures\\IMG_9676.jpg" 39 pics = [] 40 pics.append(pic1) 41 pics.append(pic2) 42 43 sendAtt = Email4Attr(pics) 44 45 sendAtt.smtp = 'smtp.163.com' 46 sendAtt.username = 'wjian.coming@163.com' 47 sendAtt.password = 'passwd' 48 sendAtt.subject = 'Test/測試郵件' 49 sendAtt.sender = 'wjian.coming@163.com' 50 sendAtt.receiver.append('948001879@qq.com') 51 sendAtt.cc.append('948001879@qq.com') 52 53 strs = 'Please check the attachment ' 54 sendAtt.send_email(strs) 55 56 print('end')
能夠看出,與圖片不一樣的地方就是處理內容的方式不一樣,一個是放在附件中,並標記ID由主體內容讀取,一個是直接放到附件中。
第26行:將文件寫入附件中,利用filename這個關鍵屬性命名附件
如上執行後,咱們看下發送後的效果,此時兩個圖片已經被放進了附件中。對於文件類型的附件,都是同樣處理,直接按規則調用就好了,這裏就再也不示例,有興趣的夥伴能夠本身下來試試呢。
綜上,對於郵件的發送只要按照指定的框架便可輕鬆定製,這裏只是作了個指引和參考,若是您有更好的想法,或更難的挑戰,不妨評論區留言,咱們來互相交流一下啊。
(但願個人文章可以助你一臂之力,成就更輝煌的你,關注我,咱們一塊兒進步)