TL;DR
在 n8n 里搭四个节点:定时触发 → 调本地大模型 → 提取周报 → 发邮件。你只需要每周照常记流水账(放进一个固定文件/便签),周五下班前周报初稿自动出现在邮箱。40 分钟搭好,办公提示词包的周报模板在这里变成无人值守。
准备
| 项目 | 说明 |
|---|---|
| Docker | n8n 推荐自托管方式 |
| 本地 Ollama | 已完成 Ollama 入门,模型 qwen3:8b 可跑 |
| SMTP 邮箱 | 任一邮箱的 SMTP 授权码(QQ/163/Gmail 均可),用于发周报 |
| 流水账来源 | 本教程用”手动粘贴”起步;进阶可改为读笔记 API |
架构一分钟:
每周五 17:00 触发 → HTTP 调本地 Ollama(周报提示词 + 本周流水账)
→ 提取模型输出 → SMTP 发到自己邮箱
全部跑在你电脑/你的服务器上——流水账不出内网。
步骤
启动 n8n:
docker run -d --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n
工作流四节点拆解
- Schedule Trigger:每周五 17:00(
triggerAtDay: [5]) - HTTP Request → Ollama:POST
http://host.docker.internal:11434/api/chat,body 用表达式把 Set 节点里的流水账拼进周报提示词,stream: false - Set:
{{ $json.message.content }}提取模型输出为「周报」字段 - Email Send:主题带日期表达式
周报 {{ $now.format('yyyy-LL-dd') }},正文即周报
提示词里务必保留办公包的量化要求与”推测需标注”条款——定时任务的输出没有人工把关,约束要写死在提示词里。
提示词/配置
HTTP Request 节点的 JSON body(已含周报提示词骨架):
Ollama 请求体
={{ JSON.stringify({ model: "qwen3:8b", stream: false, messages: [{ role: "user", content: "你是资深项目经理,擅长把零散记录提炼成结构化汇报。\n任务:把本周流水账整理成周报,按「进展 / 风险 / 下周计划」三段,进展条目量化(能带数字带数字)。\n输入流水账:" + $json.流水账 + "\n输出:Markdown,三段各 ≤5 条。" }] }) }} | 参数 | 取值 | 说明 |
|---|---|---|
| $json.流水账 | Set 节点字段 | 每周只需更新这一处 |
| stream | false | 定时任务必须关流式,否则拿不到完整 JSON |
成品对照
实测邮件截图与节点运行视图将由实测补充(R-004)。自检标准:连续两周自动收到周报初稿,且格式稳定、无需人工调结构。
常见坑
| 现象 | 原因 | 解法 |
|---|---|---|
| HTTP 节点报 ECONNREFUSED | Docker 里访问不到宿主机 Ollama | URL 用 host.docker.internal,Ollama 监听 0.0.0.0(环境变量 OLLAMA_HOST=0.0.0.0) |
| 响应是 SSE 流不是 JSON | 忘了关流式 | body 里 stream: false |
| 模型输出空/被截断 | 上下文超限 | num_ctx 调到 8192+,或精简流水账 |
| 邮件进垃圾箱 | SMTP 直发信誉低 | 收件人加白名单;或改投递到 Telegram/钉钉 Webhook |
| 定时没触发 | n8n 时区默认 UTC | 工作流 Settings → Timezone 设为 Asia/Shanghai |
| 流水账忘了填 | 人工输入环节不可靠 | 进阶:改为固定路径读文件,或接手机快捷指令追加记录 |
下一步
- 这套思路的提示词底座:办公提效 30 场景提示词包
- 让 agent 直接操作网页填系统:工具雷达之 agent-browser