[{"data":1,"prerenderedAt":169},["ShallowReactive",2],{"/zh_cn/blog/temporary-email-api-testing-guide":3,"/zh_cn/blog/temporary-email-api-testing-guide-surround":158},{"id":4,"title":5,"authors":6,"badge":12,"body":14,"contentQuality":141,"date":145,"description":146,"extension":147,"image":148,"indexable":150,"locale":151,"meta":152,"navigation":150,"path":153,"reviewedBy":154,"seo":155,"stem":156,"updated":145,"__hash__":157},"postsZh/zh_cn/blog/19.temporary-email-api-testing-guide.md","临时邮箱 API 测试指南：避免等待脆弱、串信和泄露秘密",[7],{"name":8,"to":9,"avatar":10},"Once Email 工程团队","/zh_cn/about",{"src":11},"/images/authors/default-cartoon-author-v2.webp",{"label":13},"API 测试",{"type":15,"value":16,"toc":131},"minimal",[17,21,29,38,42,45,48,51,54,57,60,63,74,89,93,96,99,102,105,108,112,119,122,125,128],[18,19,20],"p",{},"邮件测试可能“错误地通过”：共享收件箱里还留着昨天的验证码；固定等待 10 秒只在服务器空闲时有效；没有截止时间的重试会让 CI 在产品早已失败后继续占用资源。",[18,22,23,24,28],{},"稳定的临时邮箱 API 测试应当是一台小型状态机：",[25,26,27],"strong",{},"创建、触发、轮询、匹配、断言、清理","。每一段都要有明确输入、截止时间和不泄露正文的失败证据。",[18,30,31,32,37],{},"在自动化之前，可以先用",[33,34,36],"a",{"href":35},"/zh_cn/tools/email-address-privacy","邮件地址隐私检查器","理解地址结构会暴露哪些线索，再决定测试日志中应该保留或脱敏哪些字段。",[39,40,41],"h2",{"id":41},"每次运行使用独立邮箱",[18,43,44],{},"为一个测试或一组紧密相关的场景新建邮箱，不要让并行任务读取同一个地址。除邮箱地址外，还要把 API 返回的不透明邮箱 ID 存进本次测试上下文，后续查询只引用这个 ID。",[18,46,47],{},"邮箱应在触发邮件前不久创建。这样可以缩小时间窗口，避免旧消息满足过于宽松的断言。如果测试平台会自动重跑失败任务，把运行编号保存在本地诊断上下文即可，不必追求一个容易记住的邮箱地址。",[39,49,50],{"id":50},"只触发一个可观察动作",[18,52,53],{},"让被测系统执行一个清晰动作，例如发送确认链接、登录验证码或交易回执。如果系统提供请求 ID 或事件 ID，将它和本次测试关联。交易标识比只匹配主题行更可靠。",[18,55,56],{},"只测试你拥有或被授权测试的系统。临时邮箱 API 不是批量注册、规避平台限制或监控他人通信的工具。",[39,58,59],{"id":59},"有截止时间地退避轮询",[18,61,62],{},"邮件投递是异步过程，第一次查询为空很正常。可以从 60 秒总截止时间开始，依次等待 1、2、3、5、8 秒，之后每次最多 10 秒；大量并行任务同时启动时加入少量随机抖动。",[64,65,71],"pre",{"className":66,"code":68,"language":69,"meta":70},[67],"language-text","截止时间 = 当前时间 + 60 秒\n等待 = 1 秒\n在截止时间前循环：\n    消息列表 = 查询邮箱\n    如果找到目标消息：返回\n    睡眠（等待 + 随机抖动）\n    等待 = 最小值（等待 × 1.6，10 秒）\n失败（截止前没有收到目标邮件）\n","text","",[72,73,68],"code",{"__ignoreMap":70},[18,75,76,77,80,81,84,85,88],{},"收到 ",[72,78,79],{},"429 Too Many Requests"," 时，应遵守 ",[72,82,83],{},"Retry-After"," 或文档给出的等待时间。被限流后更猛烈地重试只会延长恢复时间。网络错误和临时 ",[72,86,87],{},"5xx"," 可以在原截止时间内有限重试，但不能暗中把一分钟测试拖成十分钟。",[39,90,92],{"id":91},"匹配交易不只匹配主题","匹配交易，不只匹配主题",[18,94,95],{},"主题行是给人看的，会因为文案和语言调整而改变。可靠候选通常同时满足：消息晚于测试动作、收件人属于本次邮箱、发件域符合预期、交易标识或一次性链接对应当前请求，并且候选唯一或明确选择最新有效消息。",[18,97,98],{},"邮件 HTML 必须按不可信输入处理。不要执行脚本、加载远程图片，也不要在日常浏览器资料中直接打开链接。先提取目标 URL，解析并核对注册域，再让受控测试客户端访问。",[39,100,101],{"id":101},"不要把秘密写进测试输出",[18,103,104],{},"API 密钥、验证码和魔法链接即使寿命很短，也是凭证。API 密钥应保存在 CI 密钥库，通过授权请求头发送；不要写入查询字符串、截图、测试夹具或 Git 配置。",[18,106,107],{},"失败日志只保留必要元数据：邮箱 ID 尾部、时间、消息数量、脱敏发件域、HTTP 状态和请求 ID。不要输出完整地址、头部、正文或附件。好的报告能够说明状态机停在哪里，却不会变成第二份邮箱档案。",[39,109,111],{"id":110},"在-finally-中强制清理","在 finally 中强制清理",[18,113,114,115,118],{},"无论断言成功还是失败，都要执行删除。把邮箱清理放进测试框架的 ",[72,116,117],{},"finally","、teardown 或 after-each。主动清理能减少留存、隔离后续测试，也让配额更容易解释。服务器自动过期是必要兜底，但不应替代客户端清理。",[39,120,121],{"id":121},"并行之前先计算配额",[18,123,124],{},"估算每个场景的调用：创建一次、列表查询若干次、读取详情一次、删除一次。十个任务每秒轮询不会让邮件更快，却可能耗尽共享限额。限制并发数，在测试进程内共享速率预算，并在仪表盘观察月度使用量。",[18,126,127],{},"Once Email 计划中的 Developer 方案会把免费网页额度与自动化 API 分开。鉴权、错误、配额和价格合同将在真实密钥、计量与订阅撤销通过生产测试后公开，避免页面承诺领先于用户能够实际验证的能力。",[18,129,130],{},"最好的邮件测试不会无限重试。它创建隔离邮箱，礼貌等待，证明正确交易已经到达，留下安全证据，然后不留收件箱地结束。",{"title":70,"searchDepth":132,"depth":132,"links":133},2,[134,135,136,137,138,139,140],{"id":41,"depth":132,"text":41},{"id":50,"depth":132,"text":50},{"id":59,"depth":132,"text":59},{"id":91,"depth":132,"text":92},{"id":101,"depth":132,"text":101},{"id":110,"depth":132,"text":111},{"id":121,"depth":132,"text":121},{"originalAnalysis":142,"trendContext":143,"practicalValue":144},"本文跟踪一次自动注册测试，从创建隔离邮箱、触发邮件、限时轮询、识别目标消息、完成断言到失败后清理，并说明如何留下可诊断但不含正文的证据。","注册、找回与无密码登录仍普遍依赖邮件，而并行 CI 让共享邮箱、固定等待、无限重试和完整正文日志越来越不可靠，也更容易造成串信与秘密泄露。","读者可以直接采用六阶段流程、退避时间表、状态码处理原则、交易匹配条件、安全日志字段和 finally 清理检查表，并据此估算并行任务的配额。","2026-08-08","用隔离邮箱、退避轮询、精确匹配、安全日志和强制清理，构建稳定且可诊断的邮件自动化测试。","md",{"src":149},"/images/blog/temporary-email-threat-model-cover.webp",true,"zh_cn",{},"/zh_cn/blog/temporary-email-api-testing-guide","Once Email 中文工程与安全审核",{"title":5,"description":146},"zh_cn/blog/19.temporary-email-api-testing-guide","xorFZh0tmgTl8uGQQyrSQ2eyTPOEA9iqc5QMKmnXfVQ",[159,164],{"title":160,"path":161,"stem":162,"description":163,"children":-1},"邮件验证码安全指南：复制前先确认，使用后及时清理","/zh_cn/blog/email-verification-code-safety","zh_cn/blog/18.email-verification-code-safety","把邮件验证码当作短时有效的秘密：确认请求由你发起，核对目标域名，只复制验证码，并在操作完成后清理剪贴板。",{"title":165,"path":166,"stem":167,"description":168,"children":-1},"Once Email 内容编辑与审核政策","/zh_cn/blog/editorial-policy","zh_cn/blog/9.editorial-policy","Once Email 如何选择主题、验证产品描述、引用可靠来源、处理翻译、记录更新并修正已发布内容。",1786188214726]