277 lines
6.6 KiB
Markdown
277 lines
6.6 KiB
Markdown
# 通知问题排查指南
|
||
|
||
## 问题现象
|
||
监测股票到价格了,但没有收到消息(包括网页和邮件)
|
||
|
||
## 快速诊断
|
||
|
||
### 步骤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 实际行为
|
||
|