Ktor如何实现发送带Mustache HTML模板的邮件
Ktor加载Mustache模板发送HTML邮件实现方案
核心逻辑:Ktor的模板引擎不依赖HTTP响应上下文,可以独立将模板文件渲染为HTML字符串,将渲染结果传入邮件组件即可,不需要修改现有Apache Commons Mail的核心发送逻辑。
1. 引入依赖
首先确保项目中已引入Ktor Mustache模板组件依赖,以Gradle Kotlin DSL为例:
implementation("io.ktor:ktor-mustache:$ktor_version")
版本号和你项目使用的Ktor版本保持一致即可。
2. 初始化模板引擎
全局初始化一次Mustache模板引擎,指定模板存放的根目录,对应你项目中resources/templates的路径:
import io.ktor.mustache.MustacheContent import io.ktor.mustache.MustacheTemplateEngine import org.apache.commons.mail.HtmlEmail // 全局单例,不需要每次发邮件重复创建 private val emailTemplateEngine = MustacheTemplateEngine(templateDir = "templates")
3. 实现sendTemplate扩展方法
为HtmlEmail类添加扩展方法,内部先完成模板渲染,再把生成的HTML字符串传给邮件组件,即可匹配你期望的调用形式:
fun HtmlEmail.sendTemplate(template: MustacheContent) { val renderedHtml = emailTemplateEngine.process(template) setHtmlMsg(renderedHtml) }
之前直接传入MustacheContent不生效的原因是Apache Commons Mail本身不识别Ktor的模板对象,它仅接收字符串类型的HTML内容,必须先手动完成渲染步骤。
4. 调整原有发送代码
替换原来硬编码HTML的部分即可,注意模板文件名要和你实际的reset.hbs对应:
fun sendForgotPasswordEmail(token: String, emailTo: String) { val email = HtmlEmail() email.hostName = "smtp.sendgrid.net" email.setSmtpPort(587) email.setAuthenticator( DefaultAuthenticator( "apikey", "API_KEY" ) ) // 注意:587端口对应STARTTLS协议,原SSL配置要调整,否则会连接失败 email.isStartTLSEnabled = true email.setFrom(Constants.EMAIL_FROM) email.subject = "Forgot Password" // 调用扩展方法传入模板和参数 email.sendTemplate(MustacheContent("reset.hbs", mapOf("token" to token))) email.addTo(emailTo) email.send() }
注意事项
- 模板路径不要写错:引擎默认从classpath下的指定目录加载文件,模板放在
resources/templates下时,直接传文件名即可,不需要写完整路径 - 配置匹配端口对应的加密模式:465端口对应
isSSLOnConnect = true,587端口对应isStartTLSEnabled = true,不要混用 - 可额外调用
setTextMsg传入纯文本版本的邮件内容,降低被邮件服务商判定为垃圾邮件的概率
内容的提问来源于stack exchange,提问作者Victor Orlyk
相关产品推荐
相关产品推荐

