总所周知,如果是阿里云发送钉钉告警。那是轻松简单。那如果是华为云呢?就比较烦了,没有现成的东西。于是我写了一个python脚本去实现。

1、申请一个免费的阿里云企业邮箱,并绑定钉钉。

2、完成第一步以后,可以测试一下通过企业邮箱给钉钉群的群邮箱发送信息。这时候是可以在群里看到的,如图所示:

java 钉钉告警电话号艾特成员 钉钉警告短信_java 钉钉告警电话号艾特成员

3、第三步接下来,就是在华为云上,订阅告警信息了:

java 钉钉告警电话号艾特成员 钉钉警告短信_html_02

 

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、定时执行脚本,让企邮给群邮发邮件。

java 钉钉告警电话号艾特成员 钉钉警告短信_java 钉钉告警电话号艾特成员_03

                                                                         

6、别忘了, 设置一个邮件规则。防止循环发信

java 钉钉告警电话号艾特成员 钉钉警告短信_html_04