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邮箱,向指定邮箱进行发送邮件提醒。
至于怎么获取状态码,按照这个步骤:
第一步
第二步
第三部
第四步
结果
我那个英文无法访问原因是我的py脚本库,不能访问国外,其实这个问题我从大二就开始研究了,还没整好为啥其实,我再研究研究,之前研究过一段时间配置编辑器代理,但是这个是通过编辑器实现,一旦换个人的电脑那个人就用不了所以就没采用,一直给这个问题困扰好多了,尤其是代码访问github,我得再去好好研究研究。
其实还有一个很难搞的问题,一旦开启了代理,运行py脚本国内也无法访问,这个又涉及到本地代理端口转发冲突问题,我得再去好好研究研究。
但是其实国内国外网站是一个好像,我记得,我这里加了en不是全局代理也能访问的链接
代理,运行py脚本国内也无法访问,这个又涉及到本地代理端口转发冲突问题,我得再去好好研究研究。
但是其实国内国外网站是一个好像,我记得,我这里加了en不是全局代理也能访问的链接
[外链图片转存中…(img-x8NytmW2-1735048261197)]