python接口自動化(三十三)-python自動發(fā)郵件總結(jié)及實例說明番外篇——下(詳解)

1.簡介

  發(fā)郵件前我們需要了解的是郵件是怎么一個形式去發(fā)送到對方手上的征冷,通俗點來說就是你寫好一封信,然后裝進信封誓琼,寫上地址资盅,貼上郵票,然后就近找個郵局踊赠,把信仍進去,其他的就不關(guān)心了每庆,只是關(guān)心時間筐带,而電子郵件不像日常發(fā)送郵件的按天算,時間都是按

秒算的缤灵。

電子郵件的發(fā)送流程:

1伦籍、你使用某款電子郵件軟件MUA:mail user agent --郵件用戶代理,填寫完成點擊發(fā)送

2腮出、在你點擊發(fā)送的時候電子郵件軟件發(fā)出去帖鸦,到MTA:mail transfer agent--郵件傳輸代理,即email服務(wù)提供商胚嘲,如網(wǎng)易等

3作儿、MTA--郵箱傳輸代理會把郵箱投遞到郵件的最終目的地MDA:mail delivery agent---郵箱投遞服務(wù)

4、email到達MDA后就會放在某個服務(wù)器上馋劈,存在數(shù)據(jù)庫里攻锰,收件人必須通過MUA從MDA中把郵箱放到自己電腦上

發(fā)件人 -> MUA -> MTA -> MTA -> 若干個MTA -> MDA<-MUA<-收件人

python發(fā)郵件需要掌握兩個模塊的用法,smtplib和email妓雾,這倆模塊是python自帶的娶吞,只需import即可使用。smtplib模塊主要負責發(fā)送郵件械姻,email模塊主要負責構(gòu)造郵件妒蛇。

smtplib模塊主要負責發(fā)送郵件:是一個發(fā)送郵件的動作,連接郵箱服務(wù)器,登錄郵箱绣夺,發(fā)送郵件(有發(fā)件人吏奸,收信人,郵件內(nèi)容)乐导。

email模塊主要負責構(gòu)造郵件:指的是郵箱頁面顯示的一些構(gòu)造苦丁,如發(fā)件人,收件人物臂,主題旺拉,正文,附件等棵磷。

2.smtplib模塊

smtplib使用較為簡單蛾狗。以下是最基本的語法。

導入及使用方法如下:

1import smtplib23smtp = smtplib.SMTP() 4smtp.connect('smtp.163.com,25') 5smtp.login(username, password) 6smtp.sendmail(sender, receiver, msg.as_string()) 7smtp.quit()

說明:

smtplib.SMTP():實例化SMTP()

connect(host,port):

host:指定連接的郵箱服務(wù)器仪媒。常用郵箱的smtp服務(wù)器地址如下:

新浪郵箱:smtp.sina.com,新浪VIP:smtp.vip.sina.com,搜狐郵箱:smtp.sohu.com沉桌,126郵箱:smtp.126.com,139郵箱:smtp.139.com,163網(wǎng)易郵箱:smtp.163.com。

port:指定連接服務(wù)器的端口號算吩,默認為25.

login(user,password):

user:登錄郵箱的用戶名留凭。

password:登錄郵箱的密碼,像筆者用的是網(wǎng)易郵箱偎巢,網(wǎng)易郵箱一般是網(wǎng)頁版蔼夜,需要用到客戶端密碼,需要在網(wǎng)頁版的網(wǎng)易郵箱中設(shè)置授權(quán)碼,該授權(quán)碼即為客戶端密碼。

sendmail(from_addr,to_addrs,msg,...):

from_addr:郵件發(fā)送者地址

to_addrs:郵件接收者地址朽褪。發(fā)送郵件,多人時用list匠题,字符串列表['接收地址1','接收地址2','接收地址3',...]或'接收地址'

msg:發(fā)送消息:郵件內(nèi)容。郵件正文是一個str但金,一般是msg.as_string():as_string()是將msg(MIMEText對象或者MIMEMultipart對象)變?yōu)閟tr韭山。

quit(): 退出關(guān)閉郵箱,用于結(jié)束SMTP會話冷溃。

3.email模塊

email模塊下有mime包掠哥,mime英文全稱為“Multipurpose Internet Mail Extensions”,即多用途互聯(lián)網(wǎng)郵件擴展秃诵,是目前互聯(lián)網(wǎng)電子郵件普遍遵循的郵件技術(shù)規(guī)范续搀。

該mime包下常用的有三個模塊:text,image菠净,multpart禁舷。

導入方法如下:

from email.mime.multipart import MIMEMultipart? ?

from email.mime.text import MIMEText? ?

from email.mime.image import MIMEImage

構(gòu)造一個郵件對象就是一個Message對象彪杉,如果構(gòu)造一個MIMEText對象,就表示一個文本郵件對象牵咙,如果構(gòu)造一個MIMEImage對象派近,就表示一個作為附件的圖片,要把多個對象組合起來洁桌,就用MIMEMultipart對象渴丸,而MIMEBase可以表示任何對象。它們的繼承關(guān)系如下:

Message+- MIMEBase? +- MIMEMultipart? +- MIMENonMultipart? ? ? +- MIMEMessage? ? ? +- MIMEText? ? ? +- MIMEImage

3.1 text說明

郵件發(fā)送程序為了防止有些郵件閱讀軟件不能顯示處理HTML格式的數(shù)據(jù)另凌,通常都會用兩類型分別為"text/plain"和"text/html"

構(gòu)造MIMEText對象時谱轨,第一個參數(shù)是郵件正文,第二個參數(shù)是MIME的subtype吠谢,最后一定要用utf-8編碼保證多語言兼容性土童。

3.1.1添加普通文本

方法很簡單,在構(gòu)造MIMEText對象時工坊,把TEXT字符串傳進去献汗,再把第二個參數(shù)plain和第三個參數(shù)編碼傳進去即可。plain表示純文本 王污,后面的則是編譯罢吃,保證多語言兼容?

text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttps://www.cnblogs.com/du-hong"? ?

text_plain = MIMEText(text,'plain', 'utf-8')? ?

查看MIMEText屬性:可以觀察到MIMEText,MIMEImage和MIMEMultipart的屬性都一樣昭齐。

print dir(text_plain)

['__contains__', '__delitem__', '__doc__', '__getitem__', '__init__', '__len__', '__module__', '__setitem__', '__str__', '_charset', '_default_type', '_get_params_preserve', '_headers', '_payload', '_unixfrom', 'add_header', 'as_string', 'attach', 'defects', 'del_param', 'epilogue', 'get', 'get_all', 'get_boundary', 'get_charset', 'get_charsets', 'get_content_charset', 'get_content_maintype', 'get_content_subtype', 'get_content_type', 'get_default_type', 'get_filename', 'get_param', 'get_params', 'get_payload', 'get_unixfrom', 'has_key', 'is_multipart', 'items', 'keys', 'preamble', 'replace_header', 'set_boundary', 'set_charset', 'set_default_type', 'set_param', 'set_payload', 'set_type', 'set_unixfrom', 'values', 'walk']

3.1.2添加超文本(HTML)

方法也很簡單刃麸,在構(gòu)造MIMEText對象時,把HTML字符串傳進去司浪,再把第二個參數(shù)由plain變?yōu)閔tml就可以了

1html =""" 2 3 4

5Hereisthe link you wanted. 6

7 8 9"""10text_html = MIMEText(html,'html','utf-8')

3.1.3添加附件

首先要創(chuàng)建MIMEMultipart()實例,然后構(gòu)造附件把沼,如果有多個附件啊易,可依次構(gòu)造,最后利用smtplib.smtp發(fā)送

sendfile=open(r'D:\pythontest\text.txt','rb').read()

text_att = MIMEText(sendfile, 'base64', 'utf-8')? ?

text_att["Content-Type"] = 'application/octet-stream'? ?

text_att["Content-Disposition"] = 'attachment; filename="顯示的名字.txt"'?

3.2 image說明

添加圖片:

sendimagefile=open(r'D:\pythontest\testimage.png','rb').read()

image = MIMEImage(sendimagefile)

image.add_header('Content-ID','<image1>')

查看MIMEImage屬性:

print dir(image)

['__contains__', '__delitem__', '__doc__', '__getitem__', '__init__', '__len__', '__module__', '__setitem__', '__str__', '_charset', '_default_type', '_get_params_preserve', '_headers', '_payload', '_unixfrom', 'add_header', 'as_string', 'attach', 'defects', 'del_param', 'epilogue', 'get', 'get_all', 'get_boundary', 'get_charset', 'get_charsets', 'get_content_charset', 'get_content_maintype', 'get_content_subtype', 'get_content_type', 'get_default_type', 'get_filename', 'get_param', 'get_params', 'get_payload', 'get_unixfrom', 'has_key', 'is_multipart', 'items', 'keys', 'preamble', 'replace_header', 'set_boundary', 'set_charset', 'set_default_type', 'set_param', 'set_payload', 'set_type', 'set_unixfrom', 'values', 'walk']

3.3 multpart說明

常見的multipart類型有三種:multipart/alternative, multipart/related和multipart/mixed饮睬。

郵件類型為"multipart/alternative"的郵件包括純文本正文(text/plain)和超文本正文(text/html)租谈。

郵件類型為"multipart/related"的郵件正文中包括圖片,聲音等內(nèi)嵌資源捆愁。

郵件類型為"multipart/mixed"的郵件包含附件割去。向上兼容,如果一個郵件有純文本正文昼丑,超文本正文呻逆,內(nèi)嵌資源,附件菩帝,則選擇mixed類型咖城。

msg = MIMEMultipart('mixed')

我們必須把Subject茬腿,F(xiàn)rom,To宜雀,Date添加到MIMEText對象或者MIMEMultipart對象中切平,郵件中才會顯示主題,發(fā)件人辐董,收件人悴品,時間(若無時間,就默認一般為當前時間简烘,該值一般不設(shè)置)苔严。

msg = MIMEMultipart('mixed')

msg['Subject'] = 'Python email test'

msg['From'] = 'XXX@163.com <XXX@163.com>'

msg['To'] = 'XXX@126.com'

msg['Date']='2019-5-10'

查看MIMEMultipart屬性:

msg = MIMEMultipart('mixed')

print dir(msg)

結(jié)果:

['__contains__', '__delitem__', '__doc__', '__getitem__', '__init__', '__len__', '__module__', '__setitem__', '__str__', '_charset', '_default_type', '_get_params_preserve', '_headers', '_payload', '_unixfrom', 'add_header', 'as_string', 'attach', 'defects', 'del_param', 'epilogue', 'get', 'get_all', 'get_boundary', 'get_charset', 'get_charsets', 'get_content_charset', 'get_content_maintype', 'get_content_subtype', 'get_content_type', 'get_default_type', 'get_filename', 'get_param', 'get_params', 'get_payload', 'get_unixfrom', 'has_key', 'is_multipart', 'items', 'keys', 'preamble', 'replace_header', 'set_boundary', 'set_charset', 'set_default_type', 'set_param', 'set_payload', 'set_type', 'set_unixfrom', 'values', 'walk']

說明:

msg.add_header(_name,_value,**_params):添加郵件頭字段。

msg.as_string():是將msg(MIMEText對象或者MIMEMultipart對象)變?yōu)閟tr,如果只有一個html超文本正文或者plain普通文本正文的話夸研,一般msg的類型可以是MIMEText邦蜜;如果是多個的話,就都添加到MIMEMultipart悼沈,msg類型就變?yōu)镸IMEMultipart。

msg.attach(MIMEText對象或MIMEImage對象):將MIMEText對象或MIMEImage對象添加到MIMEMultipart對象中絮供。MIMEMultipart對象代表郵件本身,MIMEText對象或MIMEImage對象代表郵件正文。

以上的構(gòu)造的文本浓恳,超文本,附件,圖片都何以添加到MIMEMultipart('mixed')中:

msg.attach(text_plain)? ?

msg.attach(text_html)? ?

msg.attach(text_att)? ?

msg.attach(image)

4.文字,html保屯,圖片蝠猬,附件實現(xiàn)實例

4.1實例

4.2運行結(jié)果

4.3參考代碼

1# coding=utf-8 2#1.先設(shè)置編碼匆绣,utf-8可支持中英文拣凹,如上,一般放在第一行 3 4#2.注釋:包括記錄創(chuàng)建時間捧请,創(chuàng)建人,項目名稱立镶。 5''' 6Created on2019-5-10 7@author: 北京-宏哥 8Project:學習和使用郵箱發(fā)文字栈顷,html颤难,圖片,附件實現(xiàn)實例郵件 9'''10#3.導入模塊11import smtplib12from email.mime.multipart import MIMEMultipart13from email.mime.text import MIMEText14from email.mime.image import MIMEImage15from email.header import Header1617# 設(shè)置smtplib所需的參數(shù)18# 下面的發(fā)件人,收件人是用于郵件傳輸?shù)摹?9smtpserver ='smtp.mxhichina.com'20username ='noreply@xxx.cn'21password ='xxxx@@xx3'22sender ='noreply@xxx.cn'23# 收件人為一個收件人24# receiver='XXX@126.com'25# 收件人為多個收件人26receiver = ["1918991791@qq.com","2014816656@qq.com","hongge@xxx.cn"]2728subject ='Python email test'29# 通過Header對象編碼的文本蛀骇,包含utf-8編碼信息和Base64編碼信息厌秒。以下中文名測試ok30# subject ='中文標題'31# subject=Header(subject,'utf-8').encode()3233# 構(gòu)造郵件對象MIMEMultipart對象34# 下面的主題,發(fā)件人擅憔,收件人鸵闪,日期是顯示在郵件頁面上的。35msg = MIMEMultipart('mixed')36msg['Subject'] = subject37msg['From'] ='北京-宏哥<noreply@xxx.cn>'38# msg['To'] ="1918991791@qq.com","2014816656@qq.com","hongge@xxx.cn"39# 收件人為多個收件人,通過join將列表轉(zhuǎn)換為以;為間隔的字符串40msg['To'] =";".join(receiver)41# msg['Date']='2019-5-10'4243# 構(gòu)造文字內(nèi)容44text ="Hi!\nHow are you?\nHere is the link you wanted:\nhttps://www.cnblogs.com/du-hong"45text_plain = MIMEText(text,'plain','utf-8')46msg.attach(text_plain)4748# 構(gòu)造圖片鏈接49sendimagefile = open(r'E:\pythontest\testimage.png','rb').read()50image = MIMEImage(sendimagefile)51image.add_header('Content-ID','<image1>')52image["Content-Disposition"] ='attachment; filename="honggeimage.png"'53msg.attach(image)5455# 構(gòu)造html56# 發(fā)送正文中的圖片:由于包含未被許可的信息雕欺,網(wǎng)易郵箱定義為垃圾郵件岛马,報554 DT:SPM :

57html ="""58596061

Hi!
62How are you?
63Hereisthe link 北京-宏哥 you wanted.
64

656667"""68text_html = MIMEText(html,'html','utf-8')69text_html["Content-Disposition"] ='attachment; filename="texthtml.html"'70msg.attach(text_html)7172# 構(gòu)造附件73sendfile = open(r'E:\pythontest\text.txt','rb').read()74text_att = MIMEText(sendfile,'base64','utf-8')75text_att["Content-Type"] ='application/octet-stream'76# 以下附件可以重命名成aaa.txt77# text_att["Content-Disposition"] ='attachment; filename="aaa.txt"'78# 另一種實現(xiàn)方式79text_att.add_header('Content-Disposition','attachment', filename='hongge.txt')80# 以下中文測試不ok81# text_att["Content-Disposition"] = u'attachment; filename="中文附件.txt"'.decode('utf-8')82msg.attach(text_att)8384# 發(fā)送郵件85smtp = smtplib.SMTP()86smtp.connect('smtp.mxhichina.com')87# 我們用set_debuglevel(1)就可以打印出和SMTP服務(wù)器交互的所有信息。88# smtp.set_debuglevel(1)89smtp.login(username, password)90smtp.sendmail(sender, receiver, msg.as_string())91smtp.quit()

說明:

對有些 header 要特別留意屠列,服務(wù)器會針對這些 header 做檢查

User-Agent : 有些服務(wù)器或 Proxy 會通過該值來判斷是否是瀏覽器發(fā)出的請求

Content-Type : 在使用 REST 接口時啦逆,服務(wù)器會檢查該值,用來確定 HTTP Body 中的內(nèi)容該怎樣解析笛洛。常見的取值有:

application/xml : 在 XML RPC夏志,如 RESTful/SOAP 調(diào)用時使用

application/json : 在 JSON RPC 調(diào)用時使用

application/x-www-form-urlencoded : 瀏覽器提交 Web 表單時使用

在使用服務(wù)器提供的 RESTful 或 SOAP 服務(wù)時, Content-Type 設(shè)置錯誤會導致服務(wù)器拒絕服務(wù)

5.小結(jié)

?  好了苛让,哈哈沟蔑,到這里把python發(fā)郵件的十八輩祖宗都被我們挖出來了,自己都感覺到有點缺德狱杰,但是我們學習就是需要這種精神瘦材,但是也不要過于鉆牛角筋,要適可而止仿畸。想必小伙伴們對python發(fā)郵件有了更深刻的認識了食棕,以后遇到類似的問題,

往上套就可以了错沽,但是要注意方式和方法簿晓,不要生搬硬套,生搬硬套又會出現(xiàn)問題千埃,要靈活有技巧的套憔儿。

????為了方便大家在移動端也能看到我分享的博文,現(xiàn)已注冊個人微信公眾號放可,掃描左下方二維碼即可谒臼,歡迎大家關(guān)注,有時間會及時分享相關(guān)技術(shù)博文耀里。

為了方便大家互動討論相關(guān)技術(shù)問題蜈缤,現(xiàn)已組建專門的微信群,由于微信群滿100备韧,請您掃描右下方宏哥個人微信二維碼拉你進群(請務(wù)必備注:已關(guān)注公眾號進群)平時上班忙(和你一樣)劫樟,所以加好友不及時痪枫,請稍安勿躁~织堂,歡迎大家加入這個大家庭叠艳,我們一起暢游知識的海洋。

感謝您花時間閱讀此篇文章,如果您覺得這篇文章你學到了東西也是為了犒勞下博主的碼字不易不妨打賞一下吧易阳,讓博主能喝上一杯咖啡附较,在此謝過了!

如果您覺得閱讀本文對您有幫助潦俺,請點一下左下角“推薦”按鈕拒课,您的“推薦”將是我最大的寫作動力!另外您也可以選擇關(guān)注我事示,可以很方便找到我早像!

本文版權(quán)歸作者和博客園共有,來源網(wǎng)址:https://www.cnblogs.com/du-hong?歡迎各位轉(zhuǎn)載肖爵,但是未經(jīng)作者本人同意卢鹦,轉(zhuǎn)載文章之后必須在文章頁面明顯位置給出作者和原文連接,否則保留追究法律責任的權(quán)利劝堪!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冀自,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子秒啦,更是在濱河造成了極大的恐慌熬粗,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件余境,死亡現(xiàn)場離奇詭異驻呐,居然都是意外死亡,警方通過查閱死者的電腦和手機葛超,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門暴氏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绣张,你說我怎么就攤上這事答渔。” “怎么了侥涵?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵沼撕,是天一觀的道長。 經(jīng)常有香客問我芜飘,道長务豺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任嗦明,我火速辦了婚禮笼沥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己奔浅,他們只是感情好馆纳,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汹桦,像睡著了一般鲁驶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舞骆,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天钥弯,我揣著相機與錄音,去河邊找鬼督禽。 笑死脆霎,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的狈惫。 我是一名探鬼主播绪穆,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼虱岂!你這毒婦竟也來了玖院?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤第岖,失蹤者是張志新(化名)和其女友劉穎难菌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔑滓,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡郊酒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了键袱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片燎窘。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蹄咖,靈堂內(nèi)的尸體忽然破棺而出褐健,到底是詐尸還是另有隱情,我是刑警寧澤澜汤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布蚜迅,位于F島的核電站,受9級特大地震影響俊抵,放射性物質(zhì)發(fā)生泄漏谁不。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一徽诲、第九天 我趴在偏房一處隱蔽的房頂上張望刹帕。 院中可真熱鬧吵血,春花似錦、人聲如沸偷溺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亡蓉。三九已至,卻和暖如春喷舀,著一層夾襖步出監(jiān)牢的瞬間砍濒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工硫麻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留爸邢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓拿愧,卻偏偏與公主長得像杠河,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子浇辜,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容