Xây workflow email và tài liệu tự động
Tạo phản hồi email nháp và biên bản Markdown từ cùng dữ liệu đã duyệt, không tự động gửi hoặc đọc hộp thư thật.
Tổng quan
Dành cho người học muốn tự hoàn thành bài thực hành xây workflow email và tài liệu tự động, với dữ liệu mẫu có thể kiểm tra.
- Tách tóm tắt AI, kiểm tra nội dung và tạo artifact.
- Tạo email MIME đúng cấu trúc với thư viện chuẩn.
- Dùng ID ổn định để tổ chức file kết quả.
Bạn sẽ hoàn thành: Hai file DEMO-1.eml và DEMO-1.md có cùng nội dung đã kiểm tra.
Chuẩn bị
- Python 3.10+ và trình soạn thảo; tùy chọn công cụ AI để soạn nháp.
Script không dùng SMTP, OAuth hay tài khoản email. Công cụ AI tùy chọn có thể có hạn mức/phí; dữ liệu ví dụ là hư cấu.
Thực hành từng bước
Bước 1. Tạo yêu cầu mẫu thay vì kết nối mailbox
Dùng một yêu cầu đơn giản: người đọc muốn tài liệu bắt đầu. Chính sách mẫu chỉ cho biết tài liệu đang được rà soát, chưa có ngày hoàn thành. Bắt đầu bằng dữ liệu tĩnh để dễ lặp lại và không cần cấp quyền hộp thư.
Bước 2. Soạn nháp AI dựa trên chính sách
Yêu cầu: "Please send the getting-started steps."
Chính sách mẫu: tài liệu đang được rà soát; không có ngày hoàn thành được xác nhận. Viết phản hồi lịch sự 1–2 câu, không thêm link, tệp đính kèm hoặc lời hứa gửi sau. Không tự gửi.Đọc và sửa bản nháp, sau đó đặt văn bản đã chấp nhận vào approved_reply trong code dưới. Tên field này ghi việc bạn đã kiểm tra nội dung bài tập; không có một reviewer hoặc approval ngoài hệ thống nào được tự tạo.
Bước 3. Sinh email và tài liệu từ cùng nguồn
Lưu code thành email_workflow.py. EmailMessage xử lý cấu trúc header/body; địa chỉ example.com chỉ dùng cho ví dụ. File .eml là artifact cục bộ, không có lệnh gửi email.
import json
from email.message import EmailMessage
from pathlib import Path
RECORDS = [{"id": "DEMO-1", "subject": "Onboarding guide",
"request": "Please send the getting-started steps.",
"approved_reply": "Thank you. The guide is being reviewed; no date is confirmed."}]
def build(records, out):
out.mkdir(parents=True, exist_ok=True)
seen = set()
for record in records:
ident = record["id"]
if not ident.startswith("DEMO-") or not ident[5:].isdigit() or ident in seen:
raise ValueError("invalid or duplicate id")
seen.add(ident)
message = EmailMessage()
message["From"] = "training@example.com"
message["To"] = "recipient@example.com"
message["Subject"] = "Draft: " + record["subject"]
message.set_content(record["approved_reply"])
(out / (ident + ".eml")).write_bytes(message.as_bytes())
document = ("# " + ident + "\n\nRequest: " + record["request"] +
"\n\nApproved draft: " + record["approved_reply"] + "\n")
(out / (ident + ".md")).write_text(document, encoding="utf-8")
return len(seen)
if __name__ == "__main__":
print("Created", build(RECORDS, Path("drafts")), "draft pair; nothing sent")python3 email_workflow.pyBước 4. Kiểm tra đầu ra và thử lại
Mở drafts/DEMO-1.md và đọc .eml bằng trình xem văn bản hoặc mở dưới dạng draft khi ứng dụng hỗ trợ. Đối chiếu subject/body, xác nhận không có ngày hứa hẹn. Chạy lại để ghi đè đúng cặp file cùng ID, không nhân đôi. Không dùng ví dụ như hệ lưu trữ transactional: lỗi giữa chừng có thể để lại một file và cần chạy lại sau khi sửa dữ liệu.
Bước 5. Lập kế hoạch tích hợp thật theo từng quyền
Khi cần mailbox thật, chọn node Email Trigger (IMAP) hoặc tích hợp được tổ chức cho phép, cấu hình credentials riêng, lọc thư mục thử và lưu message ID để chống xử lý lại. Giữ bước tạo draft trước bước gửi; không nối SMTP chỉ vì model đề xuất. Kiểm tra chính sách lưu trữ dữ liệu trước khi chuyển nội dung thư cho AI.
Kiểm tra kết quả
- Hai artifact dùng đúng cùng approved_reply, không gọi mạng.
- Chạy lại không tạo thêm cặp file với ID mới.
Xử lý lỗi thường gặp
Xuống dòng hoặc Unicode trong email bị hiển thị lạ
Nguyên nhân: Đọc MIME bằng cách tách chuỗi thủ công.
Cách xử lý: Dùng email.parser để đọc hoặc ứng dụng hỗ trợ MIME; kiểm tra nội dung sau decode.
File cũ vẫn còn sau batch lỗi
Nguyên nhân: Quy trình mẫu không có transaction hoặc cleanup toàn batch.
Cách xử lý: Dùng thư mục thử riêng, kiểm tra ID và xử lý lỗi trước khi thay output trong hệ thật.
Bài tập & mở rộng
- Thêm hai yêu cầu, giữ ID duy nhất và kiểm tra số cặp file.
- Viết test parse .eml và đối chiếu decoded body với Markdown.
Bài không tự đọc mail, gửi mail hay tạo Google Docs. Không coi file .eml là bằng chứng đã giao email; cần kiểm tra tích hợp riêng khi triển khai thật.
