华为云发送钉钉告警信息

总所周知,如果是阿里云发送钉钉告警。那是轻松简单。那如果是华为云呢?就比较烦了,没有成的东西。于是我写了一个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、别忘了, 设置一个邮件规则。防止循环发信

华为云发送钉钉告警信息