auto-sync: 2026-04-05 17:32:06

This commit is contained in:
cfdaily
2026-04-05 17:32:06 +08:00
parent f2fe17a075
commit 5031c36ef0
82 changed files with 2238 additions and 57 deletions
+35
View File
@@ -0,0 +1,35 @@
import { SanguoMailbox } from '/Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/dist/index.js';
import { join } from 'path';
const CONFIG = {
rootPath: '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live',
teamName: 'sanguo-quant'
};
async function checkMail() {
const mailbox = new SanguoMailbox(CONFIG);
await mailbox.initTeam();
const unreadMessages = await mailbox.listUnread('jiangwei');
if (unreadMessages.length > 0) {
console.log(`发现 ${unreadMessages.length} 条未读消息`);
unreadMessages.forEach((msg, index) => {
console.log(`[${index + 1}] 来自 ${msg.from} - ${msg.text.substring(0, 50)}${msg.text.length > 50 ? '...' : ''}`);
});
await Promise.all(unreadMessages.map((msg, index) =>
mailbox.markAsReadByIndex('jiangwei', index)
));
console.log('所有未读消息已标记为已读');
}
}
async function startAutoCheck(intervalSeconds) {
console.log(`邮件检查服务已启动,检查间隔: ${intervalSeconds}`);
checkMail();
setInterval(checkMail, intervalSeconds * 1000);
}
startAutoCheck(parseInt(process.argv[2]) || 60);
+45
View File
@@ -0,0 +1,45 @@
#!/usr/bin/env node
/**
* Sanguo Mail 系统健康检查脚本
* 定期检查系统状态,确保邮件功能正常
*/
import { SanguoMailbox } from '../sanguo_mail/src/index.js';
import { join } from 'path';
const CONFIG = {
rootPath: '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live',
teamName: 'sanguo-quant',
};
async function checkSystem() {
console.log('[Health Check] 开始系统健康检查...');
try {
const mail = new SanguoMailbox(CONFIG);
// 检查团队配置
const team = await mail.initTeam();
console.log(`[Health Check] 团队配置正常: ${team.teamName}`);
// 检查成员列表
if (team.members.length === 0) {
console.error('[Health Check] 错误: 团队成员为空');
return 1;
}
console.log(`[Health Check] 成员数量: ${team.members.length}`);
// 检查邮件功能
const myInbox = await mail.listUnread('jiangwei');
console.log(`[Health Check] 收件箱: ${myInbox.length} 条未读消息`);
console.log('[Health Check] 系统健康检查完成');
return 0;
} catch (error) {
console.error('[Health Check] 系统健康检查失败:', error.message);
return 1;
}
}
checkSystem().then(process.exit);
+176
View File
@@ -0,0 +1,176 @@
#!/usr/bin/env node
/**
* 姜姜维邮箱监控脚本
*
* 基于官方 monitor-example.ts 的实现
* 功能:轮询检查收件箱,处理未读消息,回复绕口令
*
* 使用方法:
* cd /Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live
* node scripts/jiangwei-mail-monitor.js
*/
import { SanguoMailbox } from '/Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/dist/index.js';
// 项目根目录
const PROJECT_ROOT = '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live';
// 我的Agent名称
const MY_AGENT_NAME = 'jiangwei';
// 轮询间隔(秒)
const POLL_INTERVAL = 3;
// 辅助函数:等待
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
// 日志函数
function log(level, message) {
const timestamp = new Date().toISOString();
console.log(`[${timestamp}] [${level}] ${message}`);
}
/**
* 根据请求生成对应的绕口令回复
* 使用和官方示例一样的逻辑
*/
function get绕口令Response(request) {
if (request.includes('黑化肥发灰')) {
return `黑化肥发灰,灰化肥发黑
黑化肥发灰会挥发,灰化肥挥发会发黑
黑化肥挥发发灰会花飞,灰化肥挥发发黑会飞花`;
} else if (request.includes('刘老六')) {
return `六十六,刘老六,修了六十六座走马楼
楼上摆了六十六瓶灵芝麻油
六十六个灵猿偷油喝
压得走马楼晃悠悠`;
} else if (request.includes('一平盆面')) {
return `一平盆面,烙一平盆饼
饼平盆,盆平饼,饼平平盆
盆碰饼,饼碰盆,盆饼碰碰`;
} else if (request.includes('四是四')) {
return `四是四,十是十
十四是十四,四十是四十
莫把四字说成十,休将十字说成四
若要分清四十和十四,经常练说十和四
白石塔,白石搭,白石搭白塔
白塔白石搭,搭好白石塔,白塔白又大`;
} else if (request.includes('牛郎恋刘娘')) {
return `牛郎恋刘娘,刘娘念牛郎
牛郎牛年恋刘娘,刘娘年年念牛郎
郎恋娘来娘念郎,念娘恋郎,念郎恋娘
不知是郎恋娘还是娘恋郎
吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮`;
} else if (request.includes('石室诗士')) {
return `石室诗士施氏,嗜狮,誓食十狮
氏时时适市视狮
十时,适十狮适市
是时,适视氏适市
氏视是十狮,恃矢势,使是十狮逝世
氏拾是十狮尸,适石室
石室拭,氏始试食是十狮尸
食时,始识是十狮尸,实十石狮尸
试释是事`;
} else if (request.includes('石狮寺')) {
return `石狮寺前有四十四个石狮子
寺前四十四个部狮子吃四十四个涩柿子
四十四个涩柿子涩住了四十四个石狮子的狮子齿
四十四个石狮子咬死了四十四个涩柿子`;
} else {
return `收到请求: ${request}
我是姜维,邮箱监控运行正常。这是自动回复。`;
}
}
// 主函数
async function main() {
log('INFO', `🚀 Sanguo Mail 监控启动 - Agent: ${MY_AGENT_NAME}`);
log('INFO', `📂 项目根目录: ${PROJECT_ROOT}`);
try {
// 1. 初始化邮箱
log('INFO', '初始化 sanguo_mail 邮箱...');
const mail = new SanguoMailbox({
rootPath: PROJECT_ROOT,
teamName: 'sanguo-quant',
});
await mail.initTeam();
log('INFO', '✅ 邮箱初始化完成');
// 2. 进入轮询循环
while (true) {
try {
// 检查未读消息
const unread = await mail.listUnread(MY_AGENT_NAME);
if (unread.length > 0) {
log('INFO', `📥 收到 ${unread.length} 条新消息`);
for (const [index, msg] of unread.entries()) {
log('INFO', `\n🔍 处理消息 #${index + 1}:`);
log('INFO', ` 发件人: ${msg.from}`);
log('INFO', ` 摘要: ${msg.summary}`);
log('INFO', ` 类型: ${msg.type}`);
// 处理消息
if (msg.type === 'text') {
// 生成绕口令回复
const response = get绕口令Response(msg.text);
log('INFO', `✍️ 生成回复: ${response.substring(0, 50)}...`);
// 发送回复给发件人
await mail.sendMessage(msg.from, {
from: MY_AGENT_NAME,
to: msg.from,
text: response,
summary: `回复: ${msg.summary}`,
type: 'text',
});
log('INFO', `✅ 回复已发送给 ${msg.from}`);
} else if (mail.isStructuredMessage(msg.text)) {
const struct = mail.parseStructuredMessage(msg.text);
log('INFO', `📋 结构化消息: type=${struct?.type}`);
// 在这里根据类型处理...
}
// 标记已读
const allMessages = await mail.listMessages(MY_AGENT_NAME);
const messageIndex = allMessages.findIndex(m =>
m.timestamp === msg.timestamp
);
if (messageIndex >= 0) {
await mail.markAsRead(MY_AGENT_NAME, messageIndex);
log('INFO', `✅ 消息已标记为已读`);
}
}
}
// 等待下一轮
await sleep(POLL_INTERVAL * 1000);
} catch (error) {
log('ERROR', '❌ 轮询出错:', error.message);
await sleep(POLL_INTERVAL * 1000);
}
}
} catch (error) {
log('ERROR', `💥 监控异常退出: ${error.message}`);
log('ERROR', error.stack);
process.exit(1);
}
}
// 优雅退出处理
process.on('SIGINT', () => {
log('INFO', '\n👋 收到退出信号,停止监控...');
log('INFO', '=== 姜维邮箱监控系统停止 ===');
process.exit(0);
});
// 启动
main();
Executable
+630
View File
@@ -0,0 +1,630 @@
#!/usr/bin/env bash
set -e
# Sanguo Mail 系统管理脚本
# 支持启动、停止、配置、健康检查等操作
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 日志函数
log() {
local level="$1"
local message="$2"
local color
case "$level" in
"error") color="$RED" ;;
"warning") color="$YELLOW" ;;
"info") color="$BLUE" ;;
"success") color="$GREEN" ;;
*) color="$NC" ;;
esac
local timestamp=$(date +"%Y-%m-%d %H:%M:%S")
local level_uppercase=$(echo "$level" | tr '[:lower:]' '[:upper:]')
echo -e "${color}[${timestamp}] [${level_uppercase}] ${message}${NC}"
}
# 配置常量
PROJECT_ROOT="/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live"
MAIL_PROJECT_DIR="$PROJECT_ROOT/mail"
SCRIPTS_DIR="$PROJECT_ROOT/scripts"
# 检查节点是否在线
check_node() {
log "info" "检查节点连接..."
openclaw nodes list >/dev/null 2>&1
if [ $? -eq 0 ]; then
log "success" "节点连接正常"
else
log "error" "节点连接失败,请确保 OpenClaw 服务正在运行"
exit 1
fi
}
# 获取服务配置
get_config() {
local config_file="$SCRIPTS_DIR/config.json"
if [ -f "$config_file" ]; then
cat "$config_file"
else
cat << 'EOF'
{
"server": {
"port": 18888,
"host": "0.0.0.0",
"timeout": 30000
},
"api": {
"baseUrl": "http://127.0.0.1:18888",
"timeout": 10000
},
"mailSystem": {
"rootPath": "/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live",
"teamName": "sanguo-quant"
},
"autoCheck": {
"interval": 60,
"enabled": true
}
}
EOF
fi
}
# 设置配置
set_config() {
local config_file="$SCRIPTS_DIR/config.json"
local config=$(get_config)
local key="$1"
local value="$2"
if [ -z "$key" ] || [ -z "$value" ]; then
log "error" "设置配置需要提供配置项和值"
log "usage" "使用方法: $0 config set <key> <value>"
exit 1
fi
log "info" "正在设置 $key = $value"
if [ -f "$config_file" ]; then
jq ".${key} = \"${value}\"" "$config_file" > "${config_file}.tmp" && mv "${config_file}.tmp" "$config_file"
else
local default_config=$(get_config | jq ".${key} = \"${value}\"")
echo "$default_config" > "$config_file"
fi
log "success" "配置已更新"
log "info" "重启服务使配置生效"
}
# 启动服务
start_server() {
log "info" "正在启动 Sanguo Mail 服务..."
# 检查项目是否已安装
if [ ! -d "$PROJECT_ROOT" ]; then
log "error" "项目根目录不存在: $PROJECT_ROOT"
exit 1
fi
# 检查依赖
if [ ! -d "$PROJECT_ROOT/node_modules" ]; then
log "info" "依赖未安装,正在安装..."
install_deps
fi
# 检查邮件系统初始化
if [ ! -d "$PROJECT_ROOT/mail/sanguo-quant/inboxes" ] || [ ! -f "$PROJECT_ROOT/mail/sanguo-quant/team.json" ]; then
log "info" "邮件系统未初始化,正在初始化..."
init_system
fi
# 启动服务
log "info" "正在启动邮件服务进程..."
node "$SCRIPTS_DIR/server.js" > "$SCRIPTS_DIR/mail-service.log" 2>&1 &
local PID=$!
# 保存 PID
echo "$PID" > "$SCRIPTS_DIR/mail.pid"
# 等待服务启动
log "info" "等待服务启动..."
sleep 2
# 检查服务是否正在运行
if ps -p "$PID" > /dev/null 2>&1; then
log "success" "服务启动成功,PID: $PID"
log "success" "服务日志: $SCRIPTS_DIR/mail-service.log"
log "success" "访问地址: http://127.0.0.1:18888"
else
log "error" "服务启动失败"
if [ -f "$SCRIPTS_DIR/mail-service.log" ]; then
log "error" "错误日志: $(head -20 "$SCRIPTS_DIR/mail-service.log")"
fi
exit 1
fi
}
# 停止服务
stop_server() {
local PID_FILE="$SCRIPTS_DIR/mail.pid"
if [ -f "$PID_FILE" ]; then
local PID=$(cat "$PID_FILE")
log "info" "正在停止服务,PID: $PID"
if ps -p "$PID" > /dev/null 2>&1; then
kill "$PID"
log "success" "服务已停止"
else
log "warning" "服务已停止 (PID $PID 不存在)"
fi
rm -f "$PID_FILE"
else
log "warning" "服务 PID 文件不存在,可能服务未运行"
# 尝试查找并停止进程
local PROCESS=$(ps aux | grep "node $SCRIPTS_DIR/server.js" | grep -v grep | awk '{print $2}')
if [ -n "$PROCESS" ]; then
log "info" "找到服务进程,PID: $PROCESS"
kill "$PROCESS"
log "success" "服务已停止"
fi
fi
}
# 查看服务状态
status() {
log "info" "=== 系统状态 ==="
# 检查项目根目录
if [ -d "$PROJECT_ROOT" ]; then
log "success" "项目根目录存在: $PROJECT_ROOT"
else
log "error" "项目根目录不存在: $PROJECT_ROOT"
fi
# 检查邮件系统目录
MAIL_DIR="$PROJECT_ROOT/mail/sanguo-quant"
if [ -d "$MAIL_DIR" ]; then
log "success" "邮件系统目录存在: $MAIL_DIR"
else
log "warning" "邮件系统目录不存在: $MAIL_DIR"
fi
# 检查收件箱
if [ -d "$MAIL_DIR/inboxes" ]; then
log "success" "收件箱目录存在: $MAIL_DIR/inboxes"
# 统计收件箱文件数量
local inbox_count=$(ls -1 "$MAIL_DIR/inboxes"/*.json 2>/dev/null | wc -l)
log "success" "收件箱数量: $inbox_count"
else
log "warning" "收件箱目录不存在: $MAIL_DIR/inboxes"
fi
# 检查成员配置
TEAM_CONFIG="$MAIL_DIR/team.json"
if [ -f "$TEAM_CONFIG" ]; then
log "success" "团队配置文件存在: $TEAM_CONFIG"
# 统计团队成员数量
local member_count=$(jq '.members | length' "$TEAM_CONFIG" 2>/dev/null || echo 0)
log "success" "团队成员数量: $member_count"
else
log "warning" "团队配置文件不存在: $TEAM_CONFIG"
fi
# 检查服务状态
if [ -f "$SCRIPTS_DIR/mail.pid" ]; then
local PID=$(cat "$SCRIPTS_DIR/mail.pid")
if ps -p "$PID" > /dev/null 2>&1; then
log "success" "服务正在运行,PID: $PID"
else
log "warning" "PID 文件存在,但进程未运行"
rm -f "$SCRIPTS_DIR/mail.pid"
fi
else
log "warning" "服务未运行"
fi
}
# 查看日志
logs() {
local LOG_FILE="$SCRIPTS_DIR/mail-service.log"
if [ ! -f "$LOG_FILE" ]; then
log "error" "日志文件不存在: $LOG_FILE"
exit 1
fi
if [ -z "$2" ]; then
tail -f "$LOG_FILE"
else
log "info" "显示最后 $2 行日志"
tail -"$2" "$LOG_FILE"
fi
}
# 健康检查
check_health() {
log "info" "正在进行健康检查..."
local ERROR_COUNT=0
local WARNING_COUNT=0
# 检查依赖
if [ ! -d "$PROJECT_ROOT/node_modules" ]; then
log "error" "依赖未安装"
ERROR_COUNT=$((ERROR_COUNT + 1))
else
log "success" "依赖已安装"
fi
# 检查邮件系统初始化
if [ ! -d "$PROJECT_ROOT/mail/sanguo-quant/inboxes" ] || [ ! -f "$PROJECT_ROOT/mail/sanguo-quant/team.json" ]; then
log "warning" "邮件系统未初始化"
WARNING_COUNT=$((WARNING_COUNT + 1))
else
log "success" "邮件系统已初始化"
fi
# 检查服务状态
if [ -f "$SCRIPTS_DIR/mail.pid" ]; then
local PID=$(cat "$SCRIPTS_DIR/mail.pid")
if ps -p "$PID" > /dev/null 2>&1; then
log "success" "服务正在运行,PID: $PID"
else
log "error" "PID 文件存在,但进程未运行"
ERROR_COUNT=$((ERROR_COUNT + 1))
fi
else
log "warning" "服务未运行"
WARNING_COUNT=$((WARNING_COUNT + 1))
fi
log "info" "=== 健康检查结果 ==="
log "success" "成功项: $((4 - ERROR_COUNT - WARNING_COUNT))"
if [ "$WARNING_COUNT" -gt 0 ]; then
log "warning" "警告项: $WARNING_COUNT"
fi
if [ "$ERROR_COUNT" -gt 0 ]; then
log "error" "错误项: $ERROR_COUNT"
exit 1
fi
log "success" "系统健康状况良好"
}
# 检查安全配置
check_security() {
if [ ! -f "/Users/chufeng/.openclaw/config/security.json" ]; then
log "warning" "安全配置文件未找到,使用默认策略"
return 0
fi
local security_level=$(jq -r '.security_level' "/Users/chufeng/.openclaw/config/security.json")
log "info" "当前安全级别: $security_level"
if [ "$security_level" != "full" ]; then
log "warning" "安全级别不是 full,可能会影响邮件系统功能"
fi
}
# 列出配置
list_config() {
log "info" "=== 当前配置 ==="
log "info" "项目根目录: $PROJECT_ROOT"
log "info" "邮件系统目录: $MAIL_PROJECT_DIR"
log "info" "脚本目录: $SCRIPTS_DIR"
# 显示配置文件内容
if [ -f "$SCRIPTS_DIR/config.json" ]; then
log "info" "配置文件内容:"
cat "$SCRIPTS_DIR/config.json"
else
log "warning" "配置文件未找到,使用默认值"
fi
}
# 启动邮件检查服务
watch_mail() {
log "info" "正在启动邮件检查服务..."
local interval=${2:-60}
log "info" "邮件检查间隔: $interval"
# 创建检查脚本
cat > "$SCRIPTS_DIR/auto-check-mail.js" << 'EOF'
import { SanguoMailbox } from '/Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/dist/index.js';
import { join } from 'path';
const CONFIG = {
rootPath: '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live',
teamName: 'sanguo-quant'
};
async function checkMail() {
const mailbox = new SanguoMailbox(CONFIG);
await mailbox.initTeam();
const unreadMessages = await mailbox.listUnread('jiangwei');
if (unreadMessages.length > 0) {
console.log(`发现 ${unreadMessages.length} 条未读消息`);
unreadMessages.forEach((msg, index) => {
console.log(`[${index + 1}] 来自 ${msg.from} - ${msg.text.substring(0, 50)}${msg.text.length > 50 ? '...' : ''}`);
});
await Promise.all(unreadMessages.map((msg, index) =>
mailbox.markAsReadByIndex('jiangwei', index)
));
console.log('所有未读消息已标记为已读');
}
}
async function startAutoCheck(intervalSeconds) {
console.log(`邮件检查服务已启动,检查间隔: ${intervalSeconds} 秒`);
checkMail();
setInterval(checkMail, intervalSeconds * 1000);
}
startAutoCheck(parseInt(process.argv[2]) || 60);
EOF
chmod +x "$SCRIPTS_DIR/auto-check-mail.js"
# 启动服务
log "info" "正在启动邮件检查服务..."
node "$SCRIPTS_DIR/auto-check-mail.js" "$interval" > "$SCRIPTS_DIR/auto-check-mail.log" 2>&1 &
local PID=$!
log "success" "邮件检查服务启动成功,PID: $PID"
log "success" "检查日志: $SCRIPTS_DIR/auto-check-mail.log"
log "success" "检查间隔: $interval"
}
# 停止邮件检查服务
stop_watch_mail() {
local WATCH_PID=$(ps aux | grep "node $SCRIPTS_DIR/auto-check-mail.js" | grep -v grep | awk '{print $2}')
if [ -n "$WATCH_PID" ]; then
log "info" "正在停止邮件检查服务,PID: $WATCH_PID"
kill "$WATCH_PID"
log "success" "邮件检查服务已停止"
else
log "warning" "邮件检查服务未运行"
fi
}
# 显示使用说明
show_usage() {
log "info" "Sanguo Mail 系统管理脚本"
log "info" "使用方法: $0 <命令> [参数]"
log "info" ""
log "info" "可用命令:"
log "info" " init 初始化系统"
log " start 启动服务"
log " stop 停止服务"
log " restart 重启服务"
log " status 显示系统状态"
log " logs [行数] 显示服务日志"
log " config [set <配置项> <值>] 设置/查看配置"
log " install 安装项目依赖"
log " check 健康检查"
log " list 列出所有命令"
log " watch [间隔] 启动邮件检查服务"
log " stop-watch 停止邮件检查服务"
log " test 测试邮件发送和接收"
log " help 显示此帮助信息"
}
# 显示可用命令列表
list_commands() {
log "info" "可用命令:"
log "info" " init 初始化系统"
log "info" " start 启动服务"
log "info" " stop 停止服务"
log "info" " restart 重启服务"
log "info" " status 显示系统状态"
log "info" " logs [行数] 显示服务日志"
log "info" " config [set <配置项> <值>] 设置/查看配置"
log "info" " install 安装项目依赖"
log "info" " check 健康检查"
log "info" " list 列出所有命令"
log "info" " watch [间隔] 启动邮件检查服务"
log "info" " stop-watch 停止邮件检查服务"
log "info" " test 测试邮件发送和接收"
log "info" " help 显示此帮助信息"
}
# 测试邮件发送
test_send_mail() {
log "info" "正在测试邮件发送..."
cat > "$SCRIPTS_DIR/test-send.js" << 'EOF'
import { SanguoMailbox } from '/Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/dist/index.js';
const CONFIG = {
rootPath: '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live',
teamName: 'sanguo-quant'
};
async function testSendMail() {
const mailbox = new SanguoMailbox(CONFIG);
await mailbox.initTeam();
await mailbox.sendMessage('zhangfei', {
from: 'pangtong',
to: 'zhangfei',
text: '测试消息:发送一条测试邮件',
type: 'text'
});
console.log('测试邮件发送成功');
}
testSendMail();
EOF
chmod +x "$SCRIPTS_DIR/test-send.js"
node "$SCRIPTS_DIR/test-send.js"
log "success" "测试邮件发送成功"
}
# 测试邮件接收
test_receive_mail() {
log "info" "正在测试邮件接收..."
cat > "$SCRIPTS_DIR/test-receive.js" << 'EOF'
import { SanguoMailbox } from '/Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/dist/index.js';
const CONFIG = {
rootPath: '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live',
teamName: 'sanguo-quant'
};
async function testReceiveMail() {
const mailbox = new SanguoMailbox(CONFIG);
await mailbox.initTeam();
const unread = await mailbox.listUnread('zhangfei');
if (unread.length === 0) {
console.log('没有未读邮件');
return;
}
console.log(`发现 ${unread.length} 条未读邮件`);
for (let i = 0; i < unread.length; i++) {
const msg = unread[i];
console.log(`[${i + 1}] ${msg.from} - ${msg.text}`);
console.log(`类型: ${msg.type}`);
console.log(`时间: ${msg.timestamp}`);
console.log('');
}
}
testReceiveMail();
EOF
chmod +x "$SCRIPTS_DIR/test-receive.js"
node "$SCRIPTS_DIR/test-receive.js"
log "success" "测试邮件接收成功"
}
# 测试功能
run_test() {
log "info" "正在运行 Sanguo Mail 系统测试..."
# 初始化系统(如果未初始化)
if [ ! -d "$PROJECT_ROOT/mail/sanguo-quant/inboxes" ] || [ ! -f "$PROJECT_ROOT/mail/sanguo-quant/team.json" ]; then
log "info" "邮件系统未初始化,正在初始化..."
init_system
fi
# 测试邮件发送
test_send_mail
# 测试邮件接收
test_receive_mail
}
# 主命令处理
case "${1:-}" in
"init" | "setup" )
init_system
;;
"start" | "up" )
start_server
;;
"stop" | "down" )
stop_server
;;
"restart" )
stop_server
sleep 2
start_server
;;
"watch" )
watch_mail "$@"
;;
"stop-watch" )
stop_watch_mail
;;
"status" )
status
;;
"logs" )
logs "$@"
;;
"config" )
if [ -z "$2" ]; then
list_config
elif [ "$2" = "set" ]; then
set_config "${3:-}" "${4:-}"
else
log "error" "配置命令无效"
log "usage" "使用方法: $0 config [set <key> <value>]"
fi
;;
"install" )
install_deps
;;
"check" )
check_health
;;
"list" )
list_commands
;;
"test" )
run_test
;;
"help" )
show_usage
;;
"" )
show_usage
;;
* )
log "warning" "未知命令: $1"
show_usage
exit 1
;;
esac