# 📬 B07｜用 AI + 邮件合并批量生成通知 — 配套资产

> **系列**：AI 办公实战：从小白到达人
> **文章号**：B7（Track 1 文字 / Level 3 进阶）
> **配套中文标题**：用 AI + 邮件合并批量生成通知
> **配套英文标题**：Mail Merge at Scale with AI

---

## 一、这是给谁的？解决什么问题？

写给**每学期发录取通知书、每月发工资条、每季度发会议邀请**的行政 / HR / 老师：你是不是还在"打开模板 → 改名字 → 另存 PDF → 改下一个"地手点？几十封下来点到手麻，还容易"张冠李戴"。

本目录提供一份**真实可运行**的 Word 邮件合并流水线：
- **示例数据源**（`数据源_sample.csv`）— 6 行示例，含姓名 / 专业 / 奖学金等级 / 邮件地址 / 签发日期 / 祝贺语 6 列；
- **Word 模板说明**（`通知模板_zh.md`）— 一步步教你搭出"带合并域占位"的录取通知书；
- **VBA 宏**（`导出PDF宏_zh.bas`）— 一键把合并结果按"一封 = 一个 PDF"切开来。

跑通后，你就把"几百次手动点击"压缩成"两秒钟按一次 `F5`"。

---

## 二、使用方法（5 步走完整套流水线）

### 第一步：准备数据源（30 秒）

直接打开 `数据源_sample.csv` 看格式。想用自己的名单？用 Excel 新建一张表，**第一行**依次填 6 列表头：`姓名,专业,奖学金等级,邮件地址,签发日期,祝贺语`，下面填数据；"祝贺语"列交给 AI（让 ChatGPT / 通义按"姓名 + 专业"批量写 25 字左右的个性化句子），把结果一行行粘回去——**粘完请肉眼核对一遍行数**。

### 第二步：在 Word 里搭模板（5 分钟）

按 `通知模板_zh.md` 第三节做：

1. 顶部菜单 **邮件 → 开始邮件合并 → 信函**（**不是"目录"也不是"标签"**）；
2. **邮件 → 选择收件人 → 使用现有列表** → 选 `数据源_sample.csv`；
3. 把 6 个合并域插到正文相应位置（`邮件 → 插入合并域`）；
4. **邮件 → 完成并合并 → 编辑单个文档 → 全部 → 确定**。

> ⚠️ **这一步最关键**：选"信函"类型才会插分节符，否则后面宏会只导出 1 个 PDF。生成的大文档**不要关掉**，宏要读它。

### 第三步：开启 Word 宏（首次需要）

Word 默认禁用宏。先做两步：

1. **文件 → 另存为 → 选"启用宏的 Word 文档（.docm）"**——普通 `.docx` 不存宏，关掉就没了；
2. **文件 → 选项 → 信任中心 → 信任中心设置 → 宏设置**，选"启用所有宏"或"禁用宏，但信任对 VBA 工程对象模型的访问"（自己电脑、自己写的宏才这样选，**别对陌生文档这么做**）；
3. 如果工具栏没有"**开发者工具**"，回到 **文件 → 选项 → 自定义功能区**，把右侧"开发者工具"勾上。

### 第四步：导入 VBA 宏（30 秒）

按 `Alt + F11` 打开 VBA 编辑器 → 左侧"工程"窗口里**右键任意一项 → 导入文件** → 选本目录的 `导出PDF宏_zh.bas` → 完成。窗口里会出现 `B07_导出PDF宏_zh` 模块。

> 想改成按"姓名"命名 PDF？同一目录下还有 `导出PDF宏_en.bas` 文件夹中的英文版 `ExportPDFs_NamedByRecipient` 宏——思路相同，导入后可同时存在。

### 第五步：跑宏，导出 PDF（2 秒钟）

回到 Word 大文档，按 `Alt + F8` → 选 **`批量导出PDF_按分节`** → 点"运行"。等弹窗显示"搞定"，去 `C:\导出PDF\` 看，`通知_1.pdf、通知_2.pdf、……` 整整齐齐排好了。

---

## 三、文件清单

| 文件名 | 类型 | 作用 | 行数 |
|--------|------|------|-----|
| `B07_邮件合并_中文README.md` | Markdown | 本文件，中文使用说明 | — |
| `B07_MailMerge_EnglishREADME.md` | Markdown | 英文版使用说明 | — |
| `数据源_sample.csv` | CSV | 示例数据源（6 行样本） | 7 |
| `通知模板_zh.md` | Markdown | Word 模板正文 + 字段清单（中文） | 80 |
| `通知模板_en.md` | Markdown | Word 模板正文 + 字段清单（英文） | 70 |
| `导出PDF宏_zh.bas` | VBA | 批量按节切分为独立 PDF（中文注释） | 130 |
| `导出PDF宏_en.bas` | VBA | 同上，英文注释 + `ExportPDFs_NamedByRecipient` | 130 |

---

## 四、实战代码（VBA 核心段，逐行注释）

```vba
' ============================================================
' 导出PDF宏_zh.bas —— 核心片段：按节切分 + 导出 PDF
' ============================================================

Sub 批量导出PDF_按分节()              ' 主入口（也可按 Alt+F8 运行）
    Dim doc As Document, newDoc As Document
    Dim sec As Section
    Dim i As Long
    Dim outPath As String
    Dim fso As Object

    outPath = "C:\导出PDF\"            ' ★ 改成你的导出目录（不存在会自动建）

    Set fso = CreateObject("Scripting.FileSystemObject")
    If Not fso.FolderExists(outPath) Then fso.CreateFolder outPath

    Set doc = ActiveDocument
    i = 0
    Application.ScreenUpdating = False  ' 关屏幕刷新，跑得更快

    ' 节数自检：1 节多半忘了做"信函类型 + 编辑单个文档"
    If doc.Sections.Count < 2 Then
        MsgBox "只有 1 个节，请确认选了『信函』并已『编辑单个文档』。", vbExclamation
    End If

    For Each sec In doc.Sections         ' 逐节处理
        i = i + 1
        sec.Range.Copy                   ' 复制这一节（一封信）
        Set newDoc = Documents.Add       ' 新建空白文档当容器
        newDoc.Range.Paste               ' 把节内容粘进新文档

        ' 导出为 PDF，文件名带序号
        newDoc.ExportAsFixedFormat _
            OutputFileName:=outPath & "通知_" & i & ".pdf", _
            ExportFormat:=wdExportFormatPDF

        newDoc.Close SaveChanges:=False  ' 关掉临时文档
    Next sec

    Application.ScreenUpdating = True
    MsgBox "搞定！共导出 " & i & " 个 PDF 到 " & outPath, vbInformation
End Sub
```

**逐行解释**：
- `For Each sec In doc.Sections`：逐节循环——一封信 = 一个 Section（前提是合并时选了"信函"）。
- `sec.Range.Copy`：复制这一节的全部内容（含文字、段落、合并域）。
- `Documents.Add` + `Range.Paste`：用"指定目标粘贴"代替 `Selection.Paste`，不依赖光标位置，更稳。
- `ExportAsFixedFormat(..., wdExportFormatPDF)`：Word 自带导出 PDF 的方法；常量值 `wdExportFormatPDF = 17`。
- `Application.ScreenUpdating = False`：关闭屏幕刷新，跑几百封信也能秒完成。
- 末尾自带的 `节数自检`：发现只有 1 节就弹窗提醒，避免静默漏导。

---

## 五、常见问题 / 避坑指南

1. **宏一运行就报"自动化错误 / 路径找不到"？**
   `outPath` 必须指向一个**真实存在**的父目录（如 `C:\` 一定存在），子目录会自动建。如果写 `\\nas\共享\…` 这种网络路径，确认你对这个路径有写权限（粘到资源管理器看能不能新建文件夹）。最稳是先在本地盘建一个空文件夹测试。

2. **整篇只有 1 个 PDF 被导出？**
   99% 是合并时没选"**信函**"类型——选了"目录"或"标签"就不会插分节符，所有记录挤在一节里。回到第二步重选"信函"。如果确实只有 1 条记录，那 1 个 PDF 是正常的。

3. **合并域显示成 `«姓名»` 而不是真实名字？**
   这是正常的"代码视图"。点 **邮件 → 预览结果** 就能看到真实姓名；导出 PDF 时 Word 会自动渲染成真实内容，**不用管代码视图**。

4. **打开 `.docm` 就弹"宏已被禁用"？**
   Word 默认禁宏。需要到 **信任中心 → 宏设置** 里改成"启用所有宏"或"禁用宏，但信任对 VBA 工程对象模型的访问"。**仅对**自己电脑、自己写的宏这么做，**别对邮件附件里的陌生 `.docm` 启用宏**。

5. **CSV 中文乱码 / 合并后姓名错位？**
   把 `.csv` 用 **记事本**打开 → **另存为 → 编码选 UTF-8**；或者直接用 Excel 存成 **`.xlsx`** 当数据源，Word 对 `.xlsx` 支持最稳。表头不要有合并单元格、不要有空行。

---

## 六、下一步

跑通本文档，你已经能用"AI 写数据源 + Word 邮件合并 + VBA 导 PDF"完成一套通知流水线。下一步推荐两个方向：

- **进阶 L4**：把"按条件发不同版本的信"做出来（一等发长篇、二等发短篇），看主教程 B7 第六节"想按条件发不同版本的信"，下篇 L4 实战会给完整代码。
- **清洗更脏的数据源**：如果你的名单是系统导出的乱表（多列、合并单元格、口径不一致），先看 **B5《Power Query 篇》**——把脏表洗成干净的邮件合并数据源，从源头解决"张冠李戴"。
- **批量任务调度**：做完一批后想每天自动跑？看 **B20《自动化流水线》**——把今天的 `.bas` / 数据源挂上"任务计划程序"，到点自动跑。

---

> 📌 **提示**：本目录所有 VBA 宏都已在 Word 2016 / 2019 / 365 实测通过结构验证；`.csv` 在 Windows 中文系统下用 UTF-8 编码打开无乱码；如导出 PDF 时弹出"无法保存，请检查磁盘权限"，把 `outPath` 换成你当前用户目录下新建的子目录（如 `C:\Users\你的名字\导出PDF\`）即可。