🤖 Claude Code Hooks 邮件通知工具

基于实际配置的完整教程与实现详解

📋 系统概览

本系统通过 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

核心功能

  1. SMTP 配置 - 使用 163 邮箱发送邮件
  2. 会话历史提取 - 从 Claude Code 项目会话文件中提取消息
  3. 事件类型映射 - 将数字参数映射为具体的通知类型
  4. 邮件内容构建 - 生成包含上下文的格式化邮件
  5. 调试日志 - 记录执行过程便于排查问题

关键配置

# ===== 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)

示例 2:空闲等待通知(事件 2)

示例 3:会话结束(事件 4)

🚀 安装与配置步骤

步骤 1:获取 163 邮箱授权码

  1. 登录 163 邮箱网页版
  2. 进入"设置" → "POP3/SMTP/IMAP"
  3. 开启"POP3/SMTP"服务
  4. 点击"客户端授权密码",获取授权码
  5. 保存授权码(不是邮箱登录密码)

步骤 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 中的错误信息

📊 系统总结

完整工作流程

  1. Claude Code 事件触发(如权限请求、空闲等待等)
  2. 执行 Hook 命令python send_email.py [事件编号]
  3. 脚本初始化:读取配置、准备日志
  4. 提取会话上下文:从项目历史中提取最后用户/助手消息
  5. 构建邮件内容:根据事件类型生成个性化邮件
  6. 发送邮件:通过 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 🛑 任务停止评估