加入系统异常邮件提醒。
This commit is contained in:
13
robot.py
13
robot.py
@@ -17,6 +17,7 @@ from plugin_common.plugin_interface import PluginStatus
|
|||||||
from plugin_common.plugin_manager import PluginManager
|
from plugin_common.plugin_manager import PluginManager
|
||||||
from plugin_common.plugin_registry import PluginRegistry
|
from plugin_common.plugin_registry import PluginRegistry
|
||||||
from sehuatang.shehuatang import pdf_file_path
|
from sehuatang.shehuatang import pdf_file_path
|
||||||
|
from utils.email_util import EmailSender
|
||||||
from utils.revoke.message_auto_revoke import MessageAutoRevoke
|
from utils.revoke.message_auto_revoke import MessageAutoRevoke
|
||||||
from utils.robot_cmd.robot_command import GroupBotManager, Feature, PermissionStatus
|
from utils.robot_cmd.robot_command import GroupBotManager, Feature, PermissionStatus
|
||||||
|
|
||||||
@@ -93,6 +94,12 @@ class Robot:
|
|||||||
|
|
||||||
# 加载插件
|
# 加载插件
|
||||||
self.LOG.info("插件系统初始化完成")
|
self.LOG.info("插件系统初始化完成")
|
||||||
|
self.email_sender = EmailSender(
|
||||||
|
smtp_server="smtp.163.com",
|
||||||
|
smtp_port=465,
|
||||||
|
sender_email="bovine_liu@163.com",
|
||||||
|
sender_password="LTS9BhmX9XhS36QS"
|
||||||
|
)
|
||||||
|
|
||||||
def init_wechat_ipad(self):
|
def init_wechat_ipad(self):
|
||||||
"""初始化wechat_ipad客户端"""
|
"""初始化wechat_ipad客户端"""
|
||||||
@@ -215,6 +222,8 @@ class Robot:
|
|||||||
self.LOG.error(f"获取新消息失败 {e}")
|
self.LOG.error(f"获取新消息失败 {e}")
|
||||||
if "用户可能退出" in str(e):
|
if "用户可能退出" in str(e):
|
||||||
self.LOG.error(f"用户可能退出: {e}")
|
self.LOG.error(f"用户可能退出: {e}")
|
||||||
|
self.email_sender.send_wechat_alert("bovine_liu@163.com", f"用户可能退出: {e}", self.wxid,
|
||||||
|
self.nickname)
|
||||||
await self.login_twice_auto_auth()
|
await self.login_twice_auto_auth()
|
||||||
await asyncio.sleep(5)
|
await asyncio.sleep(5)
|
||||||
continue
|
continue
|
||||||
@@ -315,6 +324,8 @@ class Robot:
|
|||||||
self.LOG.error(f"wechat_ipad heartbeat: {e}")
|
self.LOG.error(f"wechat_ipad heartbeat: {e}")
|
||||||
if "用户可能退出" in str(e):
|
if "用户可能退出" in str(e):
|
||||||
self.LOG.error(f"用户可能退出: {e}")
|
self.LOG.error(f"用户可能退出: {e}")
|
||||||
|
self.email_sender.send_wechat_alert("bovine_liu@163.com", f"用户可能退出: {e}", self.wxid,
|
||||||
|
self.nickname)
|
||||||
await self.login_twice_auto_auth()
|
await self.login_twice_auto_auth()
|
||||||
await asyncio.sleep(60)
|
await asyncio.sleep(60)
|
||||||
|
|
||||||
@@ -332,6 +343,8 @@ class Robot:
|
|||||||
self.LOG.error(f"wechat_ipad heartbeat long: {e}")
|
self.LOG.error(f"wechat_ipad heartbeat long: {e}")
|
||||||
if "用户可能退出" in str(e):
|
if "用户可能退出" in str(e):
|
||||||
self.LOG.error(f"用户可能退出: {e}")
|
self.LOG.error(f"用户可能退出: {e}")
|
||||||
|
self.email_sender.send_wechat_alert("bovine_liu@163.com", f"用户可能退出: {e}", self.wxid,
|
||||||
|
self.nickname)
|
||||||
await self.login_twice_auto_auth()
|
await self.login_twice_auto_auth()
|
||||||
await asyncio.sleep(120)
|
await asyncio.sleep(120)
|
||||||
|
|
||||||
|
|||||||
133
utils/email_util.py
Normal file
133
utils/email_util.py
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
import smtplib
|
||||||
|
from email.mime.text import MIMEText
|
||||||
|
from email.mime.multipart import MIMEMultipart
|
||||||
|
from email.mime.base import MIMEBase
|
||||||
|
from email import encoders
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
|
||||||
|
|
||||||
|
class EmailSender:
|
||||||
|
def __init__(self, smtp_server, smtp_port, sender_email, sender_password):
|
||||||
|
"""初始化邮件发送工具类
|
||||||
|
|
||||||
|
Args:
|
||||||
|
smtp_server (str): SMTP 服务器地址
|
||||||
|
smtp_port (int): SMTP 服务器端口
|
||||||
|
sender_email (str): 发件人邮箱地址
|
||||||
|
sender_password (str): 发件人邮箱密码或授权码
|
||||||
|
"""
|
||||||
|
self.smtp_server = smtp_server
|
||||||
|
self.smtp_port = smtp_port
|
||||||
|
self.sender_email = sender_email
|
||||||
|
self.sender_password = sender_password
|
||||||
|
|
||||||
|
def send_email(self, recipient, subject, body, is_html=False, attachments=None):
|
||||||
|
"""发送电子邮件
|
||||||
|
|
||||||
|
Args:
|
||||||
|
recipient (str or list): 收件人邮箱地址,单个地址或地址列表
|
||||||
|
subject (str): 邮件主题
|
||||||
|
body (str): 邮件正文内容
|
||||||
|
is_html (bool): 是否为 HTML 格式内容
|
||||||
|
attachments (list): 附件文件路径列表
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: 发送成功返回 True,失败返回 False
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# 创建邮件对象
|
||||||
|
msg = MIMEMultipart()
|
||||||
|
msg['From'] = self.sender_email
|
||||||
|
msg['Subject'] = subject
|
||||||
|
|
||||||
|
# 处理收件人
|
||||||
|
if isinstance(recipient, str):
|
||||||
|
msg['To'] = recipient
|
||||||
|
else:
|
||||||
|
msg['To'] = ", ".join(recipient)
|
||||||
|
|
||||||
|
# 添加邮件正文
|
||||||
|
if is_html:
|
||||||
|
msg.attach(MIMEText(body, 'html', 'utf-8'))
|
||||||
|
else:
|
||||||
|
msg.attach(MIMEText(body, 'plain', 'utf-8'))
|
||||||
|
|
||||||
|
# 处理附件
|
||||||
|
if attachments:
|
||||||
|
for file_path in attachments:
|
||||||
|
if os.path.isfile(file_path):
|
||||||
|
with open(file_path, 'rb') as f:
|
||||||
|
part = MIMEBase('application', 'octet-stream')
|
||||||
|
part.set_payload(f.read())
|
||||||
|
|
||||||
|
# 编码附件
|
||||||
|
encoders.encode_base64(part)
|
||||||
|
|
||||||
|
# 添加附件头信息
|
||||||
|
part.add_header(
|
||||||
|
'Content-Disposition',
|
||||||
|
f'attachment; filename= {os.path.basename(file_path)}'
|
||||||
|
)
|
||||||
|
msg.attach(part)
|
||||||
|
|
||||||
|
# 连接 SMTP 服务器并发送
|
||||||
|
with smtplib.SMTP_SSL(self.smtp_server, self.smtp_port) as server:
|
||||||
|
server.login(self.sender_email, self.sender_password)
|
||||||
|
server.send_message(msg)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"发送邮件失败: {str(e)}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
def send_wechat_alert(self, recipient, error_msg, wxid, nickname, attachments=None):
|
||||||
|
"""发送微信机器人异常通知邮件
|
||||||
|
|
||||||
|
Args:
|
||||||
|
recipient (str or list): 收件人邮箱地址
|
||||||
|
error_msg (str): 错误信息
|
||||||
|
wxid (str): 微信ID
|
||||||
|
nickname (str): 微信昵称
|
||||||
|
attachments (list): 附件文件路径列表
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: 发送成功返回 True,失败返回 False
|
||||||
|
"""
|
||||||
|
subject = "微信机器人异常通知:用户可能退出"
|
||||||
|
content = f"""
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<h2>微信机器人异常通知</h2>
|
||||||
|
<p>检测到微信机器人出现"用户可能退出"异常</p>
|
||||||
|
<p>错误信息: {error_msg}</p>
|
||||||
|
<p>时间: {time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}</p>
|
||||||
|
<p>机器人信息:</p>
|
||||||
|
<ul>
|
||||||
|
<li>微信ID: {wxid}</li>
|
||||||
|
<li>昵称: {nickname}</li>
|
||||||
|
</ul>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
"""
|
||||||
|
return self.send_email(recipient, subject, content, is_html=True, attachments=attachments)
|
||||||
|
|
||||||
|
|
||||||
|
# 使用示例
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# 配置示例(请替换为实际的 SMTP 服务器信息)
|
||||||
|
email_sender = EmailSender(
|
||||||
|
smtp_server="smtp.163.com",
|
||||||
|
smtp_port=465,
|
||||||
|
sender_email="bovine_liu@163.com",
|
||||||
|
sender_password="LTS9BhmX9XhS36QS"
|
||||||
|
)
|
||||||
|
# 发送微信机器人异常通知
|
||||||
|
email_sender.send_wechat_alert(
|
||||||
|
recipient="bovine_liu@163.com",
|
||||||
|
error_msg="用户未响应,可能是未登录或退出",
|
||||||
|
wxid="wxid_123456789",
|
||||||
|
nickname="TestBot",
|
||||||
|
attachments=["error_log.txt"]
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user