SMTP類定義:smtplib.SMTP([host[,port[,local_hostname[, timeout]]]]),做爲SMTP的構造函數,功能是與smtp服務器創建鏈接, 在鏈接成功後,就能夠向服務器發送相關請求,好比登陸、校驗、發 送、退出等。host參數爲遠程smtp主機地址,好比smtp.163.com;port爲 鏈接端口,默認爲25;local_hostname的做用是在本地主機的FQDN(完 整的域名)發送HELO/EHLO(標識用戶身份)指令,timeout爲鏈接或 嘗試在多少秒超時。php
SMTP類具備以下方法:html
SMTP.connect([host[,port]])方法,鏈接遠程smtp主機方法, host爲遠程主機地址,port爲遠程主機smtp端口,默認25,也能夠直接 使用host:port形式來表示,python
例如: SMTP.connect(「smtp.163.com」 , 「25」)。 ·chrome
SMTP.login(user,password)方法,遠程smtp主機的校驗方法, 參數爲用戶名與密碼,瀏覽器
例如: SMTP.login(「python_2014@163.com」 , 「sdjkg358」)。安全
SMTP.sendmail(from_addr,to_addrs,msg[,mail_options, rcpt_options])方法,實現郵件的發送功能,參數依次爲是發件人、收 件人、郵件內容,服務器
例如: SMTP.sendmail(「python_2014@163.com」 , 「demo@domail.com」 , body),其中body內容定義以下:app
"""From: python_2014@163.com To: demo@domail.com Subject: test mail test mail bodydom
#!/usr/bin/python #_*_coding:utf-8_*_ #****************************************************************# # ScriptName: smtplib01.py # Author: BenjaminYang # Create Date: 2019-05-18 08:55 # Modify Author: BenjaminYang # Modify Date: 2019-05-18 08:55 # Function: #***************************************************************# import smtplib import string HOST="smtp.163.com" #定義smtp主機 SUBJECT="python send email" TO="1331xxxxxxx@163.com" #定義郵件的收件人 FROM="1331xxxxxxx@163.com" #定義郵件發件人 text="Python rules them all" #郵件內容 BODY=string.join(( #組裝sendmail方法的郵件主體內容,各段以"\r\n"進行分隔 "From: %s" % FROM, "To: %s" % TO, "Subject: %s" % SUBJECT, "", text ), "\r\n") server=smtplib.SMTP() #建立一個SMTP()對象 server.connect(HOST,"25") server.starttls() #啓動安全傳輸模式 server.login("1331xxxxxxx@163.com","yourpwd") #郵箱帳號登陸校驗 server.sendmail(FROM,TO,BODY) #郵件發送 server.quit() #斷開smtp鏈接
執行後將會收到以下的郵件函數
經過郵件傳輸簡單的文本已經沒法知足咱們的需求,好比咱們時
常會定製業務質量報表,在郵件主體中會包含HTML、圖像、聲音以及 附件格式等,MIME(Multipurpose Internet Mail Extensions,多用途互聯 網郵件擴展)做爲一種新的擴展郵件格式很好地補充了這一點,更多 MIME知識見http://zh.wikipedia.org/wiki/MIME。下面介紹幾個Python中 經常使用的MIME實現類:
·email.mime.multipart.MIMEMultipart([_subtype[,boundary[, _subparts[,_params]]]]),做用是生成包含多個部分的郵件體的MIME 對象,參數_subtype指定要添加到"Content-type:multipart/subtype"報頭 的可選的三種子類型,分別爲mixed、related、alternative,默認值爲 mixed。定義mixed實現構建一個帶附件的郵件體;定義related實現構建 內嵌資源的郵件體;定義alternative則實現構建純文本與超文本共存的郵 件體。
·email.mime.audio.MIMEAudio(_audiodata[,_subtype[, _encoder[,**_params]]]),建立包含音頻數據的郵件體,_audiodata包 含原始二進制音頻數據的字節字符串。
·email.mime.image.MIMEImage(_imagedata[,_subtype[, _encoder[,**_params]]]),建立包含圖片數據的郵件體,_imagedata是 包含原始圖片數據的字節字符串。
·email.mime.text.MIMEText(_text[,_subtype[,_charset]]),建立 包含文本數據的郵件體,_text是包含消息負載的字符串,_subtype指定 文本類型,支持plain(默認值)或html類型的字符串。
能夠將email.mime理 解成smtplib模塊郵件內容主體的擴展,從原先默認只支持純文本格式擴 展到HTML,同時支持附件、音頻、圖像等格式,smtplib只負責郵件的 投遞便可。下面介紹在平常運營工做中郵件應用的幾個示例。
郵件純文本的郵件內容已經不能知足咱們多樣化的需求,本示例經過 引入email.mime的MIMEText類來實現支持HTML格式的郵件,支持全部
HTML元素,包含表格、圖片、動畫、CSS樣式、表單等。本示例使用 HTML的表格定製美觀的業務流量報表,實現代碼以下:
【/home/test/smtplib/simple2.py】
#_*_coding:utf-8_*_ #****************************************************************# # ScriptName: smtplib02.py # Author: BenjaminYang # Create Date: 2019-06-01 20:04 # Modify Author: BenjaminYang # Modify Date: 2019-06-01 20:04 # Function: #***************************************************************# #!/usr/bin/python import smtplib from email.mime.text import MIMEText # 導入MIMEText類 HOST="smtp.163.com" #定義smtp主機 Subject=u"官網流量數據表" #定義郵件主題 To="1331xxxxxxx@163.com" #定義收件人 From="1331xxxxxxx@163.com" #定義發件人 #建立一個MIMEText對象,分別指定HTML內容、類型(文本或 html)、字符編碼 msg=MIMEText(""" <talbe width="800" border="0" cellspacing="0" cellpadding="4"> <tr> <td bgcolor="#CECFAD" height="14px">*官網數據 <a href="monitor.domain.com">更多>></a> </td> </tr><br> <tr> <td bgcolor="#EFEBDE" height="13px"> 1)日訪問量:<font color=red>152433</font> 訪問次數:23651 頁面瀏覽量: 45123 點擊數:545122 數據流量:504Mb<br> 2)狀態碼信息<br> 500:105 404:3264 503:214<br> 3)訪客瀏覽器信息<br> IE:50% firefox:10% chrome:30% other:10%<br> 4)頁面信息<br> /index.php 42153<br> /view.php 21451<br> /login.php 5112<br> </td> </tr> </table>""","html","utf-8") msg['Subject']=Subject #郵件主題 msg['From']=From #郵件發件人,郵件頭部可見 msg['To']=To #郵件收件人,郵件頭部可見 try: server=smtplib.SMTP() #建立一個SMTP()對象 server.connect(HOST,"25") #經過connect方法鏈接smtp主機 server.starttls() #啓動安全傳輸模式 server.login("1331xxxxxxx@163.com","yourpwd") #郵箱登陸帳號 server.sendmail(From,To,msg.as_string()) #郵件發送 server.quit() #斷開smtp鏈接 print "郵件發送成功!" except Exception, e: print "失敗:"+str(e)
示例1經過MIMEText類來實現HTML格式的郵件,當要求包含圖片 數據的郵件內容時,須要引用MIMEImage類,若郵件主體由多個MIME 對象組成,則同時需引用MIMEMultipart類來進行組裝。本示例經過 MIMEText與MIMEImage類的組合來實現圖文格式的服務器性能報表郵 件的定製,實現代碼以下:
【/home/test/smtplib/simple3.py】
#_*_coding:utf-8_*_ #****************************************************************# # ScriptName: smtplib03.py # Author: BenjaminYang # Create Date: 2019-06-01 22:53 # Modify Author: BenjaminYang # Modify Date: 2019-06-01 22:53 # Function: #***************************************************************# #!/usr/bin/python import smtplib from email.mime.multipart import MIMEMultipart #導入MIMEMultipart類 from email.mime.text import MIMEText #導入MIMEText類 from email.mime.image import MIMEImage #導入MIMEImage類 HOST="smtp.163.com" #定義smtp主機 SUBJECT=u"業務性能數據報表" #定義郵件主題 TO="1331xxxxxxx@163.com" #定義郵件收件人 FROM="1331xxxxxxx@163.com" #定義郵件發件人 def addimg(src,imgid): #添加圖片函數,參數1:圖片路徑,參數2:圖片id fp=open(src,"rb") #打開文件 msgImage=MIMEImage(fp.read()) #建立MIMEImage對象,讀取圖片內容並做爲 參數 fp.close() #關閉文件 msgImage.add_header("Content-ID",imgid) #指定圖片文件的Content-ID, <img> 標籤src用到 return msgImage msg=MIMEMultipart("related") #標籤src用到return msgImage 返回msgImage對象 msg = MIMEMultipart('related')建立MIMEMultipart對象,採用related定義內嵌 資源的郵件體 #建立一個MIMEText對象,HTML元素包括表格<table>及圖片 <img> msgtext = MIMEText(""" <table width="600" border="0" cellspacing="0" cellpadding="4"> <tr bgcolor="#CECFAD" height="14px"> <td colspan=2>*官網性能數據 <a href="monitor.domain.com">更多>></a> </td> </tr> <tr bgcolor="#EFEBDE" height="13px"> <td> <img src="cid:io"></td> <td> <img src="cid:key_hit"></td> </tr> <tr bgcolor="#EFEBDE" height="13px"> <td><img src="cid:mem"></td> <td><img src="cid:swap"></td> </tr> </table>""","html","utf-8") msg.attach(msgtext) msg.attach(addimg("img/bytes_io.png","io")) msg.attach(addimg("img/myisam_key_hit.png","key_hit")) msg.attach(addimg("img/os_swap.png","swap")) msg.attach(addimg("img/os_mem.png","mem")) msg['Subject']=SUBJECT msg['From']=FROM msg['To']=TO try: server=smtplib.SMTP() server.connect(HOST,"25") server.starttls() server.login("1331xxxxxxx@163.com","yourpwd") #郵箱帳號登陸效驗 server.sendmail(FROM,TO,msg.as_string()) server.quit() print '郵件發送成功!' except Exception,e: print "失敗:"+str(e)
本示例經過MIMEText與MIMEImage類的組合,實現圖文郵件格 式。另經過MIMEText類再定義Content-Disposition屬性來實現帶附件的 郵件。咱們能夠利用這些豐富的特性來定製週報郵件,如業務服務質量 週報。實現代碼以下:
【/home/test/smtplib/simple4.py】
#_*_coding:utf-8_*_ #****************************************************************# # ScriptName: smtplib03.py # Author: BenjaminYang # Create Date: 2019-06-01 22:53 # Modify Author: BenjaminYang # Modify Date: 2019-06-01 22:53 # Function: #***************************************************************# #!/usr/bin/python import smtplib from email.mime.base import MIMEBase from email.mime.multipart import MIMEMultipart #導入MIMEMultipart類 from email.mime.text import MIMEText #導入MIMEText類 from email.mime.image import MIMEImage #導入MIMEImage類 HOST="smtp.163.com" #定義smtp主機 SUBJECT=u"業務性能數據報表" #定義郵件主題 TO="342037867@qq.com" #定義郵件收件人 FROM="1331xxxxxxx@163.com" #定義郵件發件人 def addimg(src,imgid): #添加圖片函數,參數1:圖片路徑,參數2:圖片id fp=open(src,"rb") #打開文件 msgImage=MIMEImage(fp.read()) #建立MIMEImage對象,讀取圖片內容並做爲 參數 fp.close() #關閉文件 msgImage.add_header("Content-ID",imgid) #指定圖片文件的Content-ID, <img> 標籤src用到 return msgImage msg=MIMEMultipart() #標籤src用到return msgImage 返回msgImage對象 msg = MIMEMultipart('related')建立MIMEMultipart對象,採用related定義內嵌 資源的郵件體 #建立一個MIMEText對象,HTML元素包括表格<table>及圖片 <img> msgtext = MIMEText( "<font color=red>官網業務周平均延時圖表:<br><img src=\"cid:weekly\" border=\"1\"><br>詳細內容見附件。</font>" ,"html","utf-8") msg.attach(msgtext) #MIMEMultipart對象附加MIMEText的內容 msg.attach(addimg("img/weekly.jpg","weekly")) #建立一個MIMEText對象,附加week_report.xlsx文檔 attach = MIMEText(open("doc/week_report.xlsx","rb").read(),'base64','utf-8') attach["Content-Type"] = 'application/octet-stream'#指定文件格式類型 #指定Content-Disposition值爲attachment則出現下載保存對話框,保存的默認文件名使用filename指定 #因爲qqmail使用gb18030頁面編碼,爲保證中文文件名不出現亂碼,對文件名進行編碼轉換 attach["Content-Disposition"] = "attachment;filename=\"業務服務質量週報(12 周).xlsx\"".decode("utf-8").encode("gb18030") msg.attach(attach) #MIMEMultipart對象附加MIMEText的內容 msg['Subject']=SUBJECT msg['From']=FROM msg['To']=TO try: server=smtplib.SMTP() server.connect(HOST,"25") server.starttls() server.login("1331xxxxxxx@163.com","yourpwd") #郵箱帳號登陸效驗 server.sendmail(FROM,TO,msg.as_string()) server.quit() print '郵件發送成功!' except Exception,e: print "失敗:"+str(e)