公司大数据业务开始时间不长,大数据监控体系还没有,对于各种程序的定时监控也没有好的解决方案,比如在程序、数据异常时,第一时间发一封邮件通知相关人员也是好的。考虑到好多定时任务是用python来触发,管理的,我们选择了轻便,灵活,功能强大的python语言来实现发送邮件功能。
发送邮件方法这里给出Python2代码如下:
1#!/usr/bin/python
2# -*- coding:utf-8 -*-
3
4import datetime
5import commands
6
7# 执行shell命令
8def execCmd(cmd):
9 cmd = 'source /etc/profile;' + cmd
10 return commands.getstatusoutput(cmd)
11
12def sendEmail(info):
13 #发送邮件
14 import smtplib
15 #构造邮件
16 from email.mime.text import MIMEText
17
18 #发送服务器地址
19 # mail_host = 'smtp.qq.com'
20 # qq企业邮箱与qq邮箱服务器地址有所不同
21 mail_host = 'smtp.exmail.qq.com'
22
23 #用户名
24 mail_user = 'keguang@qq.com'
25 #密码/授权码
26 mail_pass = '123456'
27
28 #指定发件人
29 me = mail_user
30 #收件人
31 mail_receive = ['123456789@163.com', '123456789@139.com']
32
33 #主题
34 mail_subject = '实时程序状态...'
35 #内容
36 now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
37 mail_content = '%s<br/>时间 %s'%(info, now)
38
39 #构造文件内容
40 #plain表示纯文本,html表示网页版
41 msg = MIMEText(mail_content,'html','utf-8')
42 msg['Subject'] = mail_subject
43 msg['From'] = me
44 msg['To'] = ';'.join(mail_receive)
45
46 ##发送邮件
47 #连接服务器
48 client = smtplib.SMTP_SSL(mail_host,465)
49 #登陆服务器
50 client.login(mail_user,mail_pass)
51 #发送邮件
52 client.sendmail(me,mail_receive,msg.as_string())
53
54 #退出
55 client.quit()
56
57if __name__ == '__main__':
58 types = ['install', 'helper']
59 types2 = ['Install', 'Helper']
60 for i in range(len(types)):
61 type_ = types[i]
62 cmd = 'ps -ef | grep SparkSubmit | grep /home/hadoop/config/flash/%s/commons.xml'%(type_)
63 (status, res) = commands.getstatusoutput(cmd)
64 if len(res.split("\n")) == 1:
65 cmd = 'sh /home/hadoop/scripts/flash/submit%s.sh'%(types2[i])
66 (status, res) = commands.getstatusoutput(cmd)
67 info = ''
68 if status == 0:
69 info = '%s spark 实时程序停止,已经重新启动一次...'%(type_)
70 else:
71 info = '%s spark 实时程序停止,重新启动失败...'%(type_)
72 sendEmail(info)
73 else:
74 info = '%s spark 实时程序运行正常...'%(type_)
75 sendEmail(info)
如果觉得复杂,可以新建一个.py文件,比如名为emailTest.py,将这个方法放入,放入当前工作目录,用的时候就可以调用
1import emailTest
将这个模块导入,发送邮件时只需要:
1if __name__ == '__main__':
2
3 emailTest.sendEm('发送邮件测试即可')
具体需要根据自己的需要稍作修改。
点击【阅读原文】在我的个人博客中查看。