📋 系统概览
本系统通过 Claude Code Hooks 实现了对关键事件的实时邮件通知。当特定事件发生时,系统会自动提取会话上下文,并通过 163 邮箱发送格式化的通知邮件。
Claude Code 事件触发
→
读取会话历史
→
Python 脚本处理
→
SMTP 发送邮件
💡 核心特性:
- ✅ 自动提取会话中的用户和 Claude 消息
- ✅ 支持 5 种不同类型的事件通知
- ✅ 使用 163 邮箱 SMTP 服务发送邮件
- ✅ 包含详细的事件说明和上下文
- ✅ 完整的调试日志系统
📁 配置文件结构
Claude Code 配置目录:
%USERPROFILE%\.claude\
settings.json- Claude Code 主配置文件(包含 hooks 定义)hooks/- Hooks 脚本目录send_email.py- 邮件发送脚本config.json- Hooks 配置文件debug.log- 调试日志
projects/- 项目会话历史存储(用于提取消息)
⚙️ Hooks 配置详解
1. settings.json 配置
位置:%USERPROFILE%\.claude\settings.json
{
"hooks": {
// 通知事件 - 包含两个子类型
"Notification": [
{
"matcher": "permission_prompt", // 权限提示
"hooks": [
{
"type": "command",
"command": "python %USERPROFILE%\\.claude\\hooks\\send_email.py 1"
}
]
},
{
"matcher": "idle_prompt", // 空闲等待
"hooks": [
{
"type": "command",
"command": "python %USERPROFILE%\\.claude\\hooks\\send_email.py 2"
}
]
}
],
// 权限请求事件
"PermissionRequest": [
{
"hooks": [
{
"type": "command",
"command": "python %USERPROFILE%\\.claude\\hooks\\send_email.py 3"
}
]
}
],
// 会话结束事件
"SessionEnd": [
{
"hooks": [
{
"type": "command",
"command": "python %USERPROFILE%\\.claude\\hooks\\send_email.py 4"
}
]
}
],
// 停止事件(包含 prompt hook)
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "python %USERPROFILE%\\.claude\\hooks\\send_email.py 5"
},
{
"type": "prompt", // AI 评估是否应该停止
"prompt": "你正在评估 Claude 是否应该停止工作...",
"timeout": 30
}
]
}
],
// 工具使用后事件(自动格式化代码)
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "prettier --write \"$TOOL_INPUT_file_path\" 2>/dev/null || true"
}
]
}
]
}
}
✓ 配置要点:
- 使用
%USERPROFILE%环境变量确保路径跨用户兼容 - 数字参数(1-5)对应不同的事件类型
- PostToolUse hook 使用 prettier 自动格式化代码
- Stop hook 结合了 command 和 prompt 两种类型
🔔 事件类型详解
| 事件编号 | 事件名称 | 触发时机 | 邮件标题 |
|---|---|---|---|
| 1 | permission_prompt | Claude 请求权限许可时 | 🔔 Claude Code - 权限提示通知 |
| 2 | idle_prompt | Claude 进入空闲等待状态时 | 💤 Claude Code - 空闲等待通知 |
| 3 | permissionrequest | 正式的权限请求流程 | 🔐 Claude Code - 权限请求确认 |
| 4 | sessionend | 会话结束时 | 🏁 Claude Code - 会话已结束 |
| 5 | stop | 任务停止评估时 | 🛑 Claude Code - 任务停止评估 |
事件详细说明
事件 1 🔔 权限提示通知
触发场景: Claude 需要执行某个操作但需要用户许可
典型情况:
- 执行系统命令前需要确认
- 修改重要文件前请求授权
- 访问网络资源前需要许可
- 其他需要用户明确同意的操作
事件 2 💤 空闲等待通知
触发场景: Claude 完成当前任务,等待下一步指示
典型情况:
- 等待用户回答问题
- 需要用户提供更多信息
- 等待用户选择或输入
- 某个长时间操作完成后的等待状态
事件 3 🔐 权限请求确认
触发场景: 正式的权限请求流程
说明: 这是一个更正式的权限请求,需要用户仔细审查并给予明确授权。
事件 4 🏁 会话已结束
触发场景: Claude Code 会话正常结束
说明: 表示本次对话的所有交互已完成,会话历史已保存。
事件 5 🛑 任务停止评估
触发场景: Claude 评估是否应该停止当前工作
评估内容:
- ✓ 用户请求的任务是否已完成
- ✓ 是否存在需要处理的错误
- ✓ 是否有后续工作需要执行
- ✓ 当前工作流是否可以安全结束
💡 特别说明: 此事件同时触发 command hook(发送邮件)和 prompt hook(AI 评估是否应该停止)
📧 邮件发送脚本详解
脚本位置
%USERPROFILE%\.claude\hooks\send_email.py
核心功能
- SMTP 配置 - 使用 163 邮箱发送邮件
- 会话历史提取 - 从 Claude Code 项目会话文件中提取消息
- 事件类型映射 - 将数字参数映射为具体的通知类型
- 邮件内容构建 - 生成包含上下文的格式化邮件
- 调试日志 - 记录执行过程便于排查问题
关键配置
# ===== SMTP 配置 =====
SMTP_SERVER = "smtp.163.com" # SMTP 服务器
SMTP_PORT = 465 # SMTP 端口
FROM_EMAIL = "***@163.com" # 发件人邮箱
SMTP_AUTH_CODE = "***" # 授权码(非邮箱密码)
TO_EMAIL = "***@163.com" # 收件人邮箱
⚠️ 安全提示:
- 授权码需要在 163 邮箱设置中开启 SMTP 服务并获取
- 不要将授权码提交到版本控制系统
- 建议定期更换授权码以确保安全
会话历史提取
脚本会自动从 %USERPROFILE%\.claude\projects\ 目录读取最新的项目会话文件(.jsonl),并提取:
- 最后一条用户消息
- 最后一条 Claude 助手消息
def get_last_user_message():
# 从最近的 Claude Code 会话中获取最后一条用户消息
return get_last_message("user")
def get_last_assistant_message():
# 从最近的 Claude Code 会话中获取最后一条助手消息
return get_last_message("assistant")
✓ 智能过滤: 脚本会自动过滤掉无效消息(如中断请求、工具调用等),只提取有意义的对话内容。
事件类型映射
# 事件类型到邮件主题的映射
SUBJECT_MAP = {
"1": "🔔 Claude Code - 权限提示通知",
"2": "💤 Claude Code - 空闲等待通知",
"3": "🔐 Claude Code - 权限请求确认",
"4": "🏁 Claude Code - 会话已结束",
"5": "🛑 Claude Code - 任务停止评估"
}
# 兼容旧版字符串事件类型
EVENT_TYPE_MAP = {
"permission": "1",
"idle": "2",
"permissionrequest": "3",
"sessionend": "4",
"stop": "5"
}
邮件内容模板
每种事件类型都有专门的内容模板,包含:
- 时间戳
- 用户最后消息(如有)
- Claude 最后回复(如有)
- 事件详细说明
- 后续操作建议
📨 邮件内容示例
示例 1:权限提示通知(事件 1)
时间: 2026-02-05 23:30:15
────────────────────────────
👤 用户最后消息:
帮我创建一个新的 Python 脚本
────────────────────────────
🤖 Claude 最后回复:
好的,我来帮你创建一个 Python 脚本。请告诉我这个脚本的主要功能是什么?
────────────────────────────
📋 事件详情:权限提示
Claude Code 遇到了需要你确认的操作,正在等待你的许可。
这可能包括:
• 执行系统命令
• 修改文件
• 访问网络资源
• 其他需要授权的操作
👉 请打开 Claude Code 终端查看具体请求内容并进行确认。
示例 2:空闲等待通知(事件 2)
时间: 2026-02-05 23:45:30
────────────────────────────
👤 用户最后消息:
优化这个函数的性能
────────────────────────────
🤖 Claude 最后回复:
我已经分析了函数的性能瓶颈。主要问题在于重复计算和缺乏缓存。我建议使用记忆化技术来优化。你希望我直接实现这个优化,还是先看看具体的改进方案?
────────────────────────────
📋 事件详情:空闲提示
Claude Code 已进入空闲等待状态。
可能的原因:
• 等待你回答问题
• 需要你提供下一步的指示
• 等待输入或选择
• 正在等待某个操作完成
👉 请登录 Claude Code 查看当前状态并继续对话。
示例 3:会话结束(事件 4)
时间: 2026-02-06 00:15:20
────────────────────────────
👤 用户最后消息:
好的,今天就到这里
────────────────────────────
🤖 Claude 最后回复:
好的,本次会话到此结束。我已经为你完成了代码优化、文档编写和测试用例编写。所有更改已保存到相应文件中。
────────────────────────────
📋 事件详情:会话结束
Claude Code 当前会话已结束。
会话总结:
• 本次对话的所有交互已完成
• 相关操作和任务已处理
• 会话历史已保存
你可以:
• 开始新的会话
• 查看历史会话记录
• 检查生成的工作成果
👉 感谢使用 Claude Code!
🚀 安装与配置步骤
步骤 1:获取 163 邮箱授权码
- 登录 163 邮箱网页版
- 进入"设置" → "POP3/SMTP/IMAP"
- 开启"POP3/SMTP"服务
- 点击"客户端授权密码",获取授权码
- 保存授权码(不是邮箱登录密码)
步骤 2:配置 Python 环境
# 确认 Python 已安装
python --version
# 安装依赖(如果需要)
# 脚本只使用了标准库,无需额外安装
步骤 3:修改邮件配置
编辑 %USERPROFILE%\.claude\hooks\send_email.py,修改以下配置:
# 修改为你的邮箱配置
FROM_EMAIL = "your-email@163.com" # 你的 163 邮箱
SMTP_AUTH_CODE = "your-auth-code" # 你的授权码
TO_EMAIL = "recipient@163.com" # 收件人邮箱
步骤 4:配置 Claude Code Hooks
编辑 %USERPROFILE%\.claude\settings.json,添加 hooks 配置:
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt",
"hooks": [
{
"type": "command",
"command": "python %USERPROFILE%\\.claude\\hooks\\send_email.py 1"
}
]
}
]
}
}
步骤 5:测试邮件发送
# 直接运行脚本测试
python %USERPROFILE%\.claude\hooks\send_email.py 1
# 检查是否收到测试邮件
步骤 6:查看调试日志
# 日志文件位置
type %USERPROFILE%\.claude\hooks\debug.log
🎨 额外功能:代码自动格式化
除了邮件通知,配置中还包含一个 PostToolUse hook,用于自动格式化代码:
{
"PostToolUse": [
{
"matcher": "Write|Edit", // 匹配 Write 和 Edit 工具
"hooks": [
{
"type": "command",
"command": "prettier --write \"$TOOL_INPUT_file_path\" 2>/dev/null || true"
}
]
}
]
}
✓ 功能说明:
- 当 Claude 使用 Write 或 Edit 工具修改文件后自动触发
- 使用 Prettier 自动格式化代码
2>/dev/null || true确保即使格式化失败也不影响 Claude 继续工作- 需要预先安装 Prettier:
npm install -g prettier
🔧 故障排查
问题 1:没有收到邮件
- 检查 163 邮箱 SMTP 服务是否已开启
- 确认授权码是否正确(不是登录密码)
- 查看调试日志:
%USERPROFILE%\.claude\hooks\debug.log - 确认 Python 路径正确:
where python
问题 2:Hook 未触发
- 确认 settings.json 配置格式正确
- 检查路径中的双反斜杠:
\\ - 确认 Python 脚本有执行权限
- 在 settings.json 中检查
"disableAllHooks": false
问题 3:提取的消息为空
- 确认项目目录下有 .jsonl 会话文件
- 检查消息内容是否被过滤(脚本会过滤过短或无效消息)
- 查看 debug.log 中的错误信息
📊 系统总结
完整工作流程
- Claude Code 事件触发(如权限请求、空闲等待等)
- 执行 Hook 命令:
python send_email.py [事件编号] - 脚本初始化:读取配置、准备日志
- 提取会话上下文:从项目历史中提取最后用户/助手消息
- 构建邮件内容:根据事件类型生成个性化邮件
- 发送邮件:通过 163 SMTP 服务器发送
核心优势
- ✅ 实时通知 - 关键事件立即发送邮件,不会错过重要操作
- ✅ 上下文丰富 - 自动提取会话内容,无需查看终端即可了解情况
- ✅ 智能过滤 - 自动排除无效消息,只提供有价值的信息
- ✅ 易于调试 - 完整的日志系统,问题排查简单快速
- ✅ 可扩展性 - 模块化设计,轻松添加新事件类型
- ✅ 容错机制 - Hook 失败不影响 Claude Code 正常运行
技术栈
| 配置文件 | JSON (Claude Code settings.json) |
| 脚本语言 | Python 3.x (使用标准库) |
| 邮件协议 | SMTP (SMTP_SSL, port 465) |
| 邮件服务 | 163 邮箱 |
| Hook 类型 | command, prompt |
💡 使用建议:
- 定期检查 debug.log 确保 hooks 正常运行
- 根据实际需求调整事件触发频率
- 考虑设置邮件过滤规则,分类管理通知
- 对于高频事件,可以设置冷却期避免垃圾邮件
- 定期更换邮箱授权码以保证安全
⚠️ 注意事项:
- 邮件发送可能有几秒到几十秒的延迟
- 确保网络连接正常,邮件发送需要互联网访问
- 注意邮箱的发送频率限制,避免被标记为垃圾邮件
- 敏感信息(如授权码)不要分享或上传到公开仓库
📖 快速参考
文件位置速查
| Claude Code 配置 | %USERPROFILE%\.claude\settings.json |
| 邮件脚本 | %USERPROFILE%\.claude\hooks\send_email.py |
| 调试日志 | %USERPROFILE%\.claude\hooks\debug.log |
| 会话历史 | %USERPROFILE%\.claude\projects\*\*.jsonl |
事件编号速查
1 |
permission_prompt | 🔔 权限提示通知 |
2 |
idle_prompt | 💤 空闲等待通知 |
3 |
permissionrequest | 🔐 权限请求确认 |
4 |
sessionend | 🏁 会话已结束 |
5 |
stop | 🛑 任务停止评估 |