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参数不是…

【CesiumJS】(1)Hello world

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

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

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

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

1.用好真题 真题一共分为&#xff1a;口语表述、听力、词汇语法句法、文学常识、国情、阅读理解、俄汉互译、作文等部分。 第一&#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 扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏 游戏可以通过菜单实现继续玩或者退出游戏 扫雷的棋…

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 *…

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;数据…

重定向-缓冲区

1.重定向 文件描述符对应的分配规则是什么? 尝试用这个代码 关闭0,1&#xff0c;2文件描述符&#xff0c;看看有什么现象&#xff1f;关闭哪个&#xff0c;你打开的文件fd应该就是哪个 结论&#xff1a; 从0下标开始&#xff0c;寻找最小的没有没使用的数组位置&#xff0c;它…

构建mono-repo风格的脚手架库

前段时间阅读了 https://juejin.cn/post/7260144602471776311#heading-25 这篇文章&#xff1b;本文做一个梳理和笔记&#xff1b; 主要聚焦的知识点如下&#xff1a; 如何搭建脚手架工程如何开发调试如何处理命令行参数如何实现用户交互如何拷贝文件夹或文件如何动态生成文件…

Linux内核input子系统详解

目录 1 input子系统整体架构 2 input子系统驱动框架分析 2.1 怎么添加input_dev 2.2 input_dev和input_handler匹配后&#xff0c;connec函数做了什么 3 input子系统读数据流程 3.1 open输入设备流程 3.2 read读取输入事件流程 4 应用程序读取的输入数据是怎样的 4.1 …

chap认证带客户端IP分配案例

PPP协议两边的网段可以不在同一个网段&#xff0c;因为数据链路帧用0xff表示帧&#xff0c;不用arp&#xff0c;所以可以不同网段。 R1&#xff1a; aaa local-user test password cipher admin local-user test service-type ppp interface Serial4/0/0 link-protocol ppp pp…

Git 标签(Tag)实战:打标签和删除标签的步骤指南

目录 前言使用 Git 打本地和远程标签&#xff08;Tag&#xff09;删除本地和远程 Git 标签&#xff08;Tag&#xff09;开源项目标签&#xff08;Tag&#xff09;实战打标签删除标签 结语开源微服务商城项目前后端分离项目 前言 在开源项目中&#xff0c;版本控制是至关重要的…

在钣金加工领域,迅镭激光切割机广泛使用的原因和优点何在?

激光切割工艺和激光切割设备正在被广泛的板材加工企业逐渐理解并接受&#xff0c;凭借其高效率的加工、高精度的加工、优质的切割断面、三维切割能力等诸多优势&#xff0c;逐步取代了传统的钣金切割设备。 苏州迅镭激光科技有限公司推出的激光切割设备的柔性化程度高&#xff…

Centos下用nodejs实现一个简单的web服务器

WebRTC是音视频直播中最常用的一个框架&#xff0c;在使用的过程中&#xff0c;我们就需要实现一个服务器端。本文以nodejs实现一个服务器为例&#xff0c;讲述一下在centos下如何用nodejs实现一个简单的web服务器。 一、安装nodejs 在linux环境下安装nodejs有多重方式&#x…