# CHO CLAUDE ĐỌC: Bước 18. Máy gửi thư nuôi

> Tài liệu này viết cho Claude Code của học viên. Người học chỉ cần dán câu lệnh bên dưới vào Claude, Claude đọc file này rồi làm.
> Thuộc hệ thống triển khai AI 20 bước của Trương Minh Kiên. Trang bước này: https://trienkhaithunuoi.truongminhkien.vn

## Việc cần làm

Mỗi sáng đọc Base Lead, gửi đúng lá thư đến hạn qua hộp thư Lark của bạn. Bước này là khung, chưa chạy thật.

Câu lệnh học viên dán vào Claude:

```
Tải gói https://trienkhaithunuoi.truongminhkien.vn/may-gui-thu-nuoi.zip, giải nén, đọc CHO-CLAUDE-DOC.md rồi dựng máy gửi thư nuôi: chuỗi 3 thư ngày 1, 3, 7 cho lead đã để lại email, chạy thử chỉ với email của tôi
```

## Luật khi làm

1. Đọc hết file này, kể cả phần bẫy, trước khi chạy lệnh nào.
2. Việc cần mật khẩu, mã OTP, token hay thanh toán thì dừng lại để học viên tự làm, không nhập hộ.
3. Không xoá dữ liệu, bản ghi DNS hay file cũ của học viên. Chỉ thêm.
4. Khoá bí mật chỉ nằm trong `.env` (đã có trong `.gitignore`), không ghi vào mã, wiki hay kết quả.
5. Xong mỗi bước thì kiểm tra thật (chạy thử, đọc lại) rồi mới báo xong.
6. Gói này chạy trên máy của học viên, không phải máy người soạn. Mọi đường dẫn tính từ thư mục giải nén hoặc thư mục vault của học viên; hỏi học viên nếu cần. Skill nào nhắc tới file `output/...` hay trang `wiki/...` mà vault học viên chưa có thì đó chỉ là nguồn tham khảo của người soạn: bỏ qua, dùng nội dung ngay trong skill. Riêng `wiki/concepts/bo-mau-thuong-hieu.md`: nếu chưa có, chép từ `mau/bo-mau-thuong-hieu.md` trong gói rồi hỏi học viên để điền.

## Skill trong gói

- `lark-base`
- `lark-mail`
- `lark-shared`

Cách cài skill: chép từng thư mục trong `.claude/skills/` của gói vào `.claude/skills/` của vault Obsidian (bước 1). Tên thư mục phải trùng tên skill, file chính tên `SKILL.md`.

## Cách cài đặt từng bước (làm theo thứ tự)

### CHO CLAUDE ĐỌC — cài máy gửi thư nuôi (chuỗi thư tự động từ Lark Base)

> Bạn là Claude Code trên máy một người mới. Họ vừa dán: *"Đọc repo trên rồi cài máy gửi thư nuôi,
> nối vào Lark Base Lead, viết cho tôi chuỗi 5 lá thư đầu và đặt lịch chạy hằng ngày"*.
> Kết quả cuối: mỗi sáng 8h, máy đọc bảng Lead, gửi **đúng một lá đến hạn** cho mỗi người qua hộp
> thư Lark của họ, ghi lại đã gửi lá nào. Tiếng Việt, mỗi lượt một việc.

## Máy này làm gì — và bốn luật nó tự giữ

Đọc `gui-thu-nuoi.py` phần đầu. Tóm tắt: đọc bảng **thư** (mỗi dòng = một lá: Ngày thứ mấy, Tiêu
đề, Nội dung HTML) và bảng **lead** (ai đăng ký ngày nào, nhận quà gì, đã gửi lá nào). Với mỗi
người, tính "tuổi" = số ngày từ khi đăng ký, tìm lá đến hạn chưa gửi, gửi **một** lá, ghi sổ.

1. Mỗi người **một lá mỗi lần chạy**, và **tối đa một thư một ngày** dù chạy lại bao nhiêu lần.
2. Còn dấu `{biến}` chưa thay → không gửi lá đó.
3. Nhãn quà không có trong `qua_tang` → không gửi.
4. Đường tải quà phải trả `Content-Type` PDF thật — **không tin mã 200** (Cloudflare Pages trả 200
   cho cả địa chỉ không tồn tại).

**Mặc định là chạy thử.** Không có `--that` thì không thư nào rời máy.

## 0. Kiểm trước

| Cần | Kiểm | Thiếu thì |
|---|---|---|
| Python 3.10+ | `python --version` | cài python.org, tick *Add to PATH* |
| lark-cli đã đăng nhập user, có quyền `mail` + `base` | `lark-cli auth status --json` | `lark-cli auth login --domain mail,base` (theo gói tro-ly-lark) |
| Hộp thư gửi trên Lark (hộp cá nhân hoặc hộp công khai theo tên miền) | `lark-cli mail user_mailboxes accessible_mailboxes --user-mailbox-id me --as user` → có địa chỉ | làm gói mail-ten-mien trước |
| Base Lead đã có | link Base | làm gói tro-ly-lark trước |

## 1. Chuẩn bị hai bảng trong Base Lead

**Bảng lead** cần thêm hai cột (nếu chưa có): `Chăm sóc email` (text) và `Ngày chăm sóc` (text).
Cột nhận diện quà: dùng cột `Nguồn` (hoặc cột nào ghi người đó đăng ký quà gì). Kiểm tên cột thật
bằng `lark-cli base +field-list --base-token … --table-id …` rồi điền đúng vào `cot` trong cấu hình —
**sai một dấu là máy bỏ qua tất cả**.

**Bảng thư** tạo mới trong cùng Base: `lark-cli base +table-create --as user --base-token <app_token> --name "Thư nuôi" --fields '[{"name":"Ngày","type":"number"},{"name":"Tiêu đề","type":"text"},{"name":"Nội dung (HTML)","type":"text"}]'`.

## 2. Viết 5 lá thư cùng người dùng

Hỏi: họ bán gì, khách là ai, quà 0đ là gì (tên + link PDF). Rồi viết 5 lá theo nhịp **ngày 1 · 2 ·
4 · 7 · 14**: (1) giao quà + một việc nhỏ làm ngay · (2) câu chuyện vì sao có quà này · (3) lỗi hay
gặp nhất của khách · (4) một khách đã làm được gì · (5) lời mời bước tiếp (buổi zoom / sản phẩm vào
cửa). Mỗi lá ≤ 350 chữ, HTML đơn giản (`<p>`, `<b>`, `<a>`), dùng đúng các biến:
`{customer_name}` `{ten_qua_tang}` `{link_qua_tang}` `{loi_mo_dau}`. Nút bấm: **chỉ dùng `color`
và viền, không dùng `background`** — Lark cắt `background` (bẫy 1).

Đưa người dùng đọc duyệt **từng lá**. Duyệt xong mới đẩy lên bảng thư bằng `+record-batch-create`.

## 3. Điền cấu hình

Chép `cau-hinh.mau.json` → `cau-hinh.json`, điền: `base_token`, `bang_lead`, `bang_thu`,
`hom_gui`, `email_chu`, `ten_chu`, `ten_mien`, `xung_ho` (anh/chị/thầy cô/bạn), bảng `cot`,
`qua_tang` (khoá = đúng giá trị trong cột nhận diện quà, ví dụ `"Website"`). `profile` để trống
nếu lark-cli chỉ có một hồ sơ. `tep` là đường dẫn tương đối tới PDF trên máy (để đính kèm) — không
có thì bỏ khoá `tep`.

## 4. Chạy thử → xem trước → gửi thật

```
python gui-thu-nuoi.py            # in sẽ gửi cho ai lá nào, và vì sao bỏ qua ai
python gui-thu-nuoi.py --xem      # ghi bản HTML vào xem-truoc/ — mở cho người dùng xem
python gui-thu-nuoi.py --that --chi <email-của-họ> --gui-ca-minh   # gửi thật MỘT thư cho chính họ
```
Người dùng mở hộp thư của mình: thư hiện đúng tên người gửi, đúng chân thư, link tải mở được.

## 5. Đặt lịch 8h sáng hằng ngày

`chay-hang-ngay.cmd` ghi vào `nhat-ky.txt`. Đăng ký Task Scheduler (người dùng đang đăng nhập):
```
schtasks /Create /SC DAILY /ST 08:00 /TN "May gui thu nuoi" /TR "\"<đường dẫn>\chay-hang-ngay.cmd\"" /F
```
**Bẫy 2 (Windows):** token lark-cli đăng nhập từ công cụ của Claude có thể **không tới** Task
Scheduler → task chạy báo hết hạn/thiếu quyền dù chạy tay được. Cách xử: đăng nhập lại bằng một task
tạm chạy `cmd /c lark-cli auth login --domain mail,base > _login.txt`, đưa link trong `_login.txt`
cho người dùng bấm, rồi xoá task tạm. Kiểm bằng `schtasks /Run /TN "May gui thu nuoi"` và đọc
`nhat-ky.txt`.

## 6. Bẫy đã trả giá

| # | Bẫy | Cách xử |
|---|---|---|
| 1 | Lark cắt thuộc tính `background` của nút trong HTML, giữ `color` | Nút = chữ màu + viền; hoặc link thường |
| 2 | Task Scheduler dùng token cũ (registry khác lớp với công cụ của Claude) | Mục 5 |
| 3 | Lá thư hứa tài liệu **không tồn tại** (viết trước, chưa dựng) | Luật 4: máy đo `Content-Type`; và người dùng phải có PDF thật trước khi bật lịch |
| 4 | Chạy lệnh hai lần → người nhận hai thư | Luật "một thư một ngày" đã cài; `--bo-chan-ngay` chỉ khi cố ý |
| 5 | Sai tên cột (thừa dấu cách, khác hoa thường) | `+field-list` rồi copy nguyên văn vào `cot` |
| 6 | `lark-cli` trên Windows là shim `.cmd`, `subprocess` không tự tìm thấy | Script đã xử (`tim_lark`) |
| 7 | `--attach` chỉ nhận đường dẫn **tương đối** trong thư mục hiện hành | Script chép tệp vào `tam/` trước |
| 8 | Người xin ngừng nhận | Gõ `NGUNG` vào cột `Chăm sóc email` của người đó — máy bỏ qua vĩnh viễn |
| 9 | Máy tắt thì thư không đi | Nói rõ với người dùng; muốn 24/7 thì chuyển sang Worker sau |

## 7. Báo cáo cuối (khuôn)

```
✅ Máy gửi thư nuôi: 5 lá (ngày 1·2·4·7·14) đã lên bảng "Thư nuôi"
📬 Gửi từ <hom_gui> · thử thật 1 thư tới <email người dùng>: nhận được ✔
⏰ Task "May gui thu nuoi" 08:00 hằng ngày · nhật ký: nhat-ky.txt
⚠️ Còn: <token task scheduler đã kiểm chưa / PDF quà đã có chưa>
```


## Hướng dẫn chi tiết và các bẫy đã gặp

(Bản đầy đủ có hình và nút bấm: https://trienkhaithunuoi.truongminhkien.vn)

**⚠ Tình trạng bước này:** **chưa chạy thật ở hệ thống của Kiên**. Đây là khung ghép từ các mảnh **đã** chạy thật (Resend gửi thư ebook, Lark Base lưu lead, máy Cloudflare chạy theo lịch, hộp thư tên miền nhận trả lời). Chưa có bẫy "đã gặp thật" của riêng bước này; các bẫy bên dưới là bẫy của từng mảnh đã gặp ở bước khác, ghi lại để bạn không dẫm lại.

Yêu cầu trước khi bắt đầu

- Đã xong [Bước 11: Lead Magnet](https://trienkhaileadmagnet.truongminhkien.vn/) (có Resend và bảng lead trong Lark Base)
- Đã xong [Bước 7: Hộp thư tên miền riêng](https://trienkhaimail.truongminhkien.vn/) và [Bước 6: Tên miền và Cloudflare](https://trienkhaitenmien.truongminhkien.vn/)
- Đã có ít nhất vài lead thật để chạy thử (hoặc dùng chính email của bạn)

## Máy này gồm những mảnh nào

- **Nơi lưu lead**: bảng Lark Base ở [Bước 4](https://trienkhailark.truongminhkien.vn/) (đã có sẵn từ bước Lead Magnet).
- **Người gửi thư**: Resend ([Bước 11](https://trienkhaileadmagnet.truongminhkien.vn/)) hoặc hộp thư tên miền ([Bước 7](https://trienkhaimail.truongminhkien.vn/)).
- **Đồng hồ chạy theo lịch**: máy Cloudflare Workers có lịch chạy (cùng cách [Bước 14](https://trienkhaifb.truongminhkien.vn/) đang đăng Facebook).
- **Nội dung thư**: 3-5 thư viết theo giọng của bạn (nhờ Claude AI, cùng cách viết ở Bước 13).

## Các bước

1

### Thêm 3 cột vào bảng lead trong Lark Base

`Thư đã gửi` (số thứ tự thư gần nhất, ban đầu 0), `Ngày gửi thư tiếp` (ngày giờ cụ thể) và `Trạng thái nuôi` (Đang nuôi / Dừng / Đã mua). Khi 1 lead mới vào bảng, điền ngay "Ngày gửi thư tiếp" (xem bẫy 1).

2

### Viết chuỗi thư, mỗi thư 1 việc

Gợi ý: thư 1 (ngày 1) thêm giá trị và nhắc ebook đã tặng; thư 2 (ngày 3) kể 1 câu chuyện hoặc trường hợp thật; thư 3 (ngày 7) đề nghị nhẹ, không ép. Mỗi thư chỉ 1 đường dẫn để bấm và **luôn có cách huỷ nhận thư**.

3

### Dựng máy chạy theo lịch trên Cloudflare

Mỗi giờ chạy 1 lần: đọc các lead có `Trạng thái nuôi` = Đang nuôi và `Ngày gửi thư tiếp` đã tới hạn, gửi thư số tiếp theo qua Resend, rồi ghi lại `Thư đã gửi` và tính `Ngày gửi thư tiếp` mới. Khoá Resend và mật khẩu ứng dụng Lark **bạn tự dán** làm bí mật của máy Cloudflare, không đưa cho AI.

4

### Chống gửi trùng và chạy thử nhỏ

Ghi trạng thái trước khi gửi (hoặc khoá theo cặp lead + số thư) để 2 lần chạy chồng nhau không gửi đôi; giới hạn số thư mỗi lần chạy; **chạy thử chỉ với email của chính bạn** cho tới khi bạn duyệt nội dung và số lượng.

5

### Huỷ nhận thư và đọc trả lời

Đường dẫn huỷ đặt `Trạng thái nuôi` = Dừng, và máy không bao giờ gửi tiếp cho ai đã Dừng. Khách bấm Trả lời sẽ về hộp thư ở Bước 7.

Câu lệnh — dán vào Claude AI

Sao chép

Dựng cho tôi máy gửi thư nuôi cho những người đã để lại email nhận ebook.\
Dùng lại: bảng lead trong Lark Base của tôi, Resend đã cài ở bước Lead Magnet, máy Cloudflare chạy theo lịch (mỗi giờ).\
1. Thêm 3 cột vào bảng lead: "Thư đã gửi", "Ngày gửi thư tiếp", "Trạng thái nuôi" (Đang nuôi/Dừng/Đã mua).\
2. Hỏi tôi về chủ đề rồi viết cho tôi 3 thư (ngày 1, 3, 7) theo giọng của tôi, mỗi thư chỉ 1 đường dẫn, có cách huỷ nhận thư. Đưa tôi duyệt trước khi dùng.\
3. Viết máy Cloudflare Workers có lịch chạy: mỗi giờ tìm lead đến hạn, gửi đúng thư kế tiếp qua Resend, ghi lại bảng. Ô "Ngày gửi thư tiếp" TRỐNG phải hiểu là chưa đến hạn, không phải gửi ngay. Chống gửi trùng. Giới hạn số thư mỗi lần chạy.\
4. Chạy thử CHỈ với email của tôi. Không gửi cho lead thật cho tới khi tôi nói rõ.\
Khoá Resend và mật khẩu ứng dụng Lark tôi tự dán vào bí mật của máy Cloudflare, bạn không xin và không đọc. Ngôn ngữ: tiếng Việt.

## ⚠ Bẫy đã gặp + cách gỡ

🔴 1. Lead mới bị gửi cả chuỗi thư cùng lúc, hoặc thư 1 bay ngay — vì ô ngày để trống

Đây là lỗi thật nhất của hệ thống đăng Facebook ở Bước 14: bản ghi để trống "Ngày giờ đăng" bị coi là "đăng ngay lập tức", không chờ. Máy nuôi thư cùng kiểu nên dễ dính lỗi giống hệt: ô "Ngày gửi thư tiếp" trống mà code hiểu là "đến hạn" thì thư gửi ngay, sai thời điểm.

**Cách gỡ:** điền ngày cụ thể ngay khi lead vào bảng, và ghi thẳng trong code rằng ô trống nghĩa là "chưa đến hạn".

2. Đừng dùng GitHub Actions làm đồng hồ

GitHub Actions đặt cron mỗi 30 phút nhưng thật ra chạy cách 1 đến 2 tiếng, và tài khoản GitHub có thể bị gắn cờ khoá bất ngờ (Kiên gặp thật 29/9/2026, máy dừng hơn 2 tuần). Dùng lịch của Cloudflare Workers, đúng giờ, không phụ thuộc GitHub. Ghi chú cũ: lệch giờ không phải lỗi cấu hình.

**Cách gỡ:** tính theo ngày, đừng hứa "đúng 9 giờ 00" trong nội dung thư.

3\. Script ghi vào Lark Base báo `91403 Forbidden`

Base tạo qua giao diện có thể bị đưa vào Wiki, khiến API không nhận diện được cộng tác viên đã mời qua giao diện: lỗi nền tảng, không phải lỗi cấu hình.

**Cách gỡ:** tạo Base và cấp quyền cộng tác bằng dòng lệnh, như đã làm ở Bước 4.

4\. Thư không tới hoặc vào Spam

Resend chỉ gửi tốt khi tên miền đã Verified với đủ SPF, DKIM, DMARC; sai 1 ký tự khoá DKIM là hỏng xác thực. Khoá Resend hoặc mật khẩu ứng dụng dán sai giá trị vào Secrets cũng làm workflow lỗi âm thầm (đã gặp thật ở lead magnet, có 2 lớp nguyên nhân khác nhau).

**Cách gỡ:** gửi thử về chính bạn và kiểm tiêu đề thư xem DKIM/SPF có đạt không trước khi bật cho lead thật; tự dán bí mật rồi đếm độ dài thay vì đọc lại giá trị.

5\. Gửi cho người chưa đồng ý

Chỉ đưa vào chuỗi những người **tự tay** để lại email để nhận ebook. Không nhập danh sách mua hoặc quét được. Người bấm huỷ phải dừng ngay lập tức.

Bước tiếp theo

Đã có máy nuôi qua thư, sang bước kế tiếp: chốt đơn và chăm sóc lead bằng cuộc gọi tự động và tin nhắn sau cuộc gọi.

[Sang bước 19: Bán hàng & Chăm sóc Lead →](https://trienkhaibanhang.truongminhkien.vn/)

