news 2026/10/10 2:39:32

图文并茂手把手教你使用Claude Code 配置定时任务以及自动发邮件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
图文并茂手把手教你使用Claude Code 配置定时任务以及自动发邮件

1. 为什么我要把 Claude Code 接到定时任务和邮件通知上

Claude Code 本身是个交互式命令行工具,你敲一句它答一句。但真实工作里,很多事是「每天固定时间跑一次,跑完把结果发我邮箱」——比如每天早上九点把前一天仓库里的代码改动拉出来,分析涉及的功能场景、影响范围,整理成一份报告发到邮箱。这种需求靠手动敲命令不现实,必须让 Claude Code 跑在无人值守的定时任务里,并且把结果通过 SMTP 邮件推出来。

这篇就按这个场景走一遍:用 Claude Code 写一个定时任务脚本,用 SMTP 授权码打通邮件发送链路,覆盖任务触发、失败重试和日志排查。核心检索词是 Claude Code 定时任务与自动发邮件,适合已经装好 Claude Code、想把它从「聊天工具」变成「自动化助手」的开发者。整套流程在本地就能跑通,不需要额外服务器。

先说清楚整体链路,避免你中途迷路。定时任务由系统调度器(Linux 的 cron 或 macOS 的 launchd)负责触发;触发后执行一个 shell 脚本,脚本里调用 Claude Code 的非交互模式生成报告文本;报告文本再交给一个发信脚本,通过 SMTP 授权码登录邮箱服务器投递。三个环节各自独立,任何一环出问题都能单独排查,这也是我推荐的结构。

为什么不用 Claude Code 直接「连上邮箱」?因为它本质是模型对话工具,不负责网络投递。邮件投递交给成熟的 SMTP 客户端(Python 的 smtplib 或系统 mail 命令)更稳,授权码只存在环境变量里,不写进代码。这样职责清晰:Claude Code 管内容生成,SMTP 管送达,调度器管时间。

下面从环境准备开始,一步步把这条链路搭起来。每一步都给可复制的命令和配置,你照着改路径和邮箱就能用。

2. 前置准备:TaoToken 接入 Claude Code 与 SMTP 授权码获取

2.1 用 TaoToken 给 Claude Code 提供模型能力

Claude Code 要生成报告,背后得有模型。我这边是通过 TaoToken 接入的,它的 API 地址是 https://taotoken.net/api,兼容 Anthropic 的接口格式,Claude Code 可以直接指过去。先去控制台建一个 API Key,地址在 https://taotoken.net/api-keys ,建好后复制出来,形如sk-开头的一串。

拿到 Key 之后,配置 Claude Code 的环境变量。Claude Code 读取ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY两个变量,把它写进 shell 配置文件,比如~/.bashrc或~/.zshrc:

export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="sk-你的Key"

改完执行source ~/.zshrc让它生效。注意这里 Base URL 只写到/api,不要自己加/v1之类的后缀,Claude Code 会按 Anthropic 的路径规则拼接。如果你用的是 Codex 或 Cline 这类工具,配置项名称不同但三件套是一样的:Base URL、API Key、Model ID。Model ID 填你账号下可用的模型名,比如claude-sonnet-4-5这类,具体以控制台模型列表为准。

验证模型通不通,最直接的办法是跑一次非交互调用:

claude -p "用一句话说明什么是定时任务"

如果返回一句正常的中文说明,说明模型链路通了。如果报 401,多半是 Key 错了或没生效;如果报连接失败,检查 Base URL 有没有写错。这一步先跑通,后面定时任务才有意义。

2.2 获取 QQ 邮箱 SMTP 授权码

邮件发送不能用登录密码,要用授权码。以 QQ 邮箱为例,登录网页版后点右上角头像,进「账号与安全」,找到「POP3/IMAP/SMTP/Exchange/CardDAV 服务」,开启 SMTP 服务。开启过程中会让你验证身份,然后生成一串授权码,复制保存好,它只显示一次。

QQ 邮箱的 SMTP 参数固定:服务器smtp.qq.com,端口 587 走 STARTTLS 加密,发件邮箱就是你的 QQ 邮箱地址,密码位置填授权码而不是登录密码。这几个参数后面写进脚本,别搞混。

授权码属于敏感信息,不要硬编码进脚本提交到仓库。我的做法是写进一个只有自己能读的环境文件,比如~/.mail_env,权限设成 600:

cat > ~/.mail_env <<'EOF' export SMTP_HOST="smtp.qq.com" export SMTP_PORT="587" export SMTP_USER="你的QQ邮箱@qq.com" export SMTP_PASS="你的授权码" export MAIL_TO="收件邮箱@example.com" EOF chmod 600 ~/.mail_env

这样脚本里source ~/.mail_env就能拿到变量,代码里看不到明文。定时任务执行时也会加载这个文件,保证无人值守时变量也在。

3. 可复制配置:定时任务脚本与 SMTP 发信脚本

3.1 写发信脚本 send_mail.py

先写邮件发送部分,用 Python 标准库 smtplib,不装额外依赖。新建~/claude-jobs/send_mail.py:

import os import smtplib import sys from email.mime.text import MIMEText from email.header import Header def send(subject, body): host = os.environ["SMTP_HOST"] port = int(os.environ["SMTP_PORT"]) user = os.environ["SMTP_USER"] password = os.environ["SMTP_PASS"] to_addr = os.environ["MAIL_TO"] msg = MIMEText(body, "plain", "utf-8") msg["Subject"] = Header(subject, "utf-8") msg["From"] = user msg["To"] = to_addr with smtplib.SMTP(host, port, timeout=30) as server: server.starttls() server.login(user, password) server.sendmail(user, [to_addr], msg.as_string()) if __name__ == "__main__": subject = sys.argv[1] if len(sys.argv) > 1 else "Claude Code 报告" body = sys.stdin.read() send(subject, body) print("mail sent")

这个脚本从环境变量读配置,正文从标准输入读,方便管道拼接。端口 587 配starttls(),这是 QQ 邮箱要求的加密方式。超时设 30 秒,避免网络卡住时任务一直挂着。

3.2 写报告生成脚本 daily_report.sh

这个脚本负责调用 Claude Code 生成报告,再管道给发信脚本。新建~/claude-jobs/daily_report.sh:

#!/bin/bash set -euo pipefail source ~/.mail_env source ~/.zshrc 2>/dev/null || true REPO_DIR="$HOME/projects/myapp" LOG_DIR="$HOME/claude-jobs/logs" mkdir -p "$LOG_DIR" LOG_FILE="$LOG_DIR/report-$(date +%Y%m%d).log" cd "$REPO_DIR" PROMPT="分析 git 仓库中最近 24 小时的代码改动,按功能场景、影响程度两个维度输出一份中文报告,控制在 500 字以内。" REPORT=$(claude -p "$PROMPT" 2>>"$LOG_FILE") if [ -z "$REPORT" ]; then echo "$(date) 报告为空,跳过发送" >> "$LOG_FILE" exit 1 fi echo "$REPORT" | python3 "$HOME/claude-jobs/send_mail.py" "每日代码改动报告 $(date +%F)" >> "$LOG_FILE" 2>&1 echo "$(date) 发送完成" >> "$LOG_FILE"

几个关键点。set -euo pipefail让脚本遇到错误立即退出,避免半途失败还继续发空邮件。source ~/.mail_env加载邮箱变量,source ~/.zshrc加载 Claude Code 的环境变量——注意 cron 环境很干净,不会自动读你的 shell 配置,所以必须显式 source。日志按日期落盘,方便回溯。

3.3 配置 cron 定时触发

给脚本加执行权限,然后写进 crontab:

chmod +x ~/claude-jobs/daily_report.sh crontab -e

在打开的编辑器里加一行,表示每天早上九点执行:

0 9 * * * /bin/bash /Users/你的用户名/claude-jobs/daily_report.sh

cron 的五个字段分别是分、时、日、月、周,0 9 * * *就是每天 09:00。路径一定写绝对路径,cron 不认~。macOS 上如果 cron 权限受限,可以用 launchd 的 plist,但 cron 更简单,先跑通再说。

如果你在 macOS 上遇到 cron 不执行,检查「系统设置 → 隐私与安全性 → 完全磁盘访问权限」,把/usr/sbin/cron加进去,否则它读不了你的项目目录。

4. 验证请求:手动触发一次并确认邮件送达

配置写完别急着等第二天九点,先手动跑一次确认链路通。执行:

source ~/.mail_env bash ~/claude-jobs/daily_report.sh

如果一切正常,终端会打印mail sent,日志文件里能看到「发送完成」。去收件箱看,应该收到一封标题带当天日期的报告邮件。这一步是整个流程的验收点,跑通了再交给 cron。

想单独验证发信脚本,不依赖 Claude Code,可以手动喂一段正文:

echo "这是一封测试邮件" | python3 ~/claude-jobs/send_mail.py "SMTP 测试"

收到就说明 SMTP 授权码、端口、加密方式都对。这一步能把「模型问题」和「邮件问题」分开,排查时特别有用。

验证 Claude Code 非交互模式是否正常,单独跑:

claude -p "输出今天的日期"

如果这条命令在 cron 里失败但在终端成功,八成是环境变量没加载,回到 3.2 检查 source 那两行。

确认无误后,可以临时把 cron 改成几分钟后触发一次,观察日志和收件箱,确认无人值守路径也通。比如当前是 14:20,就写22 14 * * *,等两分钟看结果。验证完再改回九点。

5. 常见报错排查:401、local proxy failed、reading choices 与 OAuth

实际跑下来,报错集中在几个地方,我按真实遇到的顺序列一下。

401 Unauthorized。这是模型侧最常见的。原因通常是ANTHROPIC_API_KEY没生效或写错。cron 环境不读.zshrc,所以脚本里必须显式 source。另一个坑是 Key 前后带了空格或换行,复制时容易带上。检查办法是在脚本里加一行echo "${ANTHROPIC_API_KEY:0:8}"看前缀对不对。如果用的是 TaoToken 的 Key,确认 Base URL 是https://taotoken.net/api,别多加路径。

local proxy failed / connection refused。这个报错说明 Claude Code 尝试连的地址不通。先确认ANTHROPIC_BASE_URL拼写正确,再确认本机网络能访问该地址。如果你本地配了什么网络工具,先关掉再试,避免干扰。这个错误和模型无关,纯粹是网络层。

reading choices 相关报错。这类通常出现在接口返回格式不符合预期时,比如 Base URL 指到了不兼容的端点,返回的不是 Anthropic 格式的 JSON。解决办法是确认端点兼容 Anthropic Messages API,TaoToken 的/api是兼容的。如果自己改过路径,改回来。

OAuth 相关报错。Claude Code 某些版本会尝试 OAuth 登录流程,在非交互环境下会卡住或报错。解决办法是确保用 API Key 模式而不是 OAuth 模式,环境变量设了ANTHROPIC_API_KEY后一般会走 Key 认证。如果还报 OAuth,检查有没有残留的登录态文件,清掉再试。

邮件侧报错。SMTPAuthenticationError说明授权码错了,重新生成一个。SMTPConnectError说明端口或服务器不对,QQ 邮箱是smtp.qq.com:587。SMTPServerDisconnected多半是没调starttls(),检查发信脚本里那行在不在。邮件进了垃圾箱的话,把发件人加进白名单。

cron 不执行。先看日志文件有没有新内容,没内容说明脚本根本没被触发。检查 crontab 路径是不是绝对路径,检查 cron 服务有没有跑,macOS 上还要看磁盘访问权限。可以在 crontab 里加一行* * * * * date >> /tmp/cron-test.log测试 cron 本身是否工作。

排查的核心思路是分层:先确认模型能单独跑通,再确认邮件能单独发出,最后确认 cron 能触发脚本。三层都单独验证过,组合起来就不会有大问题。日志一定要留,出问题时日志是唯一线索。

6. 把这条链路用起来:接入文档与长期方案

链路跑通后,你可以按需扩展。比如把报告改成 HTML 格式,发信脚本里把MIMEText(body, "plain", "utf-8")换成"html";比如加失败重试,在daily_report.sh里包一层循环,失败后隔几分钟重试两次;比如把报告同时存一份到对象存储做归档。

模型侧如果要做更复杂的 Agent 任务,比如让 Claude Code 自己读多个仓库、跑测试、生成多份报告,可以考虑用 Coding Plan 这类长期方案,额度更稳,适合天天跑的任务。接入细节和参数说明在接入文档里有,地址是 https://taotoken.net/doc 。需要调试模型输出、对比不同提示词效果时,用模型对话页面手动试几轮,地址是 https://taotoken.net/chat ,确认提示词稳定了再写进脚本。

API Key 的管理在控制台,地址是 https://taotoken.net/console ,可以建多个 Key 分别给不同任务用,方便轮换和吊销。如果你用 Claude Code 的 Anthropic 兼容模式,专门的说明页在 https://taotoken.net/claude-code ,里面有环境变量和配置文件的完整写法。

最后提醒一句,定时任务里的提示词要写得足够明确,因为无人值守时没人给它补充上下文。把「分析什么、按什么维度、输出多长、什么格式」都写进 prompt,报告质量会稳定很多。我一般会把提示词单独存成一个文件,脚本里读文件内容传给claude -p,改起来不用动脚本。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 2:36:28

每周一道 Agent 面试题 - Top K 怎么设

每周一道 Agent 面试题 - Top K 怎么设 面试官问&#xff1a;你们 Agent 的 RAG 检索&#xff0c;Top K 是怎么定的&#xff1f; 这是 RAG 类问题里出现频率最高的一道&#xff0c;而且它有一个陷阱属性&#xff1a;看起来人人都能答两句&#xff0c;所以答得好坏的差距会被放得…

作者头像 李华
网站建设 2026/10/10 2:36:01

绘图机器题解:四语言实现坐标模拟与线段去重

最近刷到一套新卷的 100 分题&#xff0c;题名叫“绘图机器”&#xff0c;要求用 Java、JS、Python、C 四门语言分别实现。这题我在本地从建模到测试完整过了一遍&#xff0c;踩了不少坑&#xff0c;尤其是用不同语言重写同一套逻辑时&#xff0c;细节差异比想象中大得多。写这…

作者头像 李华