mkt_mail_message_insert_doc.json 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. {
  2. "table": "mkt_mail_message",
  3. "purpose": "通过 SQL 直接插入营销邮件,由定时任务 DelaySendEmailTaskJob / sendDueDelayedMails 扫描发送",
  4. "scene": "定时发送 + 可选打开追踪",
  5. "db_not_null": ["account_id", "recipient"],
  6. "business_required_for_delay_send": {
  7. "description": "要被定时任务捞到并成功发出,除库表 NOT NULL 外还需满足下列条件",
  8. "fields": [
  9. {
  10. "name": "account_id",
  11. "required": true,
  12. "note": "smtp_pop_settings.id,且 scene=MKT、enabled=1、密码可解密"
  13. },
  14. {
  15. "name": "recipient",
  16. "required": true,
  17. "note": "收件人邮箱,单人一行"
  18. },
  19. {
  20. "name": "subject",
  21. "required": true,
  22. "note": "主题;发送组 MIME 时会用到,建议必填"
  23. },
  24. {
  25. "name": "content",
  26. "required": true,
  27. "note": "HTML 正文;像素在真正 SMTP 发送时注入,不必在 content 里手写"
  28. },
  29. {
  30. "name": "status",
  31. "required": true,
  32. "value": -1,
  33. "note": "必须为 -1(待定时发送),任务只扫 status=-1"
  34. },
  35. {
  36. "name": "delay_send_time",
  37. "required": true,
  38. "note": "定时发送时间;任务条件 delay_send_time <= now()"
  39. },
  40. {
  41. "name": "folder",
  42. "required": true,
  43. "recommended": "SENTING",
  44. "note": "发件中;与系统发信路径一致"
  45. },
  46. {
  47. "name": "in_out_mark",
  48. "required": true,
  49. "recommended": 2,
  50. "note": "2=发件"
  51. },
  52. {
  53. "name": "is_delete",
  54. "required": true,
  55. "value": 0,
  56. "note": "必须为 0,任务会过滤已删除"
  57. },
  58. {
  59. "name": "is_track",
  60. "required_if_open_track": true,
  61. "value": 1,
  62. "note": "需要打开追踪时填 1;发送时若无 track_token 会自动生成并注入像素"
  63. }
  64. ]
  65. },
  66. "optional_on_insert": {
  67. "track_token": "可不填;is_track=1 时由发送前 prepareTrackBeforeSend 自动生成",
  68. "from_addr": "建议填账户邮箱;不填则仅依赖 SMTP 账户 From",
  69. "from_name": "建议填发件显示名",
  70. "biz_ref": "业务单号,便于回查/open_stats",
  71. "biz_batch_no": "批次号",
  72. "org_id": "组织 ID",
  73. "owner_by": "归属人",
  74. "create_by": "创建人",
  75. "mkt_mail_status": "可不插;发送前 ensureStatus 会补状态行"
  76. },
  77. "status_enum": {
  78. "-2": "草稿",
  79. "-1": "待定时发送(SQL 插库走定时任务请用此值)",
  80. "0": "发送中",
  81. "1": "发送成功",
  82. "2": "发送失败"
  83. },
  84. "fields": [
  85. {
  86. "name": "id",
  87. "type": "bigint",
  88. "nullable": false,
  89. "default": "AUTO_INCREMENT",
  90. "desc": "主键,勿手填"
  91. },
  92. {
  93. "name": "account_id",
  94. "type": "bigint",
  95. "nullable": false,
  96. "default": null,
  97. "desc": "发信账户 ID → smtp_pop_settings.id(scene=MKT)"
  98. },
  99. {
  100. "name": "org_id",
  101. "type": "bigint",
  102. "nullable": true,
  103. "default": null,
  104. "desc": "组织 ID"
  105. },
  106. {
  107. "name": "biz_ref",
  108. "type": "varchar(64)",
  109. "nullable": true,
  110. "default": null,
  111. "desc": "调用方业务单号"
  112. },
  113. {
  114. "name": "biz_batch_no",
  115. "type": "varchar(64)",
  116. "nullable": true,
  117. "default": null,
  118. "desc": "批量批次号"
  119. },
  120. {
  121. "name": "message_id",
  122. "type": "varchar(255)",
  123. "nullable": true,
  124. "default": null,
  125. "desc": "SMTP Message-ID,发送成功后系统回写,插库勿填"
  126. },
  127. {
  128. "name": "track_token",
  129. "type": "varchar(64)",
  130. "nullable": true,
  131. "default": null,
  132. "desc": "打开追踪 token;is_track=1 时可空,发送前自动生成;唯一索引"
  133. },
  134. {
  135. "name": "subject",
  136. "type": "varchar(512)",
  137. "nullable": true,
  138. "default": null,
  139. "desc": "主题(业务上必填)"
  140. },
  141. {
  142. "name": "from_addr",
  143. "type": "varchar(255)",
  144. "nullable": true,
  145. "default": null,
  146. "desc": "发件人地址"
  147. },
  148. {
  149. "name": "from_name",
  150. "type": "varchar(255)",
  151. "nullable": true,
  152. "default": null,
  153. "desc": "发件人显示名"
  154. },
  155. {
  156. "name": "recipient",
  157. "type": "varchar(512)",
  158. "nullable": false,
  159. "default": null,
  160. "desc": "收件人邮箱"
  161. },
  162. {
  163. "name": "recipient_cc",
  164. "type": "text",
  165. "nullable": true,
  166. "default": null,
  167. "desc": "抄送,逗号分隔"
  168. },
  169. {
  170. "name": "recipient_bcc",
  171. "type": "text",
  172. "nullable": true,
  173. "default": null,
  174. "desc": "密送,逗号分隔"
  175. },
  176. {
  177. "name": "content",
  178. "type": "mediumtext",
  179. "nullable": true,
  180. "default": null,
  181. "desc": "正文 HTML(业务上必填)"
  182. },
  183. {
  184. "name": "folder",
  185. "type": "varchar(32)",
  186. "nullable": true,
  187. "default": null,
  188. "desc": "INBOX/SENT/SENTING/DRAFT;定时发信建议 SENTING"
  189. },
  190. {
  191. "name": "msg_uid",
  192. "type": "varchar(128)",
  193. "nullable": true,
  194. "default": null,
  195. "desc": "服务器 UID,发信插库勿填"
  196. },
  197. {
  198. "name": "recipient_date",
  199. "type": "datetime",
  200. "nullable": true,
  201. "default": null,
  202. "desc": "收信时间,发信插库勿填"
  203. },
  204. {
  205. "name": "sent_date",
  206. "type": "datetime",
  207. "nullable": true,
  208. "default": null,
  209. "desc": "邮件头 SentDate,一般系统回写"
  210. },
  211. {
  212. "name": "is_only_head",
  213. "type": "tinyint",
  214. "nullable": false,
  215. "default": 0,
  216. "desc": "是否仅拉头"
  217. },
  218. {
  219. "name": "is_read",
  220. "type": "tinyint",
  221. "nullable": false,
  222. "default": 0,
  223. "desc": "是否已读(本地)"
  224. },
  225. {
  226. "name": "in_out_mark",
  227. "type": "tinyint",
  228. "nullable": true,
  229. "default": null,
  230. "desc": "1收件 2发件;定时发信填 2"
  231. },
  232. {
  233. "name": "email_size",
  234. "type": "bigint",
  235. "nullable": true,
  236. "default": null,
  237. "desc": "邮件大小"
  238. },
  239. {
  240. "name": "in_reply_to",
  241. "type": "varchar(512)",
  242. "nullable": true,
  243. "default": null,
  244. "desc": "In-Reply-To,发信插库一般为空"
  245. },
  246. {
  247. "name": "reply_msg_id",
  248. "type": "bigint",
  249. "nullable": true,
  250. "default": null,
  251. "desc": "回复的原邮件 ID"
  252. },
  253. {
  254. "name": "status",
  255. "type": "tinyint",
  256. "nullable": false,
  257. "default": 0,
  258. "desc": "投递状态;定时任务请显式写 -1(默认 0 是发送中,不会被定时任务扫描)"
  259. },
  260. {
  261. "name": "fail_reason",
  262. "type": "varchar(512)",
  263. "nullable": true,
  264. "default": null,
  265. "desc": "失败原因,插库勿填"
  266. },
  267. {
  268. "name": "is_track",
  269. "type": "tinyint",
  270. "nullable": false,
  271. "default": 0,
  272. "desc": "是否打开追踪;需要像素填 1"
  273. },
  274. {
  275. "name": "opened",
  276. "type": "tinyint",
  277. "nullable": false,
  278. "default": 0,
  279. "desc": "是否已打开,插库保持 0"
  280. },
  281. {
  282. "name": "first_open_time",
  283. "type": "datetime",
  284. "nullable": true,
  285. "default": null,
  286. "desc": "首次打开时间"
  287. },
  288. {
  289. "name": "open_count",
  290. "type": "int",
  291. "nullable": false,
  292. "default": 0,
  293. "desc": "打开次数"
  294. },
  295. {
  296. "name": "sent_time",
  297. "type": "datetime",
  298. "nullable": true,
  299. "default": null,
  300. "desc": "SMTP 成功时间,系统回写"
  301. },
  302. {
  303. "name": "delay_send_time",
  304. "type": "datetime",
  305. "nullable": true,
  306. "default": null,
  307. "desc": "定时发送时间;status=-1 时必填"
  308. },
  309. {
  310. "name": "owner_by",
  311. "type": "bigint",
  312. "nullable": true,
  313. "default": null,
  314. "desc": "数据归属人"
  315. },
  316. {
  317. "name": "create_by",
  318. "type": "bigint",
  319. "nullable": true,
  320. "default": null,
  321. "desc": "创建人"
  322. },
  323. {
  324. "name": "update_by",
  325. "type": "bigint",
  326. "nullable": true,
  327. "default": null,
  328. "desc": "更新人"
  329. },
  330. {
  331. "name": "create_time",
  332. "type": "datetime",
  333. "nullable": true,
  334. "default": null,
  335. "desc": "创建时间,建议 NOW()"
  336. },
  337. {
  338. "name": "update_time",
  339. "type": "datetime",
  340. "nullable": true,
  341. "default": null,
  342. "desc": "更新时间,建议 NOW()"
  343. },
  344. {
  345. "name": "is_delete",
  346. "type": "tinyint",
  347. "nullable": false,
  348. "default": 0,
  349. "desc": "逻辑删除;必须 0"
  350. },
  351. {
  352. "name": "enabled",
  353. "type": "tinyint",
  354. "nullable": false,
  355. "default": 1,
  356. "desc": "是否启用"
  357. },
  358. {
  359. "name": "sort",
  360. "type": "int",
  361. "nullable": true,
  362. "default": null,
  363. "desc": "排序"
  364. }
  365. ],
  366. "example_insert_sql": "INSERT INTO mkt_mail_message (\n account_id, org_id, biz_ref, biz_batch_no,\n subject, from_addr, from_name, recipient, content,\n folder, in_out_mark, status, delay_send_time, is_track,\n owner_by, create_by, create_time, update_time, is_delete, enabled\n) VALUES (\n 1001, NULL, 'ACT-20260814-001', 'BATCH-01',\n '促销活动', 'mkt@example.com', '营销号', 'user@example.com', '<html><body><p>你好</p></body></html>',\n 'SENTING', 2, -1, '2026-08-14 12:00:00', 1,\n 1, 1, NOW(), NOW(), 0, 1\n);",
  367. "example_row_json": {
  368. "account_id": 1001,
  369. "biz_ref": "ACT-20260814-001",
  370. "biz_batch_no": "BATCH-01",
  371. "subject": "促销活动",
  372. "from_addr": "mkt@example.com",
  373. "from_name": "营销号",
  374. "recipient": "user@example.com",
  375. "content": "<html><body><p>你好</p></body></html>",
  376. "folder": "SENTING",
  377. "in_out_mark": 2,
  378. "status": -1,
  379. "delay_send_time": "2026-08-14 12:00:00",
  380. "is_track": 1,
  381. "track_token": null,
  382. "opened": 0,
  383. "open_count": 0,
  384. "is_delete": 0,
  385. "enabled": 1,
  386. "owner_by": 1,
  387. "create_by": 1
  388. },
  389. "notes": [
  390. "定时任务扫描条件:is_delete=0 AND status=-1 AND delay_send_time IS NOT NULL AND delay_send_time<=NOW()",
  391. "status 表默认是 0(发送中),SQL 插定时邮件必须显式写 status=-1",
  392. "is_track=1 时可不写 track_token;真正 SMTP 发送前会自动生成并注入像素",
  393. "像素依赖配置 storlead.mail.track-base-url(公网可达,含 context-path)",
  394. "mkt_mail_status 可不插;发送链路会 ensureStatus;打开/回复/发送结果会回写该表"
  395. ]
  396. }