Blocked-by: objectstack-ai/objectstack#5087 ## 问题 由 #5087 的分诊派生,原 issue 已明确把这部分划出范围(「按一事一议另行处理」),故独立立单。 `packages/services/service-settings/src/manifests/mail.manifest.ts` 的 provider 下拉列出 SendGrid 与 Amazon SES,但 `packages/plugins/plugin-email/src/transports/` 下只有 `resend.ts` 与 `postmark.ts`,`makeTransport` 也只认这两个值。选中 SendGrid / SES 保存后: - `applyMailSettings` 走的是 `provider !== 'smtp' && provider !== 'log'` 分支,拿 `api_key` 去 `makeTransport({ provider })`,而该 provider 值不被支持; - 用户侧观感与 #5087 一致 —— 表单校验通过、保存成功、邮件不发,declared-but-not-delivered。 ## 与 #5087 的关系 `Blocked-by` 而非 sub-issue:两者是**依赖关系**而非同一完成范围。#5087 落地后本单的正确范围才能确定 —— SendGrid 与 SES 都提供 SMTP 端点,届时可能: 1. 直接复用 #5087 的 `SmtpTransport`,把这两个选项映射成预置 host 的 SMTP 配置(工作量最小,且不新增 API 客户端); 2. 或按各自 HTTP API 新增 transport(与 Resend/Postmark 同形,纯 fetch)。 分诊时按 #5087 实际落地形态再定,不要现在预判。 ## 验收判据 provider 选中的每一个值,要么后端真的能投递,要么在**保存/校验期响亮拒绝**(而不是保存成功后静默不发)——不允许下拉框里存在只有前端、没有后端的选项。
Blocked-by: #5087
问题
由 #5087 的分诊派生,原 issue 已明确把这部分划出范围(「按一事一议另行处理」),故独立立单。
packages/services/service-settings/src/manifests/mail.manifest.ts的 provider 下拉列出 SendGrid 与 Amazon SES,但packages/plugins/plugin-email/src/transports/下只有resend.ts与postmark.ts,makeTransport也只认这两个值。选中 SendGrid / SES 保存后:applyMailSettings走的是provider !== 'smtp' && provider !== 'log'分支,拿api_key去makeTransport({ provider }),而该 provider 值不被支持;与 #5087 的关系
Blocked-by而非 sub-issue:两者是依赖关系而非同一完成范围。#5087 落地后本单的正确范围才能确定 —— SendGrid 与 SES 都提供 SMTP 端点,届时可能:SmtpTransport,把这两个选项映射成预置 host 的 SMTP 配置(工作量最小,且不新增 API 客户端);分诊时按 #5087 实际落地形态再定,不要现在预判。
验收判据
provider 选中的每一个值,要么后端真的能投递,要么在保存/校验期响亮拒绝(而不是保存成功后静默不发)——不允许下拉框里存在只有前端、没有后端的选项。