Python 實現郵件傳送功能(進階)
上篇文章已經介紹了利用Python傳送文字訊息的用法,也在文末遺留了如何傳送圖片和附件的問題,本章主要來回答這兩個問題。
本章主要包含知識點:
1. 如何將圖片放到郵件主體中傳送
2. 如何傳送附件
問題一: 如何將圖片放在郵件主體中傳送
從上篇中應該都已知道,其實傳送郵件,就是傳送Html格式的字串,那麼傳送圖片時,可不可以也放到html中去呢?答案是肯定的,但是html中有一個指定圖片的地址或來源,那麼郵件中該指向何處呢?答案是附件。
根據這個思路,在傳送文字的程式碼上進行一個優化,先上程式碼:
class Email4Pic(Email):
'''
入參為filenames 即圖片列表,即可以一次傳送多張圖片'''
def __init__(self, filenames : list):
super(Email4Pic, self).__init__()
self.filenames = filenames def message_init(self, html):
message = MIMEMultipart()
message['subject'] = Header(self.subject, 'utf-8')
message['From'] = self.sendermessage['To'] = ', '.join(self.receiver)
message['Cc'] = ', '.join(self.cc) # 解決亂碼, html是html格式的str
message_context = MIMEText(html, _subtype='html', _charset='utf-8') # 郵件正文內容
message.attach(message_context) # 郵件加入圖片
cid = 0for filename in self.filenames:
m_file = MIMEBase('image','jpg')
m_file.add_header('Content-Disposition', 'attachment') # 將圖片放進附件
m_file.add_header('Content-ID', '<' + str(cid) + '>') # 設定圖片id f = open(filename, 'rb')
m_file.set_payload(f.read())
encoders.encode_base64(m_file)
message.attach(m_file)
cid += 1
return message if __name__ == '__main__':
print('start……') pic1 = "C:\\Users\\Administrator\\Pictures\\Python.png"
pic2 = "C:\\Users\\Administrator\\Pictures\\IMG_9676.jpg"
pics = []
pics.append(pic1)
pics.append(pic2) sendpic = Email4Pic(pics) sendpic.smtp = 'smtp.163.com'
sendpic.username = '[email protected]'
sendpic.password = 'passwd'
sendpic.subject = 'Test/測試郵件'
sendpic.sender = '[email protected]'
sendpic.receiver.append('[email protected]')
sendpic.cc.append('[email protected]') strs = '''<span>This is the first picture</span><br> <img src='cid:0'><br>
<span>This is the Second picture</span><br> <img src='cid:1'>''' sendpic.send_email(strs) 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張呢,那不得用附件形式才更合理? 這正是接下來準備講的,如何傳送附件呢?
同樣,有了上面的經驗,我們也寫一個子類,只不過這次只要將檔案讀入附件即可,不需要寫到郵件主體中,程式碼如下:
class Email4Attr(Email):
'''
入參為filenames 即檔案列表,即可以一次傳送多個附件
'''
def __init__(self, filenames : list):
super(Email4Attr, self).__init__()
self.filenames = filenames def message_init(self, html):
message = MIMEMultipart()
message['subject'] = Header(self.subject, 'utf-8')
message['From'] = self.sender
message['To'] = ', '.join(self.receiver)
message['Cc'] = ', '.join(self.cc) # 解決亂碼, html是html格式的str
message_context = MIMEText(html, _subtype='html', _charset='utf-8') # 郵件正文內容
message.attach(message_context) # 郵件加入圖片
for filename in self.filenames:
name = os.path.split(filename)[-1] # 從絕對路徑中取出檔名
m_file = MIMEBase('image','jpg')
m_file.add_header('Content-Disposition', 'attachment', filename = name) # 將檔案放入附件
f = open(filename, 'rb') m_file.set_payload(f.read())
encoders.encode_base64(m_file)
message.attach(m_file)
return message if __name__ == '__main__':
print('start……') pic1 = "C:\\Users\\Administrator\\Pictures\\Python.png"
pic2 = "C:\\Users\\Administrator\\Pictures\\IMG_9676.jpg"
pics = []
pics.append(pic1)
pics.append(pic2) sendAtt = Email4Attr(pics) sendAtt.smtp = 'smtp.163.com'
sendAtt.username = '[email protected]'
sendAtt.password = 'passwd'
sendAtt.subject = 'Test/測試郵件'
sendAtt.sender = '[email protected]'
sendAtt.receiver.append('[email protected]')
sendAtt.cc.append('[email protected]') strs = 'Please check the attachment '
sendAtt.send_email(strs) print('end')
可以看出,與圖片不同的地方就是處理內容的方式不同,一個是放在附件中,並標記ID由主體內容讀取,一個是直接放到附件中。
第26行:將檔案寫入附件中,利用filename這個關鍵屬性命名附件
如上執行後,我們看下傳送後的效果,此時兩個圖片已經被放進了附件中。對於檔案型別的附件,都是一樣處理,直接按規則呼叫就行了,這裡就不再示例,有興趣的夥伴可以自己下來試試呢。
綜上,對於郵件的傳送只要按照指定的框架即可輕鬆定製,這裡只是做了個指引和參考,如果您有更好的想法,或更難的挑戰,不妨評論區留言,我們來互相交流一下啊。
(希望我的文章能夠助你一臂之力,成就更輝煌的你,關注我,我們一起進步)