You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 23:03:31