# 通知问题排查指南 ## 问题现象 监测股票到价格了,但没有收到消息(包括网页和邮件) ## 快速诊断 ### 步骤1:运行诊断工具 ```bash python test_notification_debug.py ``` 这个工具会检查: - ✅ 数据库中的通知记录 - ✅ 邮件配置状态 - ✅ 邮件发送测试 - ✅ 股票价格和触发条件 - ✅ 待发送通知 ### 步骤2:检查常见问题 #### 问题1:价格已不在触发区间 **症状**:股票价格曾经到达过,但现在已经超出区间 **示例**: - 进场区间:44.87 - 46.48 - 当前价格:47.99(已超出) - 结果:不会触发新通知 **解决**: - 查看"通知历史"确认是否之前已触发过 - 如需重新监测,调整进场区间 #### 问题2:60分钟防重复机制 **症状**:价格在区间内,但不发送通知 **原因**:同一触发条件60分钟内只发送一次,避免重复 **查看方法**: ```bash python test_notification_debug.py ``` 会显示:"⚠️ 最近60分钟内已发送过XX通知" **解决**: - 等待60分钟后会自动重新发送 - 或者清空数据库通知记录(会导致历史丢失) #### 问题3:网页通知显示问题 **症状**:有通知但网页看不到 **原因**: 1. 之前的显示逻辑只显示"未发送"的通知 2. 通知发送后被标记为"已发送"就不显示了 **已修复**: - 现在显示所有最近通知(包括已发送和未发送) - 显示发送状态:"✅ 已发送" 或 "⏳ 待发送" #### 问题4:邮件配置问题 **检查清单**: ```env # .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 # 收件邮箱 ``` **测试方法**: 1. 在网页界面:监测管理 → 通知管理 → 发送测试邮件 2. 或运行:`python test_notification_debug.py` **常见错误**: - ❌ 使用邮箱登录密码而非授权码 - ❌ EMAIL_ENABLED 设置为 false - ❌ 端口号不正确(QQ邮箱用587或465) ## 完整排查流程 ### 1. 确认监测服务运行 ``` 网页界面 → 监测管理 查看状态:🟢 运行中 ``` 如果显示"🔴 已停止",点击"▶️ 启动监测" ### 2. 查看通知历史 ``` 网页界面 → 监测管理 → 通知历史 ``` 应该能看到: - 所有触发的通知(新版本已修复) - 每条通知的发送状态 - 触发时间 ### 3. 检查股票状态 运行诊断工具查看详细信息: ```bash 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. 手动测试通知 如果想立即测试通知(不等待价格触发): ```python # 创建测试脚本 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限流 ## 预期效果 当股票价格满足条件时: 1. **数据库记录** ✅ ``` notifications 表中新增记录 sent = FALSE ``` 2. **发送通知** ✅ ``` 调用 notification_service.send_notifications() 尝试发送邮件 标记 sent = TRUE ``` 3. **邮件到达** ✅ ``` 收件箱收到邮件 主题:股票监测提醒 - XXX ``` 4. **网页显示** ✅ ``` 监测管理 → 通知历史 显示:[✅ 已发送] 股票 XXX ... ``` ## 常见场景答疑 ### Q1: 价格到了但没收到通知 **检查**: 1. 是否60分钟内已发送过?→ 查看通知历史 2. 邮件配置是否正确?→ 发送测试邮件 3. 监测服务是否运行?→ 查看状态 4. 通知是否被禁用?→ 检查股票的"通知启用"开关 ### Q2: 测试邮件能收到,但监测邮件收不到 **可能原因**: 1. 触发条件未满足(价格不在区间) 2. 60分钟防重复 3. 监测服务未启动 4. 代码更新前的旧版本问题 **解决**: 1. 运行 `test_notification_debug.py` 全面检查 2. 查看终端日志确认是否真的触发 3. 确保使用的是修复后的代码 ### Q3: 网页看不到通知 **已修复**:旧版本只显示待发送通知,新版本显示所有通知 **刷新界面**:点击"🔄 刷新状态" ### Q4: 想立即重新发送通知 **方法**: 1. 清空通知记录(会丢失历史) 2. 或等待60分钟 3. 或调整价格区间让其重新触发 ## 技术支持 如果问题仍未解决: 1. **提供诊断报告**: ```bash python test_notification_debug.py > diagnosis.txt ``` 2. **提供终端日志**: 复制运行 Streamlit 的终端输出 3. **检查文件**: - `.env` 配置(隐藏密码) - `stock_monitor.db` 是否存在 - 监测股票列表截图 4. **描述问题**: - 什么时候开始的? - 做了什么操作? - 预期行为 vs 实际行为