邮件服务模块的职责设计

zjc 于 2026-08-07 发布

邮件看起来是一个小功能,一旦多个业务模块都要发信,它就会变成公共能力。项目把发送邮件独立成 service-mail,统一管理 SMTP 配置、格式处理和发送记录。

一、模块边界

调用方只提交业务字段:

收件人 / 抄送 / 密送
主题
正文
是否 HTML

SMTP 服务器、发件人和授权码由邮件模块维护,业务服务不需要知道邮件基础设施细节。

二、支持文本和 HTML

普通文本使用 SimpleMailMessage,HTML 使用 MimeMessageHelper 并设置 setText(content, true)。这比在业务代码里拼接不同邮件实现干净得多。

三、发送结果入库

每次发送先创建待发送记录,再执行发送,最后更新状态:

0 待发送
1 发送成功
2 发送失败

失败时保存错误信息。这样即使调用方没有保存日志,也能追溯某封邮件的最终状态。

四、异常边界

SMTP 异常不会直接炸给调用方,而是被记录到邮件日志状态中。调用方拿到 MailLogDTO,可以看到发送记录和状态,再决定是否提示用户或触发重试。

五、经验总结

独立邮件服务的价值是收口:安全凭据、发送策略、审计记录都只维护一份,业务模块只表达“我要发什么”。