python实现批量监听页面并发送邮件
一、程序样式
1.listen.ini配置文件
2.监控页面
3.日志
二、核心点
smtplib库:这里使用了smtp.qq.com与smtp.163.com两个发送邮件的地址,使用邮箱用户名与授权码来实现登录,端口都使用465,最后抛出异常,finally里面最好判断一下srv这个变量存不存在,有可能断网就会导致登录失败,从而srv变量没有,最后srv.quit()最后报错
try: # 不能直接使用smtplib.SMTP来实例化,第三方邮箱会认为它是不安全的而报错 # 使用加密过的SMTP_SSL来实例化,它负责让服务器做出具体操作,它有两个参数 # 第一个是服务器地址,但它是bytes格式,所以需要编码 # 第二个参数是服务器的接受访问端口,SMTP_SSL协议默认端口是465 25 srv = 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_code body = str(url) + ' 运行异常,状态码:' + str(code) + ' 请检查服务运行情况' # 定义邮件数量5 i = 0 if code != 200: i += 1 logger.error(body) send_mail(body) if i >= 5: # 延时30分钟 time.sleep(1800) i = 0 except 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 getConfig def 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 25 srv = 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_code body = str(url) + ' 运行异常,状态码:' + str(code) + ' 请检查服务运行情况' # 定义邮件数量5 i = 0 if code != 200: i += 1 logger.error(body) send_mail(body) if i >= 5: # 延时30分钟 time.sleep(1800) i = 0 except 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实现批量监听页面并发送邮件的详细内容,更多关于python监听页面的资料请关注脚本之家其它相关文章!
最新评论