標籤:python 發郵件 指令碼
最近在搞把nagios警示郵箱換到163、sina這種免費郵箱上邊,之前用過msmtp搞過也可以發送郵件,現在估計是他們系統都升級了,只能使用TSL加密串連,而msmtp怎麼配置都配不通,無奈只能轉移戰術,正好最近在學習Python,也不知道從哪瞄到過有個email的模組,所以準備試試自己搞個指令碼。
(新手,無編程基礎,希望多多指教)
#!/usr/bin/env python# -*- coding: utf-8 -*-# --2015.08.11--# 指令碼用來替換nagios監控使用# sendemail.py # 方法:# printf "郵件內容" | sendemail.py -s "郵件主題" -R 收件者1,收件者2import smtplibimport sys,getoptfrom email.mime.text import MIMETexttry: opts, args = getopt.getopt(sys.argv[1:], ‘s:R:‘) subject = ‘‘ receivers = [] for i in opts: if ‘-s‘ in i: subject = i[1] elif ‘-R‘ in i: receivers.append(i[1]) else: print "Please input parameters"except getopt.GetoptError, e: print ehost = ‘smtp.qq.com‘port = 465sender = ‘[email protected]‘copyto = [‘[email protected]‘]pass = ‘xxx‘#既然readlines讀取為表格,那隻好吧表格拆成純字串了body = ‘‘.join(sys.stdin.readlines())#以下程式碼片段使用的MIMEText函數會產生郵件標頭格式,方便後邊發送郵件時提供一些選項配置(object.sendmail方法)msg = MIMEText(body)msg[‘subject‘] = subjectmsg[‘from‘] = sender#在郵件標頭中,收件者或者抄送的,格式應該是“[email protected],[email protected]”,而不是“[‘[email protected]‘, ‘[email protected]‘]”msg[‘to‘] = ‘,‘.join(receivers)msg[‘cc‘] = ‘,‘.join(copyto)#這裡是接受者列表,而不是收件者清單,所以包括抄送,暗送的收件者。#而具體是抄送還是密送交給MIMEText函數產生格式(cc/bcc),並被object.sendmail方法作為參數使用receivers = receivers + copytos = smtplib.SMTP_SSL(host, port)s.login(sender, pass)s.sendmail(sender, receivers, msg.as_string())
指令碼略亂,我是大致分為三部分
第一部分,用於設定寄件者收件者主題等變數
第二部分,使用MIMEText函數把郵件內容主題等格式化為郵件標頭格式
第三部分,登入郵箱,發送郵件代碼
如果不嫌棄,想拿去用的話,可以改下寄件者(sender變數)、發件smtp(Host變數)、寄件者密碼(pass變數)、抄送人(copyto變數,我們公司就固定幾個人所以我直接把郵箱寫指令碼,你也可以寫成參數指定)
列出幾個遇到問題
1、不明白MIMEText到底是個什麼東西,它產生是什麼樣一個郵件標頭?
然後我把命令挨個敲了一遍
>>> from email.mime.text import MIMEText>>> body = ‘123456‘>>> subject = ‘test mail‘>>> sender = ‘[email protected]‘ >>> receivers = ‘[email protected]‘>>> copyto = ‘[email protected]‘>>> msg = MIMEText(body)>>> msg[‘subject‘] = subject>>> msg[‘from‘] = sender>>> msg[‘to‘] = receivers>>> msg[‘cc‘] = copyto>>> print msgFrom nobody Tue Aug 11 10:54:59 2015Content-Type: text/plain; charset="us-ascii"MIME-Version: 1.0Content-Transfer-Encoding: 7bitsubject: test mailfrom: [email protected]to: [email protected]cc: [email protected]123456
就是這樣,就是一個純文字格式,對了,MIMEText函數還可以指定第二個參數為格式,例如html格式,具體可以參考這裡:
https://docs.python.org/2/library/email.mime.html#email.mime.text.MIMEText
2、收件者可以收到、抄送人和暗送人怎麼都收不到?
這個確實糾結了不少時間,而且關鍵是收件者收到的郵件下邊是有抄送人的!
這讓我一度懷疑smtplib模組並不支援抄送的!
後來我查到有一個模糊回答說,你要把cc和bcc加入list!我就覺得肯定可以解決,然後我繼續查了下去,果然你只需要以下這行代碼就可以!
receivers = receivers + copyto
.sendmail方法的第二個參數也就是收件者參數指定的是所有可以收到這封郵件的人,所以我們要把收件者、抄送人、暗送合并到一起
而具體誰是收件者和抄送人已經在MIMEText函數格式化過了,並且會賦給.sendmail的第三個參數
可以參考這裡:
https://docs.python.org/2/library/smtplib.html#smtplib.SMTP.sendmail
3、python標準輸入readline與readlines區別
#!/usr/bin/env python# -*- coding: utf-8 -*-# name: 1.pyimport syswhile True: line = sys.stdin.readline() if not line: break sys.stdout.write(line) ------------------------------------------------------------------------------------[[email protected] tmp]# printf "1\n2\n3" | ./1.py 123
#!/usr/bin/env python# -*- coding: utf-8 -*-# name: 2.pyimport sysfor i in sys.stdin.readlines(): sys.stdout.write(i)-------------------------------------------------------------------------------------[[email protected] tmp]# printf "1\n2\n3\n" | ./2.py 123
.readline()方法和.readlines()方法區別(兩個方法均不屬於sys.stdin下的方法)
所以,python標準輸入輸出問題不討論。
⑴、readline是以行讀取,直到遇到分行符號結束。
#!/usr/bin/env python# -*- coding: utf-8 -*-# name: 1.pyimport sysprint sys.stdin.readline()------------------------------------------------------------------------------------[[email protected] tmp]# printf "1" | ./1.py 1[[email protected] tmp]# printf "1\n" | ./1.py 1[[email protected] tmp]# printf "1\n2" | ./1.py 1[[email protected] tmp]# printf "1\n\n" | ./1.py 1
⑵、readlines則是讀取所有內容,把他們儲存為列表
#!/usr/bin/env python# -*- coding: utf-8 -*-# name: 2.pyimport sysprint sys.stdin.readlines()------------------------------------------------------------------------------------[[email protected] tmp]# printf "1\n2" | ./2.py [‘1\n‘, ‘2‘][[email protected] tmp]# printf "1\n2\n" | ./2.py [‘1\n‘, ‘2\n‘]
4、getopt函數返回了兩個表,這兩個表分別儲存是什麼
# -*- coding: utf-8 -*-# name: test.pyimport sys,getoptopts, args = getopt.getopt(sys.argv[1:], ‘s:R:‘, [‘help‘, ‘text=‘])print optsprint args------------------------------------------------------------------------------------[[email protected] tmp]# ./test.py -s sss -R rrr --help --text abc[(‘-s‘, ‘sss‘), (‘-R‘, ‘rrr‘), (‘--help‘, ‘‘), (‘--text‘, ‘abc‘)][][[email protected] tmp]# ./test.py -s sss -R rrr --help --text abc other -h[(‘-s‘, ‘sss‘), (‘-R‘, ‘rrr‘), (‘--help‘, ‘‘), (‘--text‘, ‘abc‘)][‘other‘, ‘-h‘] #這樣看來第二個表格用來寸未定義的參數
參數怎麼寫參考這裡:
https://docs.python.org/2/library/getopt.html#getopt.getopt
python指令碼發送警示郵件