# Report Generator Pro

> 一句话完成日/周/月/季/年报全流程：上传文件或口述工作内容 → AI 抽取整理 → 生成结构化报告 → 导出 Word/Excel/PPT/PDF → HTML 美化邮件发送（内置 15+ 主流邮箱预设，自动识别 SMTP 配置， 支持授权码/应用密码引导）→ Markdown 归档。适用场景：个人日报周报、团队工作汇报、管理层月报季报年报、 项目进度报告。触发词：日报、周报、月报、季报、年报、工作报告、生成报告、发送报告、汇报、report、 工作总结、进度报告、帮我写报告、把报告发给领导。

- Skill: `whyzsm/report-generator-pro` (Agent Skill, multi-file: 14 files)
- Install (CLI): `npx skillmds@latest add whyzsm/report-generator-pro`
- Raw SKILL.md: https://api.skillmd.com/api/skills/whyzsm/report-generator-pro/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: whyzsm (https://skillmd.com/u/whyzsm)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/whyzsm/report-generator-pro

---


# 智能报告生成助手 v3.1

## 新手30秒入门

**这个 Skill 干什么？** 一句话生成报告，一步发送邮件。

**直接复制使用：**
```
"帮我生成今天的日报：完成了用户模块，修复3个BUG，明天写测试"
"生成这周周报，从这份Excel里提取工作内容，用163发给我领导"
"把这份工作记录整理成月报PPT，发给张总zhang@company.com"
"帮我补写昨天的日报，昨天做了：..."
```

**使用前准备**（首次使用才需要）：
1. 告诉我你的姓名和部门（自动记住，以后不用再说）
2. 如果要发邮件，告诉我邮箱地址（会引导你配置SMTP，约2分钟）

---

## 能力边界说明

### ✅ 擅长处理（开箱即用）

| 能力 | 示例 |
|------|------|
| 日报生成 | "生成今天的日报" → 口述或上传工作内容，自动输出结构化日报 |
| 周报生成 | "生成这周周报" → 汇总本周工作，带数据图表 |
| 月/季/年报 | "生成本月月报" → 长篇结构化报告，含趋势分析和总结 |
| 文件解析 | 上传 Word/Excel/PDF → 自动提取工作内容索引 |
| 多格式导出 | 一次生成 Word + Markdown（默认），可选 Excel/PPT/PDF |
| 邮件发送 | 163/QQ/Outlook/Gmail 等 18 种邮箱，自动识别 SMTP 配置 |
| 历史归档 | 所有报告按年月归档，随时查询"上月第三周的周报" |
| 多账户切换 | 同时配置工作邮箱和个人邮箱，根据语境自动选择 |

### ⚠️ 需要素材才能做

| 能力 | 需要的素材 |
|------|----------|
| 生成特定格式报告 | 提供公司模板文件（存入 `templates/custom/`） |
| 发送给多人/群组 | 提供收件人列表（存入 `recipients/xxx.md`） |
| 含图表的 PPT 报告 | 提供原始数据表格（Excel/CSV），AI 自动生成图表 |
| 中英双语报告 | 提供英文翻译参考（部分专业术语需要确认） |

### ❌ 超出范围（附替代方案）

| 需求 | 替代方案 |
|------|----------|
| 创作型文字（如广告文案、新闻稿） | 使用其他写作类 Skill 或直接对话 |
| 数据分析与挖掘（如求增长率、预测） | 单独用 Python 或 Pandas 计算后，把结论喂给本 Skill |
| 飞书/钉钉消息推送 | v3.1 仅支持邮件；v5.0 计划实现；当前可导出文件手动上传 |
| 在线协作文档直出 | 导出 Markdown 后复制到腾讯文档/Notion/语雀 |
| 修改已发出的邮件内容 | 邮件协议不支持撤回/修改，请先确认后再发送 |
| 接收并自动处理他人发来的工作汇报 | 本 Skill 只生成和发送，不处理收件 |

---

## 核心能力

- **全类型报告**：日报 / 周报 / 月报 / 季报 / 年报，自动识别意图
- **多源输入**：口述工作内容 / 上传文件（Word/Excel/PDF/TXT）/ 混合输入
- **多格式导出**：Word（.docx）/ Excel（.xlsx）/ PPT（.pptx）/ PDF / Markdown
- **邮件发送**：内置 18 种主流邮箱 SMTP 预设，自动识别配置，引导授权码
- **持久化归档**：所有报告以 Markdown 存储，支持历史查询和二次编辑

---

## 安全与数据隐私

### 隐私保护原则

1. **不存储明文密码**：邮箱授权码/密码通过 `cryptography.fernet` 加密存储，KEY 文件单独存放于 `config/.fernet_key`
2. **不泄露报告内容**：所有生成的报告保存在本地 `skill_data/` 目录，不自动上传到任何云端
3. **发送前确认**：发送邮件前总会展示收件人和报告摘要，用户确认后才实际发送
4. **收件人级别控制**：根据收件人类型（领导/团队/全员）自动调整报告详细度和保密级别
   - **直属领导**：完整版（含全部数据和分析）
   - **团队成员**：协作版（侧重协作事项和进度同步）
   - **全员公告**：公开版（去除敏感数据和内部评估术语）

### 安全注意事项

- ⚠️ 不要在工作内容中包含核心机密数据（如数据库密码、客户身份证号），这些内容会被写入报告
- ⚠️ 邮箱密码/授权码只在首次配置时输入一次，不要在对话正文中发送密码
- ⚠️ 使用第三方邮箱（Gmail/Outlook）发送时，邮件内容走对应服务商的 SMTP 协议传输
- ⚠️ 如果公司有 DLP（数据防泄漏）策略，请确认发送含工作内容的邮件是否符合合规要求

### 禁止行为

- 🚫 不在未获用户明确指令时主动发送邮件
- 🚫 不伪造发件人身份（From 地址必须与 SMTP 登录账号一致）
- 🚫 不向未验证的地址批量发送邮件（防止被标记为垃圾邮件）
- 🚫 不将用户报告内容用于训练或日志分析之外的任何用途

---

## 触发与意图识别

### 各功能精确触发条件

| 你想要什么 | 怎么触发 | AI 识别逻辑 |
|-----------|---------|------------|
| 生成日报 | 说"日报" / "今天的工作汇报" / "daily report" | 自动取今日日期，生成 300~500 字日报 |
| 生成周报 | 说"周报" / "本周总结" / "weekly report" | 自动取本周一~周日，生成 500~800 字周报 |
| 生成月报 | 说"月报" / "本月报告" / "monthly report" | 自动取本月1日~月末，生成 800~1500 字月报 |
| 生成季报 | 说"季报" / "Q2报告" / "quarterly report" | 自动取本季度范围，生成 1500~2500 字季报 |
| 生成年报 | 说"年报" / "年度总结" / "yearly report" | 自动取本年数据，生成 2000~3500 字年报 |
| 发送邮件 | 说"发给" / "发送给" / "用xx邮箱发" + 收件人 | 进入邮件发送流程，自动匹配 SMTP |
| 从文件生成 | 上传文件 + "帮我写报告" | 先调用 `extract_content.py` 解析，再生成 |
| 补写历史报告 | 说"补写昨天的日报" / "生成上周周报" | 日期自动调整到指定日期 |
| 配置邮箱 | 说"配置邮箱" / "设置发件邮箱" / "添加邮箱" | 进入 `setup_email.py` 交互式向导 |

### 意图识别规则

当用户一句话同时包含多个意图时，按以下优先级处理：
1. 检测报告类型（日/周/月/季/年）
2. 检测输出格式（Word/PPT/Excel/PDF 或默认 Word+Markdown）
3. 检测发送意图（有收件人 → 邮件发送流程）
4. 检测内容来源（文件上传 / 口述 / 两者兼有）
5. 检测特殊操作（补写/配置/查询历史报告）

---

## 运行时行为约束

### 输出准确性规则

- **禁止在不确定领域胡编**：如果工作内容不足，先给出一个"假设示例版本"（标注"以下为示例内容，请确认后替换"），并列出需要补充的具体信息
- **每个关键数据注明来源**：如从文件抽取，标注"数据来源：工作记录.xlsx · Sheet: 本周任务"
- **区分事实和建议**：工作内容是事实（如实呈现），下阶段计划是建议（标注为"拟定计划"）

### 降级与兜底策略

当输入信息不足时，按以下策略降级处理，不挂起也不给空回复：

| 场景 | 降级方式 |
|------|---------|
| 用户说"生成日报"但没给内容 | 回复"请告诉我今天的工作内容（可口述或上传文件），或者我为你生成一个空白模板你先填写？" |
| 文件解析失败 | 先报告"XX 文件解析失败（原因：文件加密/损坏），已跳过。报告基于其余内容生成，缺少的部分已标注"，不中断流程 |
| 缺少邮箱配置 | 自动进入首次配置向导，同时展示当前生成好的报告预览（用户可先看报告，配置完邮箱后再发送） |
| 报告模板文件缺失 | 自动创建默认模板，告知用户"已自动生成默认模板：templates/xxx.md"，不中断生成 |
| 多个功能并行请求 | 按"生成→展示→用户确认→发送"的顺序排队处理，每次只推进一个阶段 |
| 超出范围的能力请求 | 直接给出替代方案（参考"能力边界说明 → ❌超出范围"），不假装自己能做 |
| 网络问题导致发送失败 | 报告已生成并保存，展示本地路径，提示"邮件发送失败但报告已保存，可稍后重新发送或手动发送" |

### 错误提示规范

所有面向用户的错误提示必须满足：
- **不暴露技术细节**：不说 `ImportError: No module named docx`，而说"生成 Word 需要安装依赖，正在自动安装中..."
- **格式为"缺少[具体项]+如何补充"**：不说"参数错误"，而说"缺少收件人邮箱，请提供收件人地址，例如 zhang@company.com"
- **提供下一步操作**：每条错误信息后紧跟一个明确的可执行操作

---

## 主工作流

### 阶段 0：初始化检查

```
检查 skill_data/report_generator/config/user_profile.md 是否存在
├─ 不存在 → 引导用户完成首次配置（姓名/部门/职位/常用收件人）
└─ 存在 → 读取用户档案，个性化报告
```

### 阶段 1：内容输入与抽取

**输入来源处理**：

| 来源 | 处理方式 |
|------|---------|
| 口述文本 | 直接提取工作事项，按优先级归类 |
| .docx / .doc | 调用 `scripts/extract_content.py` 解析正文 |
| .xlsx / .csv | 调用 `scripts/extract_content.py` 读取表格数据 |
| .pdf | 调用 `scripts/extract_content.py` 提取文本 |
| .txt / .md | 直接读取 |
| 混合 | 合并所有来源，去重后归类 |

**抽取结构**（标准化输出）：
```yaml
extracted_content:
  completed_tasks:    # 已完成工作（带成果描述）
  in_progress_tasks:  # 进行中工作（带进度百分比）
  blocked_items:      # 待解决问题/障碍
  key_metrics:        # 关键数据指标
  next_plans:         # 下阶段计划
  highlights:         # 亮点/成就（用于标题摘要）
```

### 阶段 2：报告生成

加载 `references/report_templates.md` 获取模板规范。

**自动填充规则**：
- 标题：`[用户姓名][部门] YYYY年MM月DD日 [报告类型]`
- 周期标注：日报=当日，周报=本周一~周日，月报=本月1日~月末
- 字数控制：日报 300-500 字，周报 500-800 字，月报 800-1500 字，季/年报 1500-3000 字
- 数据亮点：自动加粗关键数字和成果
- 问题标注：用 ⚠️ 标记障碍项

### 阶段 3：文件导出

根据用户指定格式或默认 Word+Markdown 双格式导出：

```
调用 scripts/generate_report.py
  参数: report_type, content_dict, output_format, template_name, output_path
  输出: 生成文件路径列表
```

存储路径：`skill_data/report_generator/reports/YYYY/MM/{report_type}/YYYYMMDD_{report_type}.{ext}`

### 阶段 4：邮件发送（含邮箱配置）

**4.1 读取邮箱配置**：
```
读取 config/email_settings.md
├─ 无配置 → 进入"首次配置向导"（见邮箱配置模块）
├─ 有单账户 → 直接使用
└─ 有多账户 → 根据语境选择（"工作"→company，"个人"→personal）
```

**4.2 SMTP 自动识别**：
```
提取发件邮箱后缀 → 查询 references/smtp_presets.md
├─ 命中预设 → 自动填充 host/port/ssl/auth_type
├─ 腾讯/阿里/网易企业邮箱 → 询问具体服务商
└─ 未命中 → 进入自定义 SMTP 配置
```

**4.3 发送流程**：
```
调用 scripts/send_email.py
  参数: from_account, to, cc, bcc, subject, report_path, html_template
  返回: success/error + 日志写入 logs/email_send_log.md
```

**4.4 失败重试**：自动重试 3 次（2s → 4s → 8s 指数退避），仍失败则保留草稿并告知用户。

### 阶段 5：归档

将最终 Markdown 版报告追加写入 `reports/YYYY/MM/{type}/index.md`（月度汇总索引）。

---

## 邮箱配置模块

### 首次配置向导

```
1. 询问发件邮箱地址
2. 自动识别服务商 → 显示 SMTP 配置（host/port/ssl）
3. 根据 auth_type 给出授权码获取指引（见下表）
4. 测试发送（发至自身验证）
5. 保存至 config/email_settings.md
```

### 授权码获取指引

| 邮箱 | 步骤 |
|------|------|
| 163/126/yeah | 登录网页版 → 设置 → POP3/SMTP/IMAP → 开启 SMTP → 短信验证获取授权码 |
| QQ邮箱 | 登录网页版 → 设置 → 账户 → 开启 IMAP/SMTP → 安全验证生成授权码 |
| Foxmail | 同 QQ邮箱（使用 smtp.qq.com） |
| 腾讯企业邮箱 | 直接使用邮箱登录密码，无需授权码 |
| Outlook/Hotmail | 微软账户 → 安全 → 两步验证 → 应用密码（生成16位密码） |
| Gmail | Google账户 → 安全 → 两步验证 → 应用专用密码（16位，无空格） |
| iCloud | appleid.apple.com → 登录和安全 → 应用专用密码 → 生成密码 |
| 阿里云邮箱 | 邮箱网页版 → 设置 → 客户端授权密码 → 开启并生成 |
| 阿里企业邮箱 | 直接使用邮箱密码 |
| 新浪/搜狐/189/139 | 各自邮箱设置页面开启 SMTP 并生成授权码 |

### 多账户切换规则

| 用户语境 | 选择账户 |
|---------|---------|
| "发给领导"/"工作邮件"/"公司" | company_* 账户 |
| "个人"/"私人" | personal_* 账户 |
| "备用"/"另一个" | backup_* 账户 |
| 无特殊语境 | 使用 is_default: true 的账户 |

---

## 异常处理

| 异常情况 | 处理策略 |
|---------|---------|
| 邮箱后缀未匹配预设 | 提示用户选择"自定义SMTP"，引导填写 host/port/ssl |
| 授权码错误（SMTP 535） | 提示"密码或授权码错误"，显示重新获取授权码的步骤 |
| 网络超时/连接失败 | 重试3次，仍失败则：保存草稿、提示检查网络、询问是否稍后重试 |
| Gmail/iCloud 在国内无法连接 | 提示："Gmail 在中国大陆需配置代理，可切换至其他邮箱发送" |
| 附件超过 20MB | 自动转为本地路径链接，邮件正文末尾添加手动下载说明 |
| 收件人地址格式错误 | 正则校验 `^[\w.+-]+@[\w-]+\.[\w.]+$`，提示修正后重试 |
| SSL 证书错误 | 尝试降级至 STARTTLS，失败则提示用户手动配置 |
| 无工作内容输入 | 提示用户提供今日/本周工作内容，可口述或上传文件 |
| 文件格式不支持 | 列出支持格式（docx/xlsx/pdf/txt/md），提示转换方案 |
| 依赖库缺失 | 自动执行 `pip install -r scripts/requirements.txt`，展示安装进度 |

---

## 文件存储结构

```
skill_data/report_generator/
├── config/
│   ├── user_profile.md          # 用户信息（姓名/部门/职位）
│   ├── email_settings.md        # 多账户邮箱配置（加密密码）
│   └── skill_settings.md        # 全局设置（默认报告类型/格式/语言）
├── templates/
│   ├── daily_default.md         # 日报模板
│   ├── weekly_default.md        # 周报模板
│   ├── monthly_default.md       # 月报模板
│   ├── quarterly_default.md     # 季报模板
│   ├── yearly_default.md        # 年报模板
│   ├── email_html_default.html  # HTML 邮件模板
│   └── custom/                  # 用户自定义模板
├── recipients/
│   ├── leaders.md               # 领导收件人列表
│   ├── team.md                  # 团队成员列表
│   └── all_company.md           # 全公司发送列表
├── reports/
│   └── YYYY/MM/{type}/          # 按年/月/类型归档
├── logs/
│   ├── YYYY-MM-DD_actions.md    # 操作日志
│   └── email_send_log.md        # 邮件发送记录
└── outputs/
    └── YYYY-MM-DD/              # 当日所有导出文件
```

---

## 交互示例

**示例1 - 快速日报**：
> 用户："帮我生成今天的日报：完成了用户模块开发，修复了3个BUG，明天继续写测试用例"
> → AI 自动抽取 → 生成日报 Word 文件 → 询问是否发送

**示例2 - 上传文件生成周报**：
> 用户：上传工作记录.xlsx → "帮我生成本周周报并发给张总"
> → 解析文件 → 生成周报 → 读取收件人配置（张总） → 发送邮件

**示例3 - 首次使用 Gmail**：
> 用户："用我的 Gmail 发送报告"
> → 识别 Gmail → 提示需要应用专用密码 → 给出 Google 账户设置链接和步骤 → 引导输入16位密码 → 测试发送 → 保存配置

**示例4 - 多账户切换**：
> 用户："用工作邮箱发给部门群"
> → 自动选择 company_exmail 账户 → 查询 team.md 获取收件人 → 发送

---

## 调用脚本说明

所有脚本位于 `scripts/` 目录，调用前确认 Python 依赖已安装（见 `scripts/requirements.txt`）：

| 脚本 | 用途 | 关键参数 |
|------|------|---------|
| `extract_content.py` | 从文件抽取工作内容 | `--file <路径> --type <docx/xlsx/pdf/txt>` |
| `generate_report.py` | 生成报告文件 | `--type <日报/周报> --format <word/excel/ppt/pdf> --output <路径>` |
| `send_email.py` | 发送邮件 | `--from <账户名> --to <收件人> --subject <主题> --attach <附件路径>` |
| `setup_email.py` | 邮箱配置向导 | 交互式引导，无需参数 |

---

## FAQ

### Q1：工作内容太少/太杂，AI 帮我总结得不好怎么办？
**答**：垃圾进垃圾出。提供工作内容时尽量包含"具体事项+量化数据+做了什么"。示例对比：
- ❌ "开发了功能"
- ✅ "完成了用户登录模块：实现了手机号+验证码登录，前端 React Hooks，后端 Node.js + Redis，测试覆盖率 90%"

如果实在没时间整理，直接说"先给我一个假设版本"，AI 会填入示例内容并标注待确认。

### Q2：我的公司有固定报告格式，可以适配吗？
**答**：把公司模板 Markdown 文件放入 `templates/custom/` 目录。使用时说"用我的 XX 模板生成周报"。HTML 邮件模板也可自定义（`templates/custom/email_日报.html`）。

### Q3：生成的文件打开乱码怎么办？
**答**：用 WPS 或 Office 2016+ 打开（UTF-8 编码）。Excel 用"数据 → 自文本/CSV → UTF-8"导入。纯文本用 VS Code 查看。

### Q4：能用 QQ 邮箱发送给多人吗？
**答**：可以。说"发给张总和李经理"，用逗号分隔。需要抄送/密送时说"抄送给xx"或"密送给xx"。QQ 邮箱的每日发信限额请参考 QQ 邮箱官方说明。

### Q5：报告自动保存在哪里？能查看上周的报告吗？
**答**：保存在 `skill_data/report_generator/reports/YYYY/MM/{type}/` 目录。说"查看上周的周报"或"打开上个月的月报汇总"，AI 会定位并读取对应文件。

### Q6：可以设置每天自动生成日报吗？
**答**：可以。说"帮我设置每天18:00自动生成日报并发给张总"。WorkBuddy 的自动化机制会在指定时间触发 Skill。

### Q7：如果有多个项目并行，能按项目分别生成报告吗？
**答**：可以。说"按项目分组生成日报"或"单独生成项目A的进度报告"。AI 会从工作内容中识别项目标签并分组输出。

### Q8：手机收邮件排版会很乱吗？
**答**：不会。HTML 邮件模板采用响应式设计，在手机邮件客户端（QQ邮箱APP / 网易邮箱大师 / Gmail APP）上均会自适应缩放到合适的阅读尺寸。

> 更多 FAQ（工具兼容、定制化、故障排查）见 `references/faq-deep.md`

---

## 受众说明

| 用户类型 | 如何使用 |
|---------|---------|
| **个人上班族** | 直接说"生成日报"，口述工作内容即可。默认 Word+Markdown 双格式输出 |
| **团队 Leader** | 使用周报/月报功能汇总团队进展，设置定时发送给上级 |
| **项目经理** | 上传多份工作日志 Excel，批量解析生成汇总报告 |
| **自由职业者** | 配置个人邮箱和签名档，用专业格式向客户汇报进度 |
| **HR/行政** | 生成部门级别周报/月报，汇总考勤、报销、招聘等数据 |

---

## 定制化使用指南

| 定制需求 | 操作方式 |
|---------|---------|
| 修改默认输出格式 | 在 `config/skill_settings.md` 中修改 `default_format: word` |
| 自定义报告署名 | 在 `config/user_profile.md` 中填写 `signature` 字段 |
| 添加公司 Logo | 将 logo 图片放入 `assets/`，在模板中引用 |
| 调整字数阈值 | 在 `config/skill_settings.md` 中修改 `word_count.*` 字段 |
| 常用收件人 | 在 `recipients/leaders.md` 或 `team.md` 中维护人员列表 |
| 固定发送时间 | 通过 WorkBuddy 自动化（automation）设置定时任务 |

---

## 参考资料

- `references/smtp_presets.md`：所有 18 种支持邮箱的 SMTP 完整配置
- `references/report_templates.md`：日/周/月/季/年报的 Markdown 模板规范
- `references/email_html_template.md`：HTML 邮件美化模板说明与 Jinja2 变量表
- `references/anti-patterns.md`：7 种常见错误用法 + 改进对比案例 + 禁忌清单
- `references/faq-deep.md`：18 道深度 FAQ（垂直领域/工具兼容/定制化/安全/故障排查）
- `scripts/requirements.txt`：Python 依赖清单（含可选依赖标注）
- `assets/email_html_default.html`：响应式 HTML 邮件默认模板

