背景
公司內(nèi)網(wǎng)有個(gè)論壇,各種公司的前沿消息都會(huì)有人在討論。一忙起來,經(jīng)常忘記逛論壇,所以寫了個(gè)爬蟲,爬取論壇前10頁帖子,將回復(fù)量較多的帖子通過郵件發(fā)送給自己,這樣,在沒時(shí)間逛論壇的時(shí)候,也能關(guān)注到一些相關(guān)消息。
基于以上背景,涉及到了python發(fā)送郵件,寫下這篇文章作為對相關(guān)知識(shí)的復(fù)習(xí)與鞏固。
相關(guān)模塊介紹
-
smtplib模塊
-
SMTP類
smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])
如上可看出,構(gòu)造函數(shù)的參數(shù)都是可選參數(shù)。- 當(dāng)沒有參數(shù)的時(shí)候,會(huì)創(chuàng)建出一個(gè)SMTP連接實(shí)例
- 當(dāng)傳入host和port參數(shù)時(shí),在初始化SMTP實(shí)例時(shí),會(huì)自動(dòng)調(diào)用connect()函數(shù)
-
SMTP對象擁有的方法
-
SMTP.connect([host[, port]])
連接到給定端口的主機(jī)。
- 沒參數(shù)時(shí),則通過標(biāo)準(zhǔn)的SMTP端口25連接到本地主機(jī)
- 當(dāng)host參數(shù)末尾加上:25(如"smtp.163.com:25"),則不需要指定port端口號(hào)
- 函數(shù)返回值為一個(gè)包含兩個(gè)元素的元組。一個(gè)返回狀態(tài)碼,一個(gè)服務(wù)器發(fā)送的連接反饋消息
- 當(dāng)創(chuàng)建實(shí)例時(shí)傳入了hostname,該函數(shù)會(huì)被自動(dòng)調(diào)用
SMTP.login(user, password)
登錄到SMTP服務(wù)器。SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])
發(fā)送郵件。
- from_addr 發(fā)件人地址
- to_addrs 收件人地址列表,如果該參數(shù)為一個(gè)字符串,則把它當(dāng)作數(shù)組的第一個(gè)元素
- msg一個(gè)字符串格式的message報(bào)文
-
SMTP.quit()
結(jié)束SMTP會(huì)話并關(guān)閉連接。
-
-
常見使用方式
smtpObj = smtplib.SMTP()
smtpObj.connect('hostname:port')
smtpObj.login(user,password)
smtpObj.sendmail(from,to,msg)
smtpObj.quit()
-
email模塊
email模塊是一個(gè)用來管理email消息的庫,包含MIME和其他基于RFC2822的消息文檔。它并不負(fù)責(zé)處理發(fā)送郵件。
-
email.mime子模塊
創(chuàng)建email和MIME對象- email.mime.multipart.MIMEMultipart([_subtype[, boundary[, _subparts[, _params]]]])
MIMEBase的一個(gè)子類,多個(gè)MIME對象的集合,- _subtype默認(rèn)值為mixed。
- boundary是MIMEMultipart的邊界,默認(rèn)邊界是可數(shù)的。
- _subparts可以轉(zhuǎn)化成list的MIME對象。
- 可通過message.attach將新的MIME對象添加到附件中。
- email.mime.multipart.MIMEMultipart([_subtype[, boundary[, _subparts[, _params]]]])
-
email.mime.audio.MIMEAudio(_audiodata[, _subtype[,_encoder[, **_params]]])
該類用來創(chuàng)建音頻類型的MIME消息對象- _audiodata參數(shù)是一個(gè)包含音頻數(shù)據(jù)流的字符串
- 如果audiodata數(shù)據(jù)由標(biāo)準(zhǔn)庫sndhdr
譯碼,那么subtype則會(huì)被自動(dòng)包含在Content-type頭中,否則,必須顯示的指定subtype參數(shù)
-
email.mime.image.MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]])
該類用來創(chuàng)建圖像類型的MIME消息對象- 參數(shù)與上一個(gè)類相似,不做詳細(xì)解釋
email.mime.text.MIMEText(_text[, _subtype[, _charset]])
該類用來創(chuàng)建文本類型的MIME消息對象_subtype默認(rèn)的plain格式
_charset是文本的字符集,默認(rèn)為ascii
如果文本為unicode編碼格式,將使用_charset的output_charset(詳見 email.charset
)進(jìn)行編碼,否則,按照原來的格式輸出-
email.header子模塊
- email.header.Header([s[, charset[, maxlinelen[, header_name[, continuation_ws[, errors]]]]]])
創(chuàng)建一個(gè)遵從MIME的包含不同字符集編碼字符串的header- 可選的s是header的初始化值,默認(rèn)為空,如果沒有賦值,可以通過append函數(shù)進(jìn)行插入。
- email.header.Header([s[, charset[, maxlinelen[, header_name[, continuation_ws[, errors]]]]]])
-
例子
- 創(chuàng)建一個(gè)普通文本消息
from email.mime.text import MIMEText
from email.header import Header
mes = MIMEText(body, 'plain', 'utf-8') # 正文
mes['From'] = Header('xxx@xxx.com','utf-8') # 發(fā)件人
mes['To'] = Header('xxx@xxx.com','utf-8') # 收件人
mes['Cc'] = Header('xxx@xxx.com','utf-8') # 抄送人
mes['Subject'] = Header(subject, 'utf-8') # 主題
- 創(chuàng)建一個(gè)html文本消息
from email.mime.text import MIMEText
from email.header import Header
mes = MIMEText(body, 'html', 'utf-8') # body按照html格式寫
mes['From'] = Header('xxx@xxx.com','utf-8') # 發(fā)件人
mes['To'] = Header('xxx@xxx.com','utf-8') # 收件人
mes['Cc'] = Header('xxx@xxx.com','utf-8') # 抄送人
mes['Subject'] = Header(subject, 'utf-8') # 主題
msg['date']='xxxx-xx-xx' #
3. 創(chuàng)建帶附件郵件
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
#創(chuàng)建一個(gè)帶附件的實(shí)例
msg = MIMEMultipart()
#構(gòu)造附件1
att1 = MIMEText(open('d:\\123.rar', 'rb').read(), 'base64', 'gb2312')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="123.doc"'#這里的filename可以任意寫,寫什么名字,郵件中顯示什么名字
msg.attach(att1)
#構(gòu)造附件2
att2 = MIMEText(open('d:\\123.txt', 'rb').read(), 'base64', 'gb2312')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="123.txt"'
msg.attach(att2)
#加郵件頭
msg['to'] = 'YYY@YYY.com'
msg['from'] = 'XXX@XXX.com'
msg['subject'] = 'hello world'
- 如果想發(fā)送一個(gè)帶圖片附件的郵件,同時(shí)圖片還顯示在正文中
- 按照3.的方式(圖片用MIMEImage)插入圖片附件hello.jpg
- 按照2.的方式,發(fā)送一個(gè)html文件,在html中插入img標(biāo)簽,src為圖片的路徑
