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

服务器定时发送邮件设置

服务器定时发送邮件设置
crontab -e

"/tmp/crontab.srYPTQ"1L, 72B */10 * * * * /usr/bin/python3 /root/send_mail.py>>/root/mail.log2>&1

检查日志,并发送邮件

importosimportreimportsmtplibfromdatetimeimportdatetime,datefromemail.mime.textimportMIMETextfromemail.headerimportHeader# ========== 日志监控配置 ==========LOG_FILE="/root/xxx.log"KEYWORD="youtube"STATE_FILE="/root/mail_auto/log_monitor.state"# ========== QQ邮箱配置 ==========SMTP_HOST="smtp.qq.com"SMTP_PORT=465SENDER="你的QQ邮箱@qq.com"AUTH_CODE="你的QQ邮箱授权码"RECEIVER="接收报警的邮箱@example.com"defsend_email(subject,body):msg=MIMEText(body,"plain","utf-8")msg["From"]=SENDER msg["To"]=RECEIVER msg["Subject"]=Header(subject,"utf-8")withsmtplib.SMTP_SSL(SMTP_HOST,SMTP_PORT)asserver:server.login(SENDER,AUTH_CODE)server.sendmail(SENDER,[RECEIVER],msg.as_string())defget_last_position():ifnotos.path.exists(STATE_FILE):returnNonetry:withopen(STATE_FILE,"r")asf:returnint(f.read().strip())exceptException:returnNonedefsave_position(position):withopen(STATE_FILE,"w")asf:f.write(str(position))defparse_log_time(line):""" 匹配日志时间格式: 2026/05/03 14:20:00 """pattern=r"(\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2})"match=re.search(pattern,line)ifnotmatch:returnNonetry:returndatetime.strptime(match.group(1),"%Y/%m/%d %H:%M:%S")exceptException:returnNonedeffilter_today_lines(content):today=date.today()today_lines=[]forlineincontent.splitlines():log_time=parse_log_time(line)iflog_timeisnotNoneandlog_time.date()==today:today_lines.append(line)return"\n".join(today_lines)defmonitor_log():ifnotos.path.exists(LOG_FILE):print(f"日志文件不存在:{LOG_FILE}")returncurrent_size=os.path.getsize(LOG_FILE)last_position=get_last_position()withopen(LOG_FILE,"r",encoding="utf-8",errors="ignore")asf:iflast_positionisNone:# 首次运行:读取整个日志,但只检查今天的内容print("首次运行:只检查今天的日志")content=f.read()check_content=filter_today_lines(content)else:# 如果日志被清空或轮转,从头开始ifcurrent_size<last_position:last_position=0f.seek(last_position)content=f.read()# 后续运行:只检查新增内容,并且只保留今天的日志check_content=filter_today_lines(content)new_position=f.tell()# 无论是否命中,都保存当前位置,避免重复检查save_position(new_position)ifKEYWORD.lower()incheck_content.lower():matched_lines=[]forlineincheck_content.splitlines():ifKEYWORD.lower()inline.lower():matched_lines.append(line)matched_text="\n".join(matched_lines[:20])subject=f"服务器日志报警:检测到关键词{KEYWORD}"body=f""" 检测到日志中出现关键词:{KEYWORD}日志文件:{LOG_FILE}匹配关键词:{KEYWORD}匹配到的日志如下:{matched_text}"""send_email(subject,body)print(f"检测到关键词{KEYWORD},已发送邮件")else:print(f"今天的新增日志中未检测到关键词{KEYWORD}")if__name__=="__main__":monitor_log()
http://www.jsqmd.com/news/759513/

相关文章:

  • 通达信缠论量化插件:3分钟实现智能K线分析
  • Go数组去重的20种实现方式,AI时代解决问题的不同思路
  • TradingAgents 多智能体交易框架深度评测
  • Palworld存档救援指南:3步修复损坏存档,找回你的帕鲁世界
  • 2026年Hermes Agent/OpenClaw怎么部署?阿里云混合云部署及Coding Plan配置
  • 【强力推荐】res-downloader:如何轻松获取全网资源的智能下载神器
  • 【Dify低代码集成实战指南】:20年架构师亲授5大避坑法则与3步极速接入法
  • 101页满分PPT | 智能工厂系统解决方案
  • 长期项目使用Taotoken按token计费模式带来的成本可控感受
  • CefFlashBrowser:免费Flash浏览器终极指南,让经典Flash内容重获新生
  • JSON 转 Proto 工具(支持嵌套与注释解析)
  • NVIDIA Jetson Orin 简介
  • 利用 One-API 实现 Awesome- GPT( Zotero 插件)的多模型切换
  • 2025届学术党必备的六大AI学术平台推荐
  • 行测申论之外,这些“隐藏”考试内容你知道吗?银保监、外交部等岗位专业课备考指南
  • 新手零代码入门:借助快马AI生成你的第一个有赞式微商城
  • 2026AI商用合规:GPT-Image-2边界解析
  • 别再为电机电感不准发愁了:手把手教你用Simulink复现自适应增益ESO无模型预测控制
  • 2026年企业钓鱼攻击全景报告:AI驱动的“闪电战“与可落地的应急响应SOP
  • 风力发电机输出功率预测建模:算法、影响因素与优化策略深度解析
  • 大模型微调终极指南:从显存优化到高效推理,一文吃透所有核心技术
  • SDQM:无需真实数据的合成质量评估新方法
  • 别再手动烧录MAC了!用STM32F103的UID自动生成局域网唯一设备ID(附完整代码)
  • Sunshine游戏串流终极指南:自托管游戏串流服务器的完整配置与优化
  • 超性感的轻量级openclaw平替,我给nanobot打call
  • 如何用Obsidian Zettelkasten模板实现知识管理的终极升级:从信息收集到智慧创造的完整指南
  • 跨越语言障碍的直播翻译神器:Stream-Translator完全指南
  • Python脚本Shebang最佳实践
  • Laravel 4.x:颠覆PHP框架的10大革新特性
  • 如何用Python构建卡车模拟器的自动驾驶系统?ETS2LA技术深度解析