python自動化運維3--發送電子郵件

在系統管理領域,我們常常使用郵件來發送告警信息、業務質量報表等,方便運維人員第一時間瞭解業務的服務狀態。
這裏需要用到一個模塊是smtplib,它是python自帶的一個模塊,可以通過它來實現郵件的發送功能,模擬一個smtp客戶端,通過與smtp服務器交互來實現郵件發送的功能,這可以理解成Foxmail的發郵件功能,在第一次使用之前我們需要配置smtp主機地址、郵箱賬號及密碼等信息。

SMTP類定義及方法

smtplib.SMTP([host[,port[,local_hostname[,timeout]]]]),作爲SMTP的構造函數,功能是與smtp服務器建立連接,在連接成功後,就可以向服務器發送相關請求,比如登錄、校驗、發送、退出等。host參數爲遠程smtp主機地址,比如smtp.163.com;port爲連接端口,默認爲25。SMTP類具有如下方法:
1. SMTP.connect([host[,port]])方法,連接遠程smtp主機方法,host爲遠程主機地址,port爲遠程主機smtp端口,默認25,也可以直接使用host:port形式來表示,如:

SMTP.connect(“smtp.163.com”,“25”)

2. SMTP.login(user,password)方法,遠程smtp主機的校驗方法,
參數爲用戶名與密碼。
3. SMTP.sendmail(from_addr,to_addrs,msg[,mail_optionsrcpt_options])方法,實現郵件的發送功能,參數依次爲是發件人、收件人、郵件內容。to_addrs可以是一個列表。
4. SMTP.starttls([keyfile[,certfile]])方法,啓用TLS(安全傳輸)模式,所有SMTP指令都將加密傳輸,例如使用gmail的smtp服務時需要啓動此項才能正常發送郵件,如SMTP.starttls()。
5. SMTP.quit()方法,斷開smtp服務器的連接。

發送第一個郵件

import smtplib

HOST = "smtp.163.com" #定義smtp主機
TITLE = "Test email from Python" #定義郵件主題
TO = "[email protected]" #定義郵件收件人,
FROM = "[email protected]" #定義郵件發件人,mymail自行替換
text = "here i am,lin!" #郵件內容

#組裝sendmail方法的郵件主體內容,各段以"\r\n"進行分隔
BODY = "\r\n".join([ 
"From:%s" % FROM,
"To:%s" % TO,
"Subject:%s" % TITLE ,
"",
text
])
try:
	server = smtplib.SMTP() #創建一個SMTP()對象
	server.connect(HOST,"25") #通過connect方法連接smtp主機
	server.starttls() #啓動安全傳輸模式
	server.login("[email protected]","mypass") #郵箱賬號登錄校驗,注意這裏的密碼並不一定爲郵箱登錄密碼,像163郵箱需要在設置裏開啓SMTP,並使用裏面的授權碼進行登錄
	server.sendmail(FROM, [TO], BODY) #郵件發送
	server.quit() #斷開smtp連接
except Exception as e:
    print(e)

如果都設置好後,運行上面代碼就可以往自己的qq發送郵件了,注意標題、內容都不能爲中文,否則會報錯。

定製個性化的郵件

通過郵件傳輸簡單的文本已經無法滿足我們的需求,比如我們時常會定製業務質量報表,在郵件主體中會包含HTML、圖像、聲音以及附件格式等,MIME(Multipurpose Internet Mail Extensions,多用途互聯網郵件擴展)作爲一種新的擴展郵件格式很好地補充了這一點,下面介紹幾個Python中常用的MIME實現類,這裏需要用到一個新的模塊email

1. email.mime.multipart.MIMEMultipart([_subtype[,boundary[,_subparts[,_params]]]]),作用是生成包含多個部分的郵件體的MIME對象,參數_subtype指定要添加到"Content-type:multipart/subtype"報頭的可選的三種子類型,分別爲mixed、related、alternative,默認值爲mixed。定義mixed實現構建一個帶附件的郵件體;定義related實現構建內嵌資源的郵件體;定義alternative則實現構建純文本與超文本共存的郵件體。
2. email.mime.audio.MIMEAudio(_audiodata[,_subtype[,_encoder[, _params]]]),創建包含音頻數據的郵件體,_audiodata包含原始二進制音頻數據的字節字符串。
3. email.mime.image.MIMEImage(_imagedata[,_subtype[,_encoder[,_params]]]),創建包含圖片數據的郵件體,_imagedata是包含原始圖片數據的字節字符串。
4. email.mime.text.MIMEText(_text[,_subtype[,_charset]]),創建包含文本數據的郵件體,_text是包含消息負載的字符串,_subtype指定文本類型,支持plain(默認值)或html類型的字符串。

開始定製第一個郵件(實現HTML格式的數據報表郵件)

這需要我們剛纔前面講到的的smtplib及email模塊結合使用,我們可以將email.mime理解成smtplib模塊郵件內容主體的擴展,從原先默認只支持純文本格式擴展到HTML,同時支持附件、音頻、圖像等格式,smtplib只負責郵件的投遞即可。

import smtplib
from email.mime.text import MIMEText

HOST = "smtp.163.com" #定義smtp主機
TITLE = u"官網流量數據報表" #定義郵件主題
TO = "[email protected]" #定義郵件收件人,
FROM = "[email protected]" #定義郵件發件人,[email protected]


#創建一個MIMEText對象,分別指定HTML內容、類型(文本或html)、字符編碼
msg=MIMEText("""
<table width="800" border="0" cellspacing="0" cellpadding="4">
<tr>
<td bgcolor="#CECFAD" height="20"duokan-code-cn">:14px">*官網數據
<a href="monitor.domain.com">更多>></a></td>
</tr>
<tr>
<td bgcolor="#EFEBDE" height="100"duokan-code-cn">:13px">
1)日訪問量:<font color=red>152433</font> 訪問次數:23651 頁面瀏覽量:
45123 點擊數:545122 數據流量:504Mb<br>
2)狀態碼信息<br>
&nbsp;&nbsp;500:105 404:3264 503:214<br>
3)訪客瀏覽器信息<br>
&nbsp;&nbsp;IE:50% firefox:10% chrome:30% other:10%<br>
4)頁面信息<br>
&nbsp;&nbsp;/index.php 42153<br>
</td>
</tr>
</table>""","html","utf-8")

msg['Subject'] = TITLE #郵件主題
msg['From']=FROM #郵件發件人,郵件頭部可見
msg['To']=TO #郵件收件人,郵件頭部可見

try:
    server = smtplib.SMTP() #創建一個SMTP()對象
    server.connect(HOST,"25") #通過connect方法連接smtp主機
    server.starttls() #啓動安全傳輸模式
    server.login("[email protected]","mypass") #郵箱賬號登錄校驗
    server.sendmail(FROM, [TO], msg.as_string()) #郵件發送
    server.quit() #斷開smtp連接
except Exception as e:
    print(e)

實現圖文格式的服務器性能報表郵件

上面我們通過MIMEText類來實現HTML格式的郵件,當要求包含圖片數據的郵件內容時,需要引用MIMEImage類,若郵件主體由多個MIME對象組成,則同時需引用MIMEMultipart類來進行組裝。下面我們看下通過MIMEText與MIMEImage類的組合來實現圖文格式的服務器性能報表郵件的定製。

import smtplib
from email.mime.multipart import MIMEMultipart #導入MIMEMultipart類
from email.mime.text import MIMEText #導入MIMEText類
from email.mime.image import MIMEImage #導入MIMEImage類

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 #返回msgImage對象

HOST = "smtp.gmail.com" #定義smtp主機
SUBJECT = u"業務性能數據報表" #定義郵件主題
TO = "[email protected]" #定義郵件收件人
FROM = "[email protected]" #定義郵件發件人
msg = MIMEMultipart('related') #創建MIMEMultipart對象,採用related定義內嵌資源的郵件體

msgtext = MIMEText(""" #創建一個MIMEText對象,HTML元素包括表格<table>及圖片
<img>
<table width="600" border="0" cellspacing="0" cellpadding="4">
<tr bgcolor="#CECFAD" height="20"duokan-code-cn">:14px">
<td colspan=2>*官網性能數據 <a href="monitor.domain.com">更多>></a>
</td>
</tr>
<tr bgcolor="#EFEBDE" height="100"duokan-code-cn">:13px">
<td>
<img src="cid:io"></td><td>
<img src="cid:key_hit"></td>
</tr>
<tr bgcolor="#EFEBDE" height="100"duokan-code-cn">:13px">
<td>
<img src="cid:men"></td><td>
<img src="cid:swap"></td>
</tr>
</table>""","html","utf-8") #<img>標籤的src屬性是通過Content-ID來引用的

msg.attach(msgtext) #MIMEMultipart對象附加MIMEText的內容
msg.attach(addimg("img/bytes_io.png","io")) #使用MIMEMultipart對象附加MIMEImage的內容
msg.attach(addimg("img/myisam_key_hit.png","key_hit"))
msg.attach(addimg("img/os_mem.png","men"))
msg.attach(addimg("img/os_swap.png","swap"))
msg['Subject'] = SUBJECT #郵件主題
msg['From']=FROM #郵件發件人,郵件頭部可見
msg['To']=TO #郵件收件人,郵件頭部可見

try:
    server = smtplib.SMTP() #創建一個SMTP()對象
    server.connect(HOST,"25") #通過connect方法連接smtp主機
    server.starttls() #啓動安全傳輸模式
    server.login("[email protected]","mypassword") #郵箱賬號登錄校驗
    server.sendmail(FROM, TO, msg.as_string()) #郵件發送
    server.quit() #斷開smtp連接
    print ("郵件發送成功!")
except Exception as e:
    print ("失敗:"+str(e))

運行程序後,收到郵件的內容如下:
在這裏插入圖片描述
另外我們還可以另通過MIMEText類再定義Content-Disposition屬性來實現帶附件的郵件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章