邮件接口被滥用时,最常见的问题不是发送失败,而是把非法地址、超长内容和无法追踪的请求送进 SMTP。项目在邮件服务里做了两道很实用的防线:先校验收件人,再持久化发送过程。
一、地址格式先拦住
收件人、抄送、密送都支持逗号分隔,解析时会逐个 trim 并匹配基础格式:
local@domain.top
非法地址在入库和发送前直接抛出异常。这个校验不证明邮箱真实存在,但能挡住明显错误和大部分脏输入。
二、可选字段允许为空
抄送和密送可以为空;为空时不设置对应 header。收件人则必须提供,避免构建出一封没有目标地址的邮件。
三、先写待发送
发送前保存 status=0 的记录。这样即使进程在发送过程中中断,也能留下一条待处理痕迹,而不是完全丢失。
四、发送后更新结果
成功更新为 status=1;失败更新为 status=2 并保存错误信息。这个状态机虽然简单,但已经能回答:
- 哪些邮件还在待发送状态。
- 哪些失败以及失败原因。
- 某次业务操作对应的邮件记录是哪条。
五、经验总结
外部系统调用前先落一条初始状态,是提高可观测性的经典做法。后续要扩展重试和告警,也可以基于这张状态表继续演进。