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
相关产品推荐
相关产品推荐

