邮件看起来是一个小功能,一旦多个业务模块都要发信,它就会变成公共能力。项目把发送邮件独立成 service-mail,统一管理 SMTP
配置、格式处理和发送记录。
一、模块边界
调用方只提交业务字段:
收件人 / 抄送 / 密送
主题
正文
是否 HTML
SMTP 服务器、发件人和授权码由邮件模块维护,业务服务不需要知道邮件基础设施细节。
二、支持文本和 HTML
普通文本使用 SimpleMailMessage,HTML 使用 MimeMessageHelper 并设置 setText(content, true)。这比在业务代码里拼接不同邮件实现干净得多。
三、发送结果入库
每次发送先创建待发送记录,再执行发送,最后更新状态:
0 待发送
1 发送成功
2 发送失败
失败时保存错误信息。这样即使调用方没有保存日志,也能追溯某封邮件的最终状态。
四、异常边界
SMTP 异常不会直接炸给调用方,而是被记录到邮件日志状态中。调用方拿到 MailLogDTO,可以看到发送记录和状态,再决定是否提示用户或触发重试。
五、经验总结
独立邮件服务的价值是收口:安全凭据、发送策略、审计记录都只维护一份,业务模块只表达“我要发什么”。