python实现批量监听页面并发送邮件

 更新时间:2023年11月06日 09:34:27   作者:柒月VII  
这篇文章主要为大家详细介绍了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监听页面的资料请关注脚本之家其它相关文章!

相关文章

  • Python读写yaml文件

    Python读写yaml文件

    这篇文章主要介绍了Python读写yaml文件,yaml 是专门用来写配置文件的语言,非常简洁和强大,之前用ini也能写配置文件,有点类似于json格式,下面关于Python读写yaml文件的详细资料,需要的小伙伴可以参考一下
    2022-03-03
  • 详解python中list的使用

    详解python中list的使用

    这篇文章主要介绍了python中list的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • python 自定义装饰器实例详解

    python 自定义装饰器实例详解

    这篇文章主要介绍了python 自定义装饰器,结合实例形式分析了Python自定义装饰器的功能、原理、用法及相关操作注意事项,需要的朋友可以参考下
    2019-07-07
  • Pycharm 如何连接远程服务器并debug调试

    Pycharm 如何连接远程服务器并debug调试

    本文主要介绍了Pycharm 如何连接远程服务器并debug调试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • pytorch 批次遍历数据集打印数据的例子

    pytorch 批次遍历数据集打印数据的例子

    今天小编就为大家分享一篇pytorch 批次遍历数据集打印数据的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python时间戳转换为字符串与字符串转换为时间戳

    Python时间戳转换为字符串与字符串转换为时间戳

    在编写代码时,往往涉及时间、日期、时间戳的相互转换,下面这篇文章主要给大家介绍了关于Python时间戳转换为字符串与字符串转换为时间戳的相关资料,文中给出了详细的实例代码,需要的朋友可以参考下
    2023-02-02
  • Python将二维列表list的数据输出(TXT,Excel)

    Python将二维列表list的数据输出(TXT,Excel)

    这篇文章主要介绍了Python将二维列表list的数据输出(TXT,Excel),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Python机器学习入门(四)之Python选择模型

    Python机器学习入门(四)之Python选择模型

    这篇文章主要介绍了Python机器学习入门知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • 一文搞懂Python Sklearn库使用

    一文搞懂Python Sklearn库使用

    Python sklearn库是一个丰富的机器学习,本文通过实例代码给大家介绍了Python Sklearn库使用方法,需要的朋友可以参考下
    2021-08-08
  • Numpy 数组操作之元素添加、删除和修改的实现

    Numpy 数组操作之元素添加、删除和修改的实现

    本文主要介绍了Numpy 数组操作之元素添加、删除和修改的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论