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 ="""58596061Hi!
62How are you?
63Hereisthe link 北京-宏哥 you wanted.
64
說明:
對有些 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)利劝堪!