6.6 KiB
6.6 KiB
通知问题排查指南
问题现象
监测股票到价格了,但没有收到消息(包括网页和邮件)
快速诊断
步骤1:运行诊断工具
python test_notification_debug.py
这个工具会检查:
- ✅ 数据库中的通知记录
- ✅ 邮件配置状态
- ✅ 邮件发送测试
- ✅ 股票价格和触发条件
- ✅ 待发送通知
步骤2:检查常见问题
问题1:价格已不在触发区间
症状:股票价格曾经到达过,但现在已经超出区间
示例:
- 进场区间:44.87 - 46.48
- 当前价格:47.99(已超出)
- 结果:不会触发新通知
解决:
- 查看"通知历史"确认是否之前已触发过
- 如需重新监测,调整进场区间
问题2:60分钟防重复机制
症状:价格在区间内,但不发送通知
原因:同一触发条件60分钟内只发送一次,避免重复
查看方法:
python test_notification_debug.py
会显示:"⚠️ 最近60分钟内已发送过XX通知"
解决:
- 等待60分钟后会自动重新发送
- 或者清空数据库通知记录(会导致历史丢失)
问题3:网页通知显示问题
症状:有通知但网页看不到
原因:
- 之前的显示逻辑只显示"未发送"的通知
- 通知发送后被标记为"已发送"就不显示了
已修复:
- 现在显示所有最近通知(包括已发送和未发送)
- 显示发送状态:"✅ 已发送" 或 "⏳ 待发送"
问题4:邮件配置问题
检查清单:
# .env 文件
EMAIL_ENABLED=true # 必须是 true
SMTP_SERVER=smtp.qq.com # QQ邮箱或其他
SMTP_PORT=587 # 587(TLS) 或 465(SSL)
EMAIL_FROM=your_email@qq.com # 发件邮箱
EMAIL_PASSWORD=xxxxxx # 授权码(不是登录密码!)
EMAIL_TO=receiver@example.com # 收件邮箱
测试方法:
- 在网页界面:监测管理 → 通知管理 → 发送测试邮件
- 或运行:
python test_notification_debug.py
常见错误:
- ❌ 使用邮箱登录密码而非授权码
- ❌ EMAIL_ENABLED 设置为 false
- ❌ 端口号不正确(QQ邮箱用587或465)
完整排查流程
1. 确认监测服务运行
网页界面 → 监测管理
查看状态:🟢 运行中
如果显示"🔴 已停止",点击"▶️ 启动监测"
2. 查看通知历史
网页界面 → 监测管理 → 通知历史
应该能看到:
- 所有触发的通知(新版本已修复)
- 每条通知的发送状态
- 触发时间
3. 检查股票状态
运行诊断工具查看详细信息:
python test_notification_debug.py
关注输出中的:
📊 股票代码 - 股票名称
当前价格: XX.XX
进场区间: XX.XX - XX.XX
🟢 当前价格在进场区间内
⚠️ 但最近60分钟内已发送过进场通知
4. 查看终端日志
监测服务运行时会输出详细日志:
正常流程:
正在更新股票 300832 的价格...
✅ 300832 当前价格: ¥66.5
==================================================
开始发送通知,共 1 条
==================================================
处理通知: 300832 - entry
📧 正在发送邮件...
- 收件人: xxx@qq.com
- 主题: 股票监测提醒 - 300832
- 使用 SMTP+TLS 连接 smtp.qq.com:587
- 正在登录...
- 正在发送...
✅ 邮件发送成功: 300832
✅ 通知已成功发送并标记
配置问题:
⚠️ 邮件配置不完整,使用界面通知
- SMTP服务器: 未配置
- 发件人: 未配置
- 收件人: 未配置
- 密码: 未配置
发送失败:
邮件发送失败: [Errno 11001] getaddrinfo failed
使用界面通知作为备用方案
5. 手动测试通知
如果想立即测试通知(不等待价格触发):
# 创建测试脚本 test_manual_notification.py
from monitor_db import monitor_db
from notification_service import notification_service
# 添加一条测试通知
monitor_db.add_notification(
stock_id=1, # 你的股票ID
notification_type='entry',
message='这是一条测试通知'
)
# 立即发送
notification_service.send_notifications()
修复后的改进
1. 网页通知显示增强 ✅
- 显示所有最近通知(不只是待发送的)
- 显示发送状态标识
- 显示待发送通知数量警告
2. 日志输出增强 ✅
- 详细的邮件发送过程日志
- 配置检查提示
- 错误堆栈跟踪
3. 防重复机制 ✅
- 60分钟内同类型通知只发送一次
- 避免价格波动导致的重复通知
4. 监测频率优化 ✅
- 5分钟循环检查
- 按设定间隔更新每只股票
- 股票间3秒延迟,避免API限流
预期效果
当股票价格满足条件时:
-
数据库记录 ✅
notifications 表中新增记录 sent = FALSE -
发送通知 ✅
调用 notification_service.send_notifications() 尝试发送邮件 标记 sent = TRUE -
邮件到达 ✅
收件箱收到邮件 主题:股票监测提醒 - XXX -
网页显示 ✅
监测管理 → 通知历史 显示:[✅ 已发送] 股票 XXX ...
常见场景答疑
Q1: 价格到了但没收到通知
检查:
- 是否60分钟内已发送过?→ 查看通知历史
- 邮件配置是否正确?→ 发送测试邮件
- 监测服务是否运行?→ 查看状态
- 通知是否被禁用?→ 检查股票的"通知启用"开关
Q2: 测试邮件能收到,但监测邮件收不到
可能原因:
- 触发条件未满足(价格不在区间)
- 60分钟防重复
- 监测服务未启动
- 代码更新前的旧版本问题
解决:
- 运行
test_notification_debug.py全面检查 - 查看终端日志确认是否真的触发
- 确保使用的是修复后的代码
Q3: 网页看不到通知
已修复:旧版本只显示待发送通知,新版本显示所有通知
刷新界面:点击"🔄 刷新状态"
Q4: 想立即重新发送通知
方法:
- 清空通知记录(会丢失历史)
- 或等待60分钟
- 或调整价格区间让其重新触发
技术支持
如果问题仍未解决:
-
提供诊断报告:
python test_notification_debug.py > diagnosis.txt -
提供终端日志: 复制运行 Streamlit 的终端输出
-
检查文件:
.env配置(隐藏密码)stock_monitor.db是否存在- 监测股票列表截图
-
描述问题:
- 什么时候开始的?
- 做了什么操作?
- 预期行为 vs 实际行为