Python 實現郵件發送功能(進階)

上篇文章已經介紹了利用Python發送文本消息的用法,也在文末遺留了如何發送圖片和附件的問題,本章主要來回答這兩個問題。

  本章主要包含知識點:

1. 如何將圖片放到郵件主體中發送

2. 如何發送附件

問題一: 如何將圖片放在郵件主體中發送

從上篇中應該都已知道,其實發送郵件,就是發送Html格式的字符串,那么發送圖片時,可不可以也放到html中去呢?答案是肯定的,但是html中有一個指定圖片的地址或來源,那么郵件中該指向何處呢?答案是附件。

根據這個思路,在發送文本的代碼上進行一個優化,先上代碼:

 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方法基礎上添加了圖片處理的一些邏輯。

第6行:即繼承父類的屬性

第25~32行:將圖片放進附件緩存中,并將每個圖片標記ID,再讀取后放入郵件主體文本中

第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這個關鍵屬性命名附件

如上執行后,我們看下發送后的效果,此時兩個圖片已經被放進了附件中。對于文件類型的附件,都是一樣處理,直接按規則調用就行了,這里就不再示例,有興趣的伙伴可以自己下來試試呢。

 

 

 

綜上,對于郵件的發送只要按照指定的框架即可輕松定制,這里只是做了個指引和參考,如果您有更好的想法,或更難的挑戰,不妨評論區留言,我們來互相交流一下啊。

(希望我的文章能夠助你一臂之力,成就更輝煌的你,關注我,我們一起進步)

 

posted @ 2020-07-17 23:33  挖挖土豆  閱讀(...)  評論(...編輯  收藏
最新chease0ldman老人|无码亚洲人妻下载|大香蕉在线看好吊妞视频这里有精品www|亚洲色情综合网