Python自动化运维监控——批量监听页面发邮件(自由配置ini文件+smtplib)

本文主要是介绍Python自动化运维监控——批量监听页面发邮件(自由配置ini文件+smtplib),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、程序样式

1.listen.ini配置文件
listen.ini
2.监控页面
listen
3.日志
log

二、核心点

  1. smtplib库:这里使用了smtp.qq.comsmtp.163.com两个发送邮件的地址,使用邮箱用户名与授权码来实现登录,端口都使用465,最后抛出异常,finally里面最好判断一下srv这个变量存不存在,有可能断网就会导致登录失败,从而srv变量没有,最后srv.quit()最后报错
try:# 不能直接使用smtplib.SMTP来实例化,第三方邮箱会认为它是不安全的而报错# 使用加密过的SMTP_SSL来实例化,它负责让服务器做出具体操作,它有两个参数# 第一个是服务器地址,但它是bytes格式,所以需要编码# 第二个参数是服务器的接受访问端口,SMTP_SSL协议默认端口是465   25srv = smtplib.SMTP_SSL(smtp_srv.encode(), 465)# 使用授权码登录邮箱srv.login(from_addr, from_pwd)# 使用sendmail方法来发送邮件,它有三个参数# 第一个是发送地址# 第二个是接受地址,是list格式,可以同时发送给多个邮箱# 第三个是发送内容,作为字符串发送for to_addr in to_addrs:srv.sendmail(from_addr, [to_addr], msg.as_string())# srv.sendmail(from_addr, [to_addr1], msg.as_string())logger.info(to_addr+'发送成功')except Exception as e:logger.error('发送失败  '+str(e))finally:#无论发送成功还是失败都要退出你的QQ邮箱 检测srv是否存在  不检测会程序报错if 'srv' in globals():srv.quit()

2.读取ini配置文件:实现已定义参数,配置发件人、邮件邮箱,选择邮箱地址smtp.qq.com/smtp.163.com、邮件标题、监控页面地址(批量)、邮件人邮箱(批量)等参数,这里获取linten.ini配置文件的绝对路径有个问题,需要使用 sys.agrv[0]获取真实路径,不然就可能获取的是打包的程序.exe的系统路径temp

    #获取当前目录路径proDir = os.path.dirname(os.path.realpath(sys.argv[0]))
import os
import configparser
import sys# 读取配置文件
def getConfig(filename, section, option):""":param filename 文件名称:param section: 服务:param option: 配置参数:return:返回配置信息"""# 获取当前目录路径proDir = os.path.dirname(os.path.realpath(sys.argv[0]))# print(proDir)# 拼接路径获取完整路径configPath = os.path.join(proDir, filename)# print(configPath)# 创建ConfigParser对象conf = configparser.ConfigParser()# 读取文件内容conf.read(configPath,'utf-8')config = conf.get(section, option)return config
 # 发件人from_name = getConfig('listen.ini','listen','from_name')# 发件邮箱from_addr = getConfig('listen.ini','listen','from_addr')# 发件邮箱授权码,注意不是QQ邮箱密码from_pwd = getConfig('listen.ini','listen','from_pwd')# 收件邮箱to_addrs = getConfig('listen.ini','listen','to_addrs')to_addrs = to_addrs.split(',')# 邮件标题my_title = getConfig('listen.ini','listen','my_title')

3.日志输入logger.error()、logger.info()、 logger.warning()、 logger.debug()

logger = logging.getLogger()logger.setLevel(logging.INFO) #设置将日志输出到文件中,并且定义文件内容now = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")fileinfo = logging.FileHandler(f"listen_{now}.log")fileinfo.setLevel(logging.INFO) #设置将日志输出到控制台controlshow = logging.StreamHandler()controlshow.setLevel(logging.INFO)#设置日志的格式formatter = logging.Formatter("%(asctime)s - %(levelname)s: %(message)s")fileinfo.setFormatter(formatter)controlshow.setFormatter(formatter)logger.addHandler(fileinfo)logger.addHandler(controlshow)

4.requests监控页面这里我判断了status_code,如果不是200就会发邮件,并且写了几个异常情况,也同样会记录日志与发邮件,并且当邮件数量达到5封,就会延时30分钟后,在检测,如果依旧有问题,就再发五封。

    urls = getConfig('listen.ini','listen','urls')urls = urls.split(',')while True: for url in urls:try:response = requests.get(url,timeout=5)code = response.status_codebody = str(url) + ' 运行异常,状态码:' + str(code) + '  请检查服务运行情况'# 定义邮件数量5i = 0if code != 200:i += 1logger.error(body)send_mail(body)if i >= 5:# 延时30分钟time.sleep(1800) i = 0except exceptions.HTTPError as e:logger.error("发生HTTP错误,原因是:"+ str(e))send_mail("发生HTTP错误,原因是:"+ str(e))time.sleep(5)except exceptions.Timeout as e:logger.error("访问超时,原因是:"+ str(e))send_mail("访问超时,原因是:"+ str(e))time.sleep(5)except Exception as e:logger.error("未知错误,原因是:" + str(e))send_mail("未知错误,原因是:" + str(e))time.sleep(5)

三、完整代码

listen.py

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
import requests
import logging
import datetime
import time 
from requests import exceptions
from getConfig import getConfigdef send_mail(body):# 发件人from_name = getConfig('listen.ini','listen','from_name')# 发件邮箱from_addr = getConfig('listen.ini','listen','from_addr')# 发件邮箱授权码,注意不是QQ邮箱密码from_pwd = getConfig('listen.ini','listen','from_pwd')# 收件邮箱to_addrs = getConfig('listen.ini','listen','to_addrs')to_addrs = to_addrs.split(',')# 邮件标题my_title = getConfig('listen.ini','listen','my_title')# 邮件正文msg = MIMEText(body, 'plain', 'utf-8')msg['From'] = formataddr([from_name, from_addr])# 邮件的标题msg['Subject'] = my_title# SMTP服务器地址,QQ邮箱的SMTP地址是"smtp.qq.com"# smtp_srv = "smtp.qq.com"smtp_srv = getConfig('listen.ini','listen','smtp_srv')try:# 不能直接使用smtplib.SMTP来实例化,第三方邮箱会认为它是不安全的而报错# 使用加密过的SMTP_SSL来实例化,它负责让服务器做出具体操作,它有两个参数# 第一个是服务器地址,但它是bytes格式,所以需要编码# 第二个参数是服务器的接受访问端口,SMTP_SSL协议默认端口是465   25srv = smtplib.SMTP_SSL(smtp_srv.encode(), 465)# 使用授权码登录QQ邮箱srv.login(from_addr, from_pwd)# 使用sendmail方法来发送邮件,它有三个参数# 第一个是发送地址# 第二个是接受地址,是list格式,可以同时发送给多个邮箱# 第三个是发送内容,作为字符串发送for to_addr in to_addrs:srv.sendmail(from_addr, [to_addr], msg.as_string())# srv.sendmail(from_addr, [to_addr1], msg.as_string())logger.info(to_addr+'发送成功')except Exception as e:logger.error('发送失败  '+str(e))finally:#无论发送成功还是失败都要退出你的QQ邮箱 检测srv是否存在  不检测会程序报错if 'srv' in globals():srv.quit()if __name__ == '__main__':logger = logging.getLogger()logger.setLevel(logging.INFO) #设置将日志输出到文件中,并且定义文件内容now = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")fileinfo = logging.FileHandler(f"listen_{now}.log")fileinfo.setLevel(logging.INFO) #设置将日志输出到控制台controlshow = logging.StreamHandler()controlshow.setLevel(logging.INFO)#设置日志的格式formatter = logging.Formatter("%(asctime)s - %(levelname)s: %(message)s")fileinfo.setFormatter(formatter)controlshow.setFormatter(formatter)logger.addHandler(fileinfo)logger.addHandler(controlshow)# os.system('pause')print(  " ...............正在监听V8移动端wechat...............")print(	" .....................阿弥陀佛.......................")print(	"                       _oo0oo_                      ")print(	"                      o8888888o                     ")print(	'                      88" . "88                     ')print(	"                      (| -_- |)                     ")print(	"                      0\\  =  /0                    ")print(	"                   ___/‘---’\\___                   ")print(	"                  .' \\|       |/ '.                ")print(	"                 / \\\\|||  :  |||// \\             ")  print(	"                / _||||| -卍-|||||_ \\              ")print(	"               |   | \\\\\\  -  /// |   |           ")  print(	"               | \\_|  ''\\---/''  |_/ |            ") print(	"               \\  .-\\__  '-'  ___/-. /            ") print(	"             ___'. .'  /--.--\\  '. .'___           ")print(	"         ."" ‘<  ‘.___\\_<|>_/___.’>’ "".           ")print(	"       | | :  ‘- \\‘.;‘\\ _ /’;.’/ - ’ : | |        ")print(	"         \\  \\ ‘_.   \\_ __\\ /__ _/   .-’ /  /    ")   print(	"    =====‘-.____‘.___ \\_____/___.-’___.-’=====     ")print(	"                       ‘=---=’                      ")print(	"                                                    ")print(	"..................佛祖保佑, 一直监听..................")urls = getConfig('listen.ini','listen','urls')urls = urls.split(',')while True: for url in urls:try:response = requests.get(url,timeout=5)code = response.status_codebody = str(url) + ' 运行异常,状态码:' + str(code) + '  请检查服务运行情况'# 定义邮件数量5i = 0if code != 200:i += 1logger.error(body)send_mail(body)if i >= 5:# 延时30分钟time.sleep(1800) i = 0except exceptions.HTTPError as e:logger.error("发生HTTP错误,原因是:"+ str(e))send_mail("发生HTTP错误,原因是:"+ str(e))time.sleep(5)except exceptions.Timeout as e:logger.error("访问超时,原因是:"+ str(e))send_mail("访问超时,原因是:"+ str(e))time.sleep(5)except Exception as e:logger.error("未知错误,原因是:" + str(e))send_mail("未知错误,原因是:" + str(e))time.sleep(5)

getConfig.py

import os
import configparser
import sys# 读取配置文件
def getConfig(filename, section, option):""":param filename 文件名称:param section: 服务:param option: 配置参数:return:返回配置信息"""# 获取当前目录路径proDir = os.path.dirname(os.path.realpath(sys.argv[0]))# print(proDir)# 拼接路径获取完整路径configPath = os.path.join(proDir, filename)# print(configPath)# 创建ConfigParser对象conf = configparser.ConfigParser()# 读取文件内容conf.read(configPath,'utf-8')config = conf.get(section, option)return config

listen.ini

[listen]
#发件人
from_name = XXX
#登录邮箱地址 smtp.qq.com   smtp.163.com
smtp_srv = smtp.163.com
#发件邮箱
from_addr = xxxxxxxxxx@163.com
#发件邮箱授权码,请在qq 163邮箱账户选项里面查询
from_pwd = xxxxxxxxxxxx
#收件邮箱
to_addrs = xxxxx@dingtalk.com
#邮件标题
my_title = XXXXXXX异常告警#监控地址
urls = http://ecard.swpu.edu.com,127.0.0.1:80,xxxxxxxxx

这篇关于Python自动化运维监控——批量监听页面发邮件(自由配置ini文件+smtplib)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/317785

相关文章

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

python常用的正则表达式及作用

《python常用的正则表达式及作用》正则表达式是处理字符串的强大工具,Python通过re模块提供正则表达式支持,本文给大家介绍python常用的正则表达式及作用详解,感兴趣的朋友跟随小编一起看看吧... 目录python常用正则表达式及作用基本匹配模式常用正则表达式示例常用量词边界匹配分组和捕获常用re

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as