当前位置: 首页 > article >正文

Python+QQ邮箱调用定时监控——以网站监测为例

Python+QQ邮箱调用定时监控——以网站监测为例

前台执行monitor_urls.py

import requests
import time
from datetime import datetime
import smtplib
import ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

# 定义要监测的URL列表
urls = [
    "https://developer.d-robotics.cc/",
    "https://en.developer.d-robotics.cc/"
]

# 设置检查间隔(以秒为单位)
CHECK_INTERVAL = 5 * 60  # 5分钟

# 定义请求超时时间(以秒为单位)
TIMEOUT = 10

# 邮件配置
SMTP_SERVER = "smtp.qq.com"
SMTP_PORT = 465  # 使用SSL
SENDER_EMAIL = "替换为你的QQ邮箱地址@qq.com"        # 替换为你的QQ邮箱地址
SENDER_PASSWORD = "替换为你生成的授权码"            # 替换为你生成的授权码
RECEIVER_EMAIL = "替换为接收通知的邮箱地址"  # 替换为接收通知的邮箱地址
EMAIL_SUBJECT = "D-robotic Website_Monitor_Alarm"

def check_url(url):
    try:
        response = requests.get(url, timeout=TIMEOUT)
        # 判断状态码是否为200
        if response.status_code == 200:
            return True, f"可访问 (Status Code: {response.status_code})"
        else:
            return False, f"不可访问 (Status Code: {response.status_code})"
    except requests.exceptions.RequestException as e:
        return False, f"不可访问 (错误: {e})"

def send_QQ_email_plain(message):
    sender = user = SENDER_EMAIL  # 发送方的邮箱账号
    passwd = SENDER_PASSWORD       # 授权码

    receiver = RECEIVER_EMAIL

    # 纯文本内容
    msg = MIMEText(f'{message}', 'plain', 'utf-8')

    # From 的内容是有要求的,前面的abc为自己定义的 nickname,如果是ASCII格式,则可以直接写
    msg['From'] = SENDER_EMAIL
    msg['To'] = receiver
    msg['Subject'] = EMAIL_SUBJECT  # 点开详情后的标题

    try:
        # 建立 SMTP 、SSL 的连接,连接发送方的邮箱服务器
        smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)

        # 登录发送方的邮箱账号
        smtp.login(user, passwd)

        # 发送邮件 发送方,接收方,发送的内容
        smtp.sendmail(sender, receiver, msg.as_string())

        print('邮件发送成功')

        smtp.quit()
    except Exception as e:
        print(e)
        print('发送邮件失败')
def monitor_urls():
    while True:
        print(f"\n[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 开始检测网页可访问性:")
        for url in urls:
            accessible, message = check_url(url)
            if accessible:
                print(f"✅ {url} - {message}")
            else:
                print(f"❌ {url} - {message}")
                # 构建邮件内容
                email_body = f"网页 {url} 在 {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} 不可访问。\n\n状态信息: {message}"
                # 发送邮件通知
                send_QQ_email_plain(email_body)
        print(f"等待 {CHECK_INTERVAL / 60} 分钟后再次检测...\n")
        time.sleep(CHECK_INTERVAL)

if __name__ == "__main__":
    monitor_urls()

后台执行

 nohup ./monitor_urls.py > monitor.log 2>&1 &

实现思路

1.通过对于浏览器请求头里面的只有是200才是正常访问,这个200代表对于网页的请求返回了所有html元素,别的状态码都是有问题的,丢失等等

2.一旦出现非200状态码,调用QQ邮箱,向指定邮箱进行发送邮件提醒。

至于怎么获取状态码,按照这个步骤:

第一步

image-20241224213706644

第二步

image-20241224213911950

第三部

image-20241224214046672

第四步

image-20241224214258548

结果

我那个英文无法访问原因是我的py脚本库,不能访问国外,其实这个问题我从大二就开始研究了,还没整好为啥其实,我再研究研究,之前研究过一段时间配置编辑器代理,但是这个是通过编辑器实现,一旦换个人的电脑那个人就用不了所以就没采用,一直给这个问题困扰好多了,尤其是代码访问github,我得再去好好研究研究。

​ 其实还有一个很难搞的问题,一旦开启了代理,运行py脚本国内也无法访问,这个又涉及到本地代理端口转发冲突问题,我得再去好好研究研究。

但是其实国内国外网站是一个好像,我记得,我这里加了en不是全局代理也能访问的链接

image-20241224214438590
代理,运行py脚本国内也无法访问,这个又涉及到本地代理端口转发冲突问题,我得再去好好研究研究。

但是其实国内国外网站是一个好像,我记得,我这里加了en不是全局代理也能访问的链接

[外链图片转存中…(img-x8NytmW2-1735048261197)]


http://www.kler.cn/a/450898.html

相关文章:

  • flask基础
  • Rust 在前端基建中的使用
  • Zabbix6.0升级为7.2
  • LGMRec:结合局部与全局图学习的多模态推荐系统
  • 专业的内外网数据交换方案 可解决安全、效率、便捷3大问题
  • Java爬虫获取1688 item_search_img接口详细解析
  • Z轴方向二维图像插值形成三维图像的算法及其优劣分析
  • Jmeter 分布式压测部署--常见坑以及解决方案
  • C++简明教程(10)(初识类)
  • acme ssl证书自动续签 nginx
  • 基于 kubeadm 安装 Kubernetes 集群的完整步骤
  • 在 Windows 系统上怎么看sqlserver的驱动版本呢
  • Springboot+Druid(可切换Hikari)+Mybatis-plus+mysql+hive的多数据源项目配置
  • 谷歌浏览器的屏幕截图工具使用指南
  • ubuntu paddle ocr 部署bug问题解决
  • 【Java数据结构】LinkedList
  • html+css网页设计 美食 百味美食4个页面
  • 【生信圆桌x教程系列】如何安装 seurat V5版本R包,最详细安装手册
  • Ubuntu22.04 LTS 安装nvidia显卡驱动
  • 美国加州房价数据分析02
  • 堆排序——C语言实现
  • Python毕业设计选题:基于Python的农产品销售系统的设计与实现_django
  • 微众银行金融场景 Agent:创新实践与深度剖析(12/30)
  • 洛谷 P1706 全排列问题 C语言
  • Django 管理界面中注册和配置 ECSService 模型
  • S5P6818_系统篇(9)kernel基础 sys/proc接口