华为云发送钉钉告警信息
总所周知,如果是阿里云发送钉钉告警。那是轻松简单。那如果是华为云呢?就比较烦了,没有成的东西。于是我写了一个python脚本去实现。
1、申请一个免费的阿里云企业邮箱,并绑定钉钉。
2、完成第一步以后,可以测试一下通过企业邮箱给钉钉群的群邮箱发送信息。这时候是可以在群里看到的,如图所示:
3、第三步接下来,就是在华为云上,订阅告警信息了:
4、订阅完,阿里云企业邮箱是可以收到告警。但是我们的目标是把告警邮件发到群里。所以接下来,写一个自动收发邮件的python3脚本:
1)、decode2.py解码模块使用别人的代码,拿过来改改就可以用了
1 import sys
2 import email
3 from email.parser import Parser
4 from email.header import decode_header
5 from email.utils import parseaddr#专门处理地址的模块
6 #email中专门处理邮件内容的模块
7
8
9
10 #dir = sys.argv[1]
11 #fp = open(dir, "r")
12 #msg1 = email.message_from_file(fp)
13
14 #msg = Parser().parsestr(msg_content)
15 #通过msg.get('From')等方法可以获取头部,但会出现编码不对
16 #通过decode,将Subject其变为中文
17 def decode_str(s):
18 value, charset = decode_header(s)[0]
19 if charset:
20 value = value.decode(charset)
21 return value
22
23 def get_header(msg):
24 for header in ['From', 'To', 'Subject']:
25 value = msg.get(header, '')
26 if value:
27 #文章的标题有专门的处理方法
28 if header == 'Subject':
29 value = decode_str(value)
30 # elif header in ['From','To']:
31 #地址也有专门的处理方法
32 # hdr, addr = parseaddr(value)
33 value = decode_str(addr)
34 # print(header + ':' + value)
35 return value
36 #tittle1 = get_header(msg1)
37
38 ####################################################################
39 #邮件正文部分
40
41 #取附件
42 #邮件的正文部分在生成器中,msg.walk()
43 #如果存在附件,则可以通过.get_filename()的方式获取文件名称
44 def get_file(msg):
45 for part in msg.walk():
46 filename=part.get_filename()
47 if filename!=None:#如果存在附件
48 filename = decode_str(filename)#获取的文件是乱码名称,通过之前定义的函数解码
49 data = part.get_payload(decode = True)#取出文件正文内容
50 #此处可以自己定义文件保存位置
51 path=filename
52 f = open(path, 'wb')
53 f.write(data)
54 f.close()
55 print(filename,'download')
56
57
58 #接下来取正文信息
59
60 #获取邮件的字符编码,首先在message中寻找编码,如果没有,就在header的Content-Type中寻找
61 def guess_charset(msg):
62 charset = msg.get_charset()
63 if charset is None:
64 content_type = msg.get('Content-Type', '').lower()
65 pos = content_type.find('charset=')
66 if pos >= 0:
67 charset = content_type[pos+8:].strip()
68 return charset
69
70 def get_content(msg):
71 for part in msg.walk():
72 content_type = part.get_content_type()
73 charset = guess_charset(part)
74 #如果有附件,则直接跳过
75 if part.get_filename()!=None:
76 continue
77 email_content_type = ''
78 content = ''
79 if content_type == 'text/plain':
80 email_content_type = 'text'
81 elif content_type == 'text/html':
82 print('html 格式 跳过')
83 continue #不要html格式的邮件
84 email_content_type = 'html'
85 if charset:
86 try:
87 content = part.get_payload(decode=True).decode(charset)
88 #这里遇到了几种由广告等不满足需求的邮件遇到的错误,直接跳过了
89 except AttributeError:
90 print('type error')
91 except LookupError:
92 print("unknown encoding: utf-8")
93 if email_content_type =='':
94 continue
95 #如果内容为空,也跳过
96 #print(email_content_type + ' : ' + content)
97 #邮件的正文内容就在content中
98 return content
99 #con1 = get_content(msg1)
100 #print(con1)
2)mail.py
import os
import time
import decode2
import shutil
sh1 = "getmail --rcfile=/root/.getmail/getmailrc.feiyou.onaliyun.com"
val = os.system(sh1)
time.sleep(1)
path = '/root/.getmail/maildir/new'
dirs = os.listdir(path)
for dir in dirs:
# print(dir)
dir1 = "/root/.getmail/maildir/new/" + dir
fp = open(dir1, "r")
msg1 = decode2.email.message_from_file(fp)
fp.close()
tittle2 = decode2.get_header(msg1)
#print(tittle2)
con2 = decode2.get_content(msg1)
#print(con2)
dir2 = "/root/.getmail/maildir/old/" + dir
shutil.move(dir1, dir2)
dir3 = "/root/.getmail/maildir/tmp/" + dir
fp2 = open(dir3, 'w+', encoding='utf8')
fp2.write(con2)
fp2.close()
sh2 = "mail -s " + '"' + tittle2 + '"' + " group-xxx.groups.dingtalk.com < " + dir3
#print(sh2)
val2 = os.system(sh2)
5、定时执行脚本,让企邮给群邮发邮件。
6、别忘了, 设置一个邮件规则。防止循环发信