手把手教你使用Python輕松搞定發(fā)郵件
前言
現(xiàn)在生活節(jié)奏加快,人們之間交流方式也有了天差地別,為了更加便捷的交流溝通,電子郵件產(chǎn)生了,眾所周知,電子郵件其實就是客戶端和服務器端發(fā)送接受數(shù)據(jù)一樣,他有一個發(fā)信和一個收信的功能,電子郵件的通信協(xié)議為SMTP ,POP3,IMAP,而且他們都屬于tcp/ip協(xié)議,像我們經(jīng)常用到的QQ郵箱,網(wǎng)易郵箱,這些都是同樣的模式。
準備
- 編輯器:sublime text 3
- 模塊:smtplib和email
項目實施
1.安裝
- pip install smtplib
- pip install email
注:這里有一個小坑,就是安裝smtplib不能像上面那樣直接安裝,那樣會安裝不上的,你得先安裝PyEmail,因為你smtplib 集成在了這個模塊中了,就好比pillow模塊集成在PIL中一樣的,另一個正常安裝即可。
2.開通pop3 SMTP imap 服務了解郵箱授權碼
任何一個郵箱你如果想要發(fā)郵件,你得先開通以上服務,讓郵件能夠通信,而且還得有郵箱授權碼,比如說QQ郵箱:
打開QQ郵箱,選擇設置--------賬戶,然后開啟服務。


開啟服務后,點擊生成授權碼,保存好授權碼。獲取授權碼只需要你用注冊手機號發(fā)短信或者動態(tài)令牌即可。
3.構建郵件端口,建立連接
- import smtplib
- sm=smtp.SMTP() # 初始化連接
- sm.connect('郵件服務器地址','端口') #建立連接
- sm.login('郵箱賬號','郵箱密碼/授權碼') #登陸賬戶
- sm.sendmail('郵件發(fā)送方','郵件接受方','郵件內容') #發(fā)送郵件
- sm.quit() #關閉連接,結束郵件服務
了解了以上的知識后,我們來試著登陸一下吧,我以QQ郵箱為例:

有這樣的標識表示登陸成功,順便強調一句,在這里我為什么沒有配置郵件服務器端口,因為服務器已經(jīng)幫我們配置好了,默認的都是25號端口,如果你擔心郵件的安全問題,比如會被黑客截胡,你也可以使用ssl鏈接傳輸:

同樣它的端口也是默認配置好了,他的端口號為465,為了安全,咱們選擇這項。
4.構建郵件內容部分
這里我們需要用到email模塊,我們都知道,郵件一般可以發(fā)很多東西,比如說文本,圖片,文件等等,那么我們來看看吧。
一、文本
導入模塊
- from email.mime.text import MIMEText
填充文本
在此之前我們得知道它的具體用法:
- MIMEText(‘郵件內容’,‘類型’, '編碼')
- 郵件內容為字符串
- 類型: text/plain text/html
- 編碼 : utf-8 gbk
構造文本
- MIMEText('hello','text/plain','utf-8')
構造超文本
- MIMEText('<a href='www.baidu.com'>點擊此處有驚喜</a>','text/html','utf-8')
下面我們來實際操作下吧。
非常成功收到了郵件了。正是2091500484這個郵箱給我發(fā)的。當然我們這樣只是實現(xiàn)了最簡單的功能,
我們需要將它格式規(guī)范下,比如給它添加個開頭結尾什么的。我們需要導入構建郵件完整內容的模塊:
- from email.header import Header
然后設置頭部,內容,尾部
- msg1['From']=Header('你是豬嗎') #設置發(fā)件人昵稱
- msg1['To']=Header('hwhrr123321@163.com') #設置收件人昵稱
- msg1['Subject'] = Header('我是豬') #設置標題
可以看到,是不是覺得很有趣了,快來試試吧,哈哈哈。。。
二、圖片
發(fā)了文本后我們還想發(fā)一張圖片,那該怎么辦呢?莫慌,此時需要先導入發(fā)圖片的模塊:
- from email.mime.image import MIMEImage
然后我們在讀取圖片文件將它添加到郵件中去。
- ff=open('1.jpg','rb').read() #打開文件
- fd=MIMEImage(ff,'subtype') #初始化
- fd.add_header('Content-ID','1.jpg') #添加到頭部
可以看到圖片并沒有顯示出來,那么這是怎么回事,哦,原來圖片是依托附件而存在的,要么是html要么是附件,但是兩者都需要附件模塊的支持,下面我們導入附件模塊:
- from email.mime.multipart import MIMEMultipart
1.將圖片插入到html中
也就是將圖片插入到正文部分,而非附件的形式。
- msg3 = MIMEMultipart('related')
- msg3['From'] = '你是豬嗎'
- msg3['To'] = 'hwhrr123321@163.com'
- msg3['Subject'] = '我是豬'
- msg4 = MIMEMultipart('alternative') #構建一個附件
- msg3.attach(msg4) #將附件引入到另一個附件
- text="""
- <html>
- <body>
- <img src='cid:img' tittle='I am pig'>
- </body>
- </html>
- """
- msg4.attach(MIMEText(text, 'html', 'utf-8')) #將html插入到附件中
- ff=open('2.jpg','rb')
- img = MIMEImage(ff.read()) #將圖片讀取到附件中
- ff.close()
- img.add_header('Content-ID','<img>') #添加圖片頭部
- msg3.attach(img) #將圖片添加到附件
- sm.sendmail('2091500484@qq.com','hwhrr123321@163.com',msg3.as_string()) #發(fā)送
- sm.quit()
可以看出,過程還是比較復雜的,比單純附件添加圖片麻煩點,主要是嵌套了一層附件結構。
2.將圖片引入到附件中
這個比較好實現(xiàn)。如圖:

三、文件
在發(fā)送文件前,我們要考慮的一個問題是,我們讀取它要以二進制的形式,然后再將它添加到附件中,搞懂了這個就好辦了。
1.讀取文件
這里我們需要構造一個base64的一個數(shù)據(jù)流讀取文件:
- msg6=MIMEMultipart()
- txt=MIMEText(open('fd.txt','rb').read(), 'base64', 'utf-8')
2.設置傳輸類型
- txt["Content-Type"] = 'application/octet-stream'
3.設置附件名稱
- txt["Content-Disposition"] = 'attachment; filename = "fd.txt" '
4.將文件添加到附件中
- msg6.attach(txt)
最后就成功將文件添加到了附件中了。

項目總結
以上便是我對郵件發(fā)送的所有感悟了,另外如果你想將郵件傳輸時的過程直觀展示出來的話只需在郵件服務器登陸的前一句加上:
- sm.set_debuglevel(1)
這樣便可以將所有傳輸過程打印在終端了。通過對郵件的學習,可以極大地便利我們的生活,你可以使用郵件來給你設置一個計劃表,通過程序實現(xiàn),每天按時發(fā)送郵件,是不是很高逼格了,希望今天這篇文章能讓大家對郵件有個全新的認識。