Skip to content

Delivery log: SDD ​

PRD · Tests · trạng thái: 01-05 đã xây cho email; 06 chưa

Bảng ​

BảngMigrationCột chính
email_deliveries20260904a_email_deliveries.sql, thêm audit_of ở 20260907a_email_opens.sqlid, kind, recipient, subject, user_id, ref_id, status CHECK IN ('sent','failed'), message_id, error_code, error_message, audit_of, created_at. Chỉ mục theo recipient, kind, user_id, audit_of. Không tiền tố legacy_.
email_opens20260907a_email_opens.sqlid, delivery_id, opened_at, user_agent, ip_country, via_proxy CHECK IN (0,1). Một dòng mỗi lượt tải, cố ý không gộp thành cột opened_at.
daily_email_runs20260909a_daily_email_runs.sqlSổ của vòng gửi hằng ngày: run_date khoá chính, considered, sent, finished_at.

Đường ghi và đọc ​

ViệcFile / route
Ghi lượt gửisendEmail() trong api.conan.school/src/shared/email/send.ts, sau env.EMAIL.send
Ảnh theo dõiGET /api/system/email/o/:file ở src/domains/system/index.ts: trả GIF no-store, chỉ ghi khi delivery_id có trong email_deliveries
Tra lượt mởGET /api/system/email/opens?email=&kind= và GET /api/system/email/opens/:deliveryId, gác bằng x-email-smoke-token
Adminsrc/domains/admin/emails.ts mount /api/admin/emails: GET /catalog, GET /stats (lọc audit_of IS NULL, mỗi loại mang cờ operator_opens), GET /, POST /test, GET /:id (cờ operator_opens theo lượt gửi qua operatorOpensForDelivery, kèm audit_copy_mode). Cờ của /stats qua operatorOpensInKindStat (loại có bản sao chung thư VÀ có thư được mở). Mọi phản hồi có lượt mở kèm operator_opens_mixed_in, operator_opens_caveat, audit_rows_written
Giao diệnadmin.conan.school/legacy/admin-trial/src/pages/EmailsPage.tsx, đường /community/email (khai ở admin.conan.school/src/nav.ts)
Báo cáosrc/shared/email/report.ts dùng cùng định nghĩa "đã mở" với /stats, và cùng luật cờ: operatorOpensInKindStat theo loại, operatorOpensForDelivery cho top 10; ccInflated tính từ số liệu của kỳ

Bản sao kiểm tra và sổ gửi ​

EMAIL_AUDIT_COPY.mode = 'cc' từ 08.09.2026: người vận hành là người nhận CC, chung thư, chung deliveryId, chung ảnh theo dõi. Hệ quả cho sổ: lượt mở của người vận hành ghi vào lượt gửi của người dùng, và cột audit_of không được ghi nữa (cả sổ chỉ có 10 dòng bản sao, 07-08.09.2026). Bộ lọc audit_of IS NULL giữ lại cho chế độ 'separate', nhưng ở chế độ 'cc' nó không loại gì.

Chưa có ​

  • NOTIF-LOG-06: khi người nhận đã huỷ, sendEmail() trả E_UNSUBSCRIBED trước bước ghi sổ, nên lượt bỏ qua chỉ để lại một dòng log email_skipped_unsubscribed trên Workers Logs, không có dòng D1 nào.
  • Sổ cho kênh khác ngoài email (chưa có kênh khác).

Tài liệu nội bộ nền tảng Conan School.