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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/128975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot的请求与响应

一&#xff0c;简单参数 Get请求&#xff1a;只需要在postman中的Params参数与方法中的形参一致就可以Post请求与Get方法一致只需要在 如果参数名不一致--通过RequestParam中的value属性执行请求参数名 RequestParam(name "name",required false) //表示name参数不是…

如何设计一个mysql的统计分析表?

在设计这样的MySQL统计分析表时&#xff0c;首先要明确所要收集的数据。我们至少需要以下几方面的数据&#xff1a; 病例ID&#xff0c;用于唯一标识每个病例。地区&#xff0c;即病例发生的地理位置。人群类别&#xff0c;比如儿童、青少年、成年人、老年人等。食源性级别&am…

react 性能优化之useCallback和useMemo的区别

useCallback缓存函数优化子组件减少渲染useMemo缓存返回值优化当前组件减少渲染

【CesiumJS】(1)Hello world

介绍 Cesium 起源于2011年&#xff0c;初衷是航空软件公司(Analytical Graphics, Inc.)的一个团队要制作世界上最准确、性能最高且具有时间动态性的虚拟地球。取名"Cesium"是因为元素铯Cesium让原子钟非常准确&#xff08;1967年&#xff0c;人们依据铯原子的振动而对…

【面经】什么是行锁/表锁,什么时候锁行/锁表

什么是行锁/表锁 行锁是指在事务执行期间&#xff0c;仅对数据表中的某一行(或某几行)加锁&#xff0c;其他行不受影响。 行锁适用于需要对表中部分数据进行修改或查询的情况。 它可以防止多个事务同时修改同一行数据&#xff0c;从而保证数据的一致性和完整性。 在大多数情况…

【实战Flask API项目指南】之三 路由和视图函数

实战Flask API项目指南之 路由和视图函数 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 当小菜踏入Flask后端开发的世界时&…

柯桥俄语考级培训,俄语专八如何备考

1.用好真题 真题一共分为&#xff1a;口语表述、听力、词汇语法句法、文学常识、国情、阅读理解、俄汉互译、作文等部分。 第一&#xff0c;要自己动手做真题&#xff0c;然后对答案&#xff0c;看错题错在什么地方&#xff0c;还有哪些知识点是盲区。 第二&#xff0c;分析每…

Android GB28181历史视音频回放

作为GB28181安卓客户端&#xff0c;实时视音频点播是必须支持的功能&#xff0c;对于历史视音频回放功能&#xff0c;不支持的话可以从设备上拷贝录像文件再播放&#xff0c;但有些场景没法拷贝&#xff0c;安卓支持回放还是需要的。 历史视音频的回放和实时视音频点播信令上很…

HTTP/HTTPS、SSL/TLS、WS/WSS 都是什么?

有同学问我&#xff0c;HTTP/HTTPS、SSL/TLS、WS/WSS 这都是些什么&#xff1f;那我们就先从概念说起&#xff1a; HTTP 是超文本传输协议&#xff0c;信息是通过明文传输。HTTPS 是在 HTTP 的基础上信息通过加密后再传输。SSL 是实现 HTTPS 信息传输加密的算法。TLS 是 SSL 的…

基于C语言实现扫雷小游戏

扫雷游戏 1. 扫雷游戏分析和设计1.1 扫雷游戏的功能说明1.2 游戏的分析和设计1.2.1 数据结构的分析 2. 扫雷游戏的代码实现3. 扫雷游戏的扩展 1. 扫雷游戏分析和设计 1.1 扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏 游戏可以通过菜单实现继续玩或者退出游戏 扫雷的棋…

Linux yum 没有可用软件包 fping。 错误:无须任何处理 的解决办法

yum install fping -y 报错解决&#xff1a; [rootcpcs-node-d4n591 ~]# yum install fping -y 已加载插件&#xff1a;fastestmirror Determining fastest mirrors* base: mirrors.aliyun.com* extras: mirrors.aliyun.com* updates: mirrors.aliyun.com base …

React使用富文本CKEditor 5,上传图片并可设置大小

上传图片 基础使用&#xff08;标题、粗体、斜体、超链接、缩进段落、有序无序、上传图片&#xff09; 官网查看&#xff1a;https://ckeditor.com/docs/ckeditor5/latest/installation/integrations/react.html 安装依赖 npm install --save ckeditor/ckeditor5-react cked…

k8s系列文章一:安装指南

前言 k8s是docker的升级版&#xff0c;可用于docker集群配置管理微服务 一、更新ubuntu系统版本 sudo apt update sudo apt upgrade二、添加GPG密钥(阿里源) 尽管我不知道gpg是个什么东西&#xff0c;反正跟着做就完了 curl https://mirrors.aliyun.com/kubernetes/apt/do…

【Echarts】玫瑰饼图数据交互

在学习echarts玫瑰饼图的过程中&#xff0c;了解到三种数据交互的方法&#xff0c;如果对您也有帮助&#xff0c;不胜欣喜。 一、官网教程 https://echarts.apache.org/examples/zh/editor.html?cpie-roseType-simple &#xff08;该教程数据在代码中&#xff09; import *…

elasticsearch无法访问9200端口

近期部署elasticsearch后&#xff0c;启动时发现一直报如下错误: curl: (7) Failed connect to localhost:9200&#xff1b; Connection refused 部署的版本为elasticsearch-7.13.2,排查原因是因为开启了ssl认证。 解决方法: 在/opt/software/elasticsearch-7.13.2/config下…

echarts 画散点图, x周,y周在指定位置标志一下

文章目录 echarts 画散点图&#xff0c; x周&#xff0c;y周在指定位置标志一下示例一例子二示例三 echarts 画散点图&#xff0c; x周&#xff0c;y周在指定位置标志一下 示例一 let scatterData {data: [[[-0.2, -0.6],[0.4, 0.3],[0.1, 0.4],[0.3, 0.5],[0.09, 0.1],[0.7,…

【React】【react-globe.gl】3D Objects效果

目录 想要实现的效果实现过程踩坑安装依赖引入页面 想要实现的效果 示例地址 实现过程 踩坑 示例是通过script引入的依赖&#xff0c;但本人需要在react项目中实现该效果。按照react-globe.gl官方方法引入总是报错 Cant import the named export AmbientLight from non EcmaS…

kibana显示时间数据时的时区问题及时间显示格式设置

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

数据中心如何散热?

数据中心的散热是一个非常重要的问题&#xff0c;因为数据中心内运行的服务器、存储设备以及网络设备等都会产生大量的热量&#xff0c;如果不能有效地进行散热&#xff0c;将会导致设备故障和性能下降。下面是一些常见的数据中心散热方法&#xff1a; 空调系统&#xff1a;数据…

JS功能实现

目录 轮播图移动端轮播图按下回车发表评论tab栏切换全选按钮 轮播图 <style>* {box-sizing: border-box;}.slider {width: 560px;height: 400px;overflow: hidden;}.slider-wrapper {width: 100%;height: 320px;}.slider-wrapper img {width: 100%;height: 100%;display:…