python email模块
python email模塊
?
官方文檔
?
email模塊
電子郵件包是一個(gè)用于管理電子郵件消息的庫。它的特殊設(shè)計(jì)不用于向SMTP (RFC 2821)、NNTP或其他服務(wù)器發(fā)送任何電子郵件消息;這些是模塊的函數(shù),如smtplib和nntplib。電子郵件包嘗試盡可能符合RFC,支持RFC 5233和RFC 6532,以及與mime相關(guān)的RFC 2045、RFC 2046、RFC 2047、RFC 2183和RFC 2231。
?
電子郵件包的總體結(jié)構(gòu)可以分為三個(gè)主要組件,以及控制其他組件行為的第四個(gè)組件。
?
包的核心組件是表示電子郵件消息的“對(duì)象模型”。應(yīng)用程序主要通過消息子模塊中定義的對(duì)象模型接口與包進(jìn)行交互。應(yīng)用程序可以使用這個(gè)API詢問關(guān)于現(xiàn)有電子郵件的問題,構(gòu)造新的電子郵件,或者添加或刪除本身使用相同對(duì)象模型接口的電子郵件子組件。也就是說,根據(jù)電子郵件消息及其MIME子組件的性質(zhì),電子郵件對(duì)象模型是所有提供EmailMessage API的對(duì)象的樹結(jié)構(gòu)。
?
包的另外兩個(gè)主要組件是解析器和生成器。解析器獲取電子郵件消息的序列化版本(字節(jié)流),并將其轉(zhuǎn)換為EmailMessage對(duì)象樹。生成器接收電子郵件消息并將其轉(zhuǎn)換回序列化的字節(jié)流。(解析器和生成器也處理文本字符流,但不建議使用這種用法,因?yàn)楹苋菀壮霈F(xiàn)以某種方式無效的消息。)
?
控制組件是策略模塊。每個(gè)電子郵件消息、每個(gè)生成器和每個(gè)解析器都有一個(gè)關(guān)聯(lián)的策略對(duì)象來控制其行為。通常,應(yīng)用程序只需要在創(chuàng)建EmailMessage時(shí)指定策略,方法是直接實(shí)例化EmailMessage來創(chuàng)建新電子郵件,或者使用解析器解析輸入流。但是,當(dāng)使用生成器序列化消息時(shí),策略可以更改。例如,這允許從磁盤解析一般的電子郵件消息,但是在將其發(fā)送到電子郵件服務(wù)器時(shí),可以使用標(biāo)準(zhǔn)SMTP設(shè)置對(duì)其進(jìn)行序列化。
?
電子郵件包盡力向應(yīng)用程序隱藏各種治理rfc的詳細(xì)信息。從概念上講,應(yīng)用程序應(yīng)該能夠?qū)㈦娮余]件消息視為unicode文本和二進(jìn)制附件的結(jié)構(gòu)化樹,而不必?fù)?dān)心這些附件在序列化時(shí)是如何表示的。然而,在實(shí)踐中,經(jīng)常需要了解至少一些管理MIME消息及其結(jié)構(gòu)的規(guī)則,特別是MIME“內(nèi)容類型”的名稱和性質(zhì),以及它們?nèi)绾螛?biāo)識(shí)多部分文檔。在大多數(shù)情況下,這些知識(shí)只應(yīng)該在更復(fù)雜的應(yīng)用程序中使用,即使在這種情況下,也應(yīng)該只是高級(jí)結(jié)構(gòu),而不是那些結(jié)構(gòu)如何表示的細(xì)節(jié)。由于MIME內(nèi)容類型在現(xiàn)代互聯(lián)網(wǎng)軟件中被廣泛使用(不僅僅是電子郵件),這對(duì)許多程序員來說將是一個(gè)熟悉的概念。
?
以下部分描述了電子郵件包的功能。我們從消息對(duì)象模型開始,它是應(yīng)用程序?qū)⑹褂玫闹饕涌?#xff0c;然后是解析器和生成器組件。然后介紹策略控制,它完成了對(duì)庫的主要組件的處理。
接下來的三個(gè)部分將討論包可能引發(fā)的異常和解析器可能檢測(cè)到的缺陷(不符合rfc)。然后,我們將介紹headerregistry和contentmanager子組件,它們分別為更詳細(xì)地操作頭部和有效負(fù)載提供了工具。這兩個(gè)組件都包含與消費(fèi)和生成非平凡消息相關(guān)的特性,而且還記錄了它們的可擴(kuò)展性api,這將是高級(jí)應(yīng)用程序感興趣的。
?
下面是一組使用前面幾節(jié)中介紹的api的基本部分的示例。
上面所示的是電子郵件包的現(xiàn)代(unicode友好)API。余下的部分,從Message類開始,將介紹遺留的compat32 API,它更直接地處理如何表示電子郵件消息的細(xì)節(jié)。compat32 API不會(huì)向應(yīng)用程序隱藏rfc的細(xì)節(jié),但是對(duì)于需要在該級(jí)別上操作的應(yīng)用程序,它們可能是有用的工具。由于向后兼容性的原因,本文檔還適用于仍然使用compat32 API的應(yīng)用程序。
?
在3.6版更改:文檔重組和重寫,促進(jìn)新的EmailMessage / EmailPolicy API。
Contents of the?email?package documentation:
- email.message: Representing an email message
- email.parser: Parsing email messages
- FeedParser API
- Parser API
- Additional notes
- email.generator: Generating MIME documents
- email.policy: Policy Objects
- email.errors: 異常和缺陷類
- email.headerregistry: Custom Header Objects
- email.contentmanager: Managing MIME Content
- Content Manager Instances
- email: 示例
Legacy API:
- email.message.Message: Representing an email message using the?compat32?API
- email.mime: Creating email and MIME objects from scratch
- email.header: Internationalized headers
- email.charset: Representing character sets
- email.encoders: Encoders
- email.utils: 其他工具
- email.iterators: Iterators
?
Email模塊
如果想在郵件中攜帶附件、使用html書寫郵件,附帶圖片等等,就需要使用email模塊及其子模塊。下面來看看email包,email包是用來管理email信息的,它包括MIME和其他基于RFC 2822的消息格式。email包的主要特征是在它內(nèi)部解析和生成email信息是分開的模塊來實(shí)現(xiàn)的。
MIME消息由消息頭和消息體兩大部分組成,在郵件里就是郵件頭和郵件體。郵件頭與郵件體之間以空行進(jìn)行分隔。
郵件頭包含了發(fā)件人、收件人、主題、時(shí)間、MIME版本、郵件內(nèi)容的類型等重要信息。每條信息稱為一個(gè)域,由域名后加“: ”和信息內(nèi)容構(gòu)成,可以是一行,較長的也可以占用多行。域的首行必須“頂頭”寫,即左邊不能有空白字符(空格和制表符);續(xù)行則必須以空白字符打頭,且第一個(gè)空白字符不是信息本身固有的。
郵件體包含郵件的內(nèi)容,它的類型由郵件頭的“Content-Type”域指出。最常見的類型有text/plain(純文本)和text/html(超文本)。郵件體被分為多個(gè)段,每個(gè)段又包含段頭和段體兩部分,這兩部分之間也以空行分隔。常見的multipart類型有三種:multipart/mixed, multipart/related和multipart/alternative。
在email的包里面包含了很多模塊:
主要來看看email.mime,在郵件中攜帶附件、圖片、音頻時(shí),主要使用的是該模塊。一般情況下,你通過解析一個(gè)文件或者一段text來生成一個(gè)消息對(duì)象結(jié)構(gòu),你也可以從頭開始建立一個(gè)消息結(jié)構(gòu),實(shí)際上,你可以給一個(gè)已經(jīng)存在的消息結(jié)構(gòu)追加一個(gè)新的消息對(duì)象。你可以通過創(chuàng)建message實(shí)例來創(chuàng)建一個(gè)對(duì)象結(jié)構(gòu),然后給該結(jié)構(gòu)追加附件和頭部信息。email包提供了一些子類使得該操作變得很容易。
模擬在郵件內(nèi)容中攜帶圖片,如下:
郵件內(nèi)容中攜帶圖片
from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.image import MIMEImage import smtplibfrom_mail = 'froooooooom@gmail.com' to_mail = 'toooooooooo@qq.com'msg = MIMEMultipart() msg['From'] = from_mail msg['To'] = to_mail msg['Subject'] = 'python mail test'body = 'test img send' con = MIMEText('<b>%s</b> <img alt="" src="cid:D:\\10535-102.jpg" /> ' % body,'html') msg.attach(con)img = MIMEImage(file('D:\\10535-102.jpg','rb').read()) img.add_header('Content-ID','D:\\10535-102.jpg') msg.attach(img)server = smtplib.SMTP('smtp.gmail.com') server.docmd('ehol','tooooooo@gmail.com') server.starttls() server.login('username@gmail.com','password')server.sendmail(from_mail,to_mail,msg.as_string()) server.quit()郵件中攜帶附件
發(fā)送帶附件的郵件,首先要?jiǎng)?chuàng)建MIMEMultipart()實(shí)例,然后構(gòu)造附件,如果有多個(gè)附件,可依次構(gòu)造,最后利用smtplib.smtp發(fā)送
模擬在 郵件中攜帶附件 ,如下:
?
?
SMTP
smtp實(shí)例封裝一個(gè)smtp連接,它支持所有的SMTP和ESMTP操作指令,如果host和port參數(shù)被定義,則smtp會(huì)在初始化期間自動(dòng)調(diào)用connect()方法,如果connect()方法失敗,則會(huì)觸發(fā)SMTPConnectError異常,timeout參數(shù)設(shè)置了超時(shí)時(shí)間。?
SMTP模塊的方法:
SMTP.set_debuglevel(level) 設(shè)置輸出debug調(diào)試信息,默認(rèn)不輸出調(diào)試信息。 SMTP.docmd(cmd[, argstring]) 發(fā)送一個(gè)command到smtp服務(wù)器, SMTP.connect([host[, port]]) 連接到指定的smtp服務(wù)器,默認(rèn)是本機(jī)的25端口。也可以寫成hostname:port的形式。 SMTP.helo([hostname]) 使用helo指令向smtp服務(wù)器確認(rèn)你的身份。 SMTP.ehlo([hostname]) 使用ehlo指令向esmtp服務(wù)器確認(rèn)你的身份。 SMTP.ehlo_or_helo_if_needed() 如果在以前的會(huì)話連接中沒有提供ehlo或者h(yuǎn)elo指令,這個(gè)方法調(diào)用ehlo()或者h(yuǎn)elo()。 SMTP.has_extn(name) 判斷指定的名稱是否在smtp服務(wù)器上。 SMTP.verify(address) 判斷郵件地址是否在smtp服務(wù)器上存在。 SMTP.login(user, password) 登陸需要驗(yàn)證的smtp服務(wù)器,如果之前沒有提供ehlo或者h(yuǎn)elo指令,則會(huì)先嘗試ESMTP的ehlo指令。 SMTP.starttls([keyfile[, certfile]]) 使smtp連接運(yùn)行在TLS模式,所有的smtp指令都會(huì)被加密。 SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]) 發(fā)送郵件,該方法需要一些郵件地址和消息。 SMTP.quit() 終止smtp會(huì)話并且關(guān)閉連接。?
1.注意:本人測(cè)試使用新浪郵箱:
# 新浪免費(fèi)郵箱發(fā)信(smtp) # 服務(wù)器的地址為:smtp.sina.com # 默認(rèn)端口是25 # # 新浪免費(fèi)郵箱收信(pop3) # 服務(wù)器的地址為:pop.sina.com # 默認(rèn)端口是110?
2.如果你們使新浪郵箱一定要開啟POP3/SMTP服務(wù):
?
3.另外注意:本人登陸使用的是用戶名密碼,但是如網(wǎng)易郵箱,登陸需要授權(quán)碼!
?使用sendmail發(fā)送郵件得測(cè)試代碼
#coding: utf-8 import smtplib from email.mime.text import MIMEText from email.header import Header#收件人和發(fā)件人 receiver = '188xxxx7275@163.com' sender = '83xxxx202@qq.com'#發(fā)件人郵箱的SMTP服務(wù)器(即sender的SMTP服務(wù)器) smtpserver = 'smtp.qq.com'#發(fā)件人郵箱的用戶名和授權(quán)碼(不是登陸郵箱的密碼) username = '83xxxx202@qq.com' password = 'moxxxxxxxxxxxfcd' #(83xxxx202@qq.com郵箱的授權(quán)碼或者密碼) mail_title = '有陌生人來訪!' mail_body = '請(qǐng)查看附件圖片'#創(chuàng)建一個(gè)實(shí)例 message = MIMEText( mail_body, 'plain', 'utf-8' ) #郵件正文 # (plain表示mail_body的內(nèi)容直接顯示,也可以用text,則mail_body的內(nèi)容在正文中以文本的形式顯示,需要下載) message ['From'] = sender #郵件上顯示的發(fā)件人 message['To'] = receiver #郵件上顯示的收件人 message['Subject'] = Header( mail_title, 'utf-8' ) #郵件主題 smtp = smtplib.SMTP() #創(chuàng)建一個(gè)連接 smtp.connect( smtpserver ) #連接發(fā)送郵件的服務(wù)器 smtp.login( username, password ) #登錄服務(wù)器 smtp.sendmail( sender, receiver, message.as_string() ) #填入郵件的相關(guān)信息并發(fā)送 smtp.quit()?
?
爬取天氣預(yù)報(bào)并發(fā)到指定人的QQ郵箱(使用新浪郵箱)
天氣預(yù)報(bào): https://tianqi.so.com/weather/ # coding: utf-8 import smtplib from email.mime.text import MIMEText from email.header import Header import requests from bs4 import BeautifulSoup import prettytable as pt def get_Data(url):data_list = []response = requests.get(url)html_doc = response.textsoup = BeautifulSoup(html_doc, 'lxml') # 將html代碼自動(dòng)補(bǔ)全,并按html代碼格式返回wendu = soup.find('div', class_='temperature').get_text()tianqi = soup.find('div', class_='weather-icon-wrap').get_text()data_list.append("現(xiàn)在的溫度:%s\n現(xiàn)在天氣情況:%s" % (wendu, tianqi))list = soup.find_all('ul', class_='weather-columns')for item in list:data_list.append(item.get_text())print("列表數(shù)據(jù):",data_list)a = 1tb = pt.PrettyTable() #創(chuàng)建PrettyTable對(duì)象tb.field_names = ["日期","天氣","詳情"]for item in data_list:# print(a)if a != 1:# print(item.strip())# print(item.strip().split()[0]+item.strip().split()[1],item.strip().split()[2],item.strip().split()[3])tb.add_row([item.strip().split()[0]+item.strip().split()[1],item.strip().split()[2],item.strip().split()[3]])else: print(item.strip())a+=1print(tb)return tbdef send_mail(msg,receiver):# 收件人receiver = receivermail_title = '天氣預(yù)報(bào)'mail_body = str(msg)# 創(chuàng)建一個(gè)實(shí)例message = MIMEText(mail_body, 'plain', 'utf-8') # 郵件正文# (plain表示mail_body的內(nèi)容直接顯示,也可以用text,則mail_body的內(nèi)容在正文中以文本的形式顯示,需要下載)message['From'] = sender # 郵件上顯示的發(fā)件人message['To'] = receiver # 郵件上顯示的收件人message['Subject'] = Header(mail_title, 'utf-8') # 郵件主題 smtp = smtplib.SMTP() # 創(chuàng)建一個(gè)連接smtp.connect(smtpserver) # 連接發(fā)送郵件的服務(wù)器smtp.login(username, password) # 登錄服務(wù)器smtp.sendmail(sender, receiver, message.as_string()) # 填入郵件的相關(guān)信息并發(fā)送 smtp.quit()if __name__ == '__main__':sender = '發(fā)送者郵箱'# 發(fā)件人郵箱的SMTP服務(wù)器(即sender的SMTP服務(wù)器)smtpserver = 'smtp.sina.com'# 發(fā)件人郵箱的用戶名和授權(quán)碼(不是登陸郵箱的密碼)username = '發(fā)送者登陸郵箱'password = '密碼' # (83xxxx202@qq.com郵箱的授權(quán)碼或者密碼)url_list = ['url1','url2']receiver_list =['接收者郵箱1','接收者郵箱2']for i in range(len(url_list)):tb = get_Data(url_list[i]) #獲得每一個(gè)用戶的數(shù)據(jù)send_mail(tb,receiver_list[i]) #發(fā)送郵件?
運(yùn)行結(jié)果:
列表數(shù)據(jù): ['現(xiàn)在的溫度:19\n現(xiàn)在天氣情況:晴', '今天 (05-13) 多云\n 16/24℃輕度北風(fēng) 3-5級(jí)', '明天 (05-14) 小雨轉(zhuǎn)中雨\n 18/24℃良東南風(fēng) 微風(fēng)', '周三 (05-15) 小雨轉(zhuǎn)多云\n 19/26℃優(yōu)北風(fēng) 微風(fēng)', '周四 (05-16) 多云\n 20/30℃優(yōu)東北風(fēng) 微風(fēng)', '周五 (05-17) 多云\n 20/29℃良東風(fēng) 微風(fēng)', '周六 (05-18) 小雨\n 19/31℃優(yōu)東風(fēng) 微風(fēng)', '周日 (05-19) 小雨轉(zhuǎn)多云\n 12/27℃優(yōu)北風(fēng) 5-6級(jí)'] 現(xiàn)在的溫度:19 現(xiàn)在天氣情況:晴 +-------------+------------+----------------+ | 日期 | 天氣 | 詳情 | +-------------+------------+----------------+ | 今天(05-13) | 多云 | 16/24℃輕度北風(fēng) | | 明天(05-14) | 小雨轉(zhuǎn)中雨 | 18/24℃良東南風(fēng) | | 周三(05-15) | 小雨轉(zhuǎn)多云 | 19/26℃優(yōu)北風(fēng) | | 周四(05-16) | 多云 | 20/30℃優(yōu)東北風(fēng) | | 周五(05-17) | 多云 | 20/29℃良東風(fēng) | | 周六(05-18) | 小雨 | 19/31℃優(yōu)東風(fēng) | | 周日(05-19) | 小雨轉(zhuǎn)多云 | 12/27℃優(yōu)北風(fēng) | +-------------+------------+----------------+ 列表數(shù)據(jù): ['現(xiàn)在的溫度:21\n現(xiàn)在天氣情況:多云', '今天 (05-13) 晴轉(zhuǎn)小雨\n 17/25℃持續(xù)無風(fēng)向 微風(fēng)', '明天 (05-14) 多云轉(zhuǎn)小雨\n 17/25℃持續(xù)無風(fēng)向 微風(fēng)', '周三 (05-15) 小雨轉(zhuǎn)晴\n 19/28℃持續(xù)無風(fēng)向 微風(fēng)', '周四 (05-16) 晴轉(zhuǎn)小雨\n 20/28℃持續(xù)無風(fēng)向 微風(fēng)', '周五 (05-17) 多云轉(zhuǎn)陰\n 21/28℃持續(xù)無風(fēng)向 微風(fēng)', '周六 (05-18) 陣雨\n 18/28℃持續(xù)無風(fēng)向 微風(fēng)', '周日 (05-19) 多云\n 17/27℃持續(xù)無風(fēng)向 微風(fēng)'] 現(xiàn)在的溫度:21 現(xiàn)在天氣情況:多云 +-------------+------------+------------------+ | 日期 | 天氣 | 詳情 | +-------------+------------+------------------+ | 今天(05-13) | 晴轉(zhuǎn)小雨 | 17/25℃持續(xù)無風(fēng)向 | | 明天(05-14) | 多云轉(zhuǎn)小雨 | 17/25℃持續(xù)無風(fēng)向 | | 周三(05-15) | 小雨轉(zhuǎn)晴 | 19/28℃持續(xù)無風(fēng)向 | | 周四(05-16) | 晴轉(zhuǎn)小雨 | 20/28℃持續(xù)無風(fēng)向 | | 周五(05-17) | 多云轉(zhuǎn)陰 | 21/28℃持續(xù)無風(fēng)向 | | 周六(05-18) | 陣雨 | 18/28℃持續(xù)無風(fēng)向 | | 周日(05-19) | 多云 | 17/27℃持續(xù)無風(fēng)向 | +-------------+------------+------------------+?
?
?
?
?
?
參考:https://www.linuxidc.com/Linux/2017-12/149258.htm
參考:https://www.jb51.net/article/49219.htm
轉(zhuǎn)載于:https://www.cnblogs.com/-wenli/p/10816927.html
總結(jié)
以上是生活随笔為你收集整理的python email模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最新软件测试岗位职责大全,看看哪些你还没
- 下一篇: 云计算开发技术,Python自动化运维开