邮件QA 是做什么的?
过滤器: $ARGUMENTS
渲染器: ${CLAUDE_SKILL_DIR}/../ui-audit/scripts/render-html.mjs
1. 获取每个模板的最终HTML
- 已有画廊脚本? 在
package.json中查找email-gallery、email:preview或emails。如果有脚本能使用固定数据写入每个模板,则运行它并使用其输出目录。 - 否则编写测试框架 于
/tmp/email-qa/render.ts(除非用户希望保留在仓库内,否则放在仓库外):- 导入每个渲染器(React Email 的
render()、模板文字函数、MJML); - 使用真实数据调用它,包括边界情况:长名字、缺失的可选字段、0、1 和多个项目,以及两种语言环境;
- 写入
<template>-<case>.html; - 模拟任何读取环境变量、数据库或网络的代码。使用仓库的
tsx运行它。
- 导入每个渲染器(React Email 的
- 始终 QA 最终生成的 HTML,而不是 JSX。
2. 渲染 + 静态检查
node ${CLAUDE_SKILL_DIR}/../ui-audit/scripts/render-html.mjs /tmp/email-qa/out/*.html --out /tmp/email-qa/shots
对于每个文件,这会产生 @600/@375 明暗模式以及 @600-noimg 的截图,并生成包含静态问题的 render.json。请阅读每个模板的检查表。
3. 检查清单(脚本标记之外的检查项)
- 占位符: 不存在
undefined、NaN、null、[object Object]、{{…}}、Invalid Date、空的kr、本应隐藏的0 st。 - 预标头: 存在、有意义且不是主题的重复。应有足够的填充以防止正文文本泄漏到收件箱预览中。
- 退订链接: 摘要和营销邮件必须提供(同时需要在发送代码中添加
List-Unsubscribe和List-Unsubscribe-Post标头)。交易邮件可免除;请说明每个模板属于哪种类型。 - 无图模式: 即使没有图片,消息仍然有意义;每个有意义的图片都有替代文本;分隔符使用
alt="";行动呼吁(CTA)是实时文本而非图片。 - 暗模式: Logo 有透明或暗色安全变体;不存在深色文字现在变成深色背景上的文字的情况;品牌颜色仍然满足 3:1 对比度。Gmail/Outlook 的强制反转无法模拟,因此将硬编码的
#000文字放在透明背景上标记为风险。 - Outlook 桌面版: 使用表格布局,无 flex/grid;为按钮提供 VML 或
mso内边距回退;宽度使用width=属性;避免使用margin对块级元素进行间距控制。 - 链接: 绝对
https://链接;如果项目使用 UTM 参数,则需包含;无 localhost 或预览主机;退订链接不应包含跟踪参数。 - 文案: 全程使用正确的语言环境(对字符串运行
copy-check规则);发件人名称和回复地址符合项目预期。 - CTA 在 375px 视口下可见且未被截断。 总大小保持在约 102 KB 以下。
退出标准
- 每个模板都在所有变体中渲染,并且检查表已被阅读。
- 没有占位符泄漏或相对链接,并且视口元标记存在。
- 每个剩余问题都被标记为:bug(已修复)或 risk(已报告)。
- 向用户提供简短摘要以及截图目录。