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

Grails自定义邮件服务:如何将GSP模板设为MimeMessage内容

我来帮你解决这个问题!在Grails里手动实现带参数GSP模板的邮件内容渲染,核心就是先把GSP模板渲染成HTML字符串,再把这个字符串绑定到MimeMessage里。下面是具体的实现方案和代码示例:

1. 注入Grails视图渲染器

Grails内置了ViewRenderer bean,专门用来渲染GSP模板为字符串。你只需要在自定义邮件服务类里注入这个bean即可:

import grails.views.ViewRenderer

class CustomEmailService {
    ViewRenderer viewRenderer // Grails会自动注入这个bean
    // ...其他服务方法
}
2. 渲染带参数的GSP模板

用viewRenderer.render()方法,传入视图路径和模型参数,就能得到渲染后的HTML内容。视图路径的写法和你用Grails邮件插件时一致,比如sampleView/content对应grails-app/views/sampleView/content.gsp:

// 准备模板需要的参数模型
def emailModel = [
    username: "John Doe",
    orderId: "ORD-2024-001",
    totalAmount: 99.99
]

// 渲染GSP为HTML字符串
String renderedContent = viewRenderer.render(
    view: "sampleView/content", // 视图路径
    model: emailModel,          // 模板参数
    contentType: "text/html"    // 指定渲染为HTML格式
)
3. 将渲染内容绑定到MimeMessage

接下来把渲染好的HTML字符串设置到你的MimeMessage里,注意要指定正确的内容类型,避免邮件客户端把HTML当成纯文本显示:

def auth = new SMTPAuthenticator()
def session = Session.getInstance(props, auth)
session.setDebug(true)
def msg = new MimeMessage(session)

// 替换原来的setText(),用setContent设置HTML内容并指定编码
msg.setContent(renderedContent, "text/html; charset=utf-8")
msg.setSubject(m_subject, "utf-8") // 主题也建议指定编码防乱码
msg.setFrom(new InternetAddress("your-sender@example.com"))
// ...继续设置收件人、抄送人等信息
// Transport.send(msg) // 发送邮件
额外提示
  • 如果你的GSP用到了Grails标签库(比如g:link、g:message),ViewRenderer会自动处理这些标签,和正常渲染网页的效果一致。
  • 如果是在非服务类的环境下使用(比如工具类),可以通过Holders.applicationContext.getBean(ViewRenderer)手动获取渲染器实例。
  • 务必指定编码为utf-8,避免中文或特殊字符出现乱码问题。

内容的提问来源于stack exchange,提问作者mendz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:13:31