我需要将我的电子邮件模板存储在可以编辑的位置,而无需重新部署grails应用程序。我正在寻找一种方法来将这些模板呈现为基于绝对路径的邮件插件的视图。目前,内置的“视图”和grails渲染方法都基于grails-app / views位置。
更新:现在,我将使用SimpleTemplateEngine并将字符串输入正文。我还是想知道是否有更多的“grails”方式来解决这个问题。
答案 0 :(得分:1)
还没有工作,但这个问题似乎没有得到很多答案,所以我不认为这里有太多分散注意力。
这是我在resources.groovy中尝试的内容:
mailMessageContentRenderer(gregg.stackoverflow.CustomPathMailMessageContentRenderer) {
groovyPagesTemplateEngine = ref('groovyPagesTemplateEngine')
groovyPagesUriService = ref('groovyPagesUriService')
grailsApplication = ref('grailsApplication')
}
如果查看mail-plugin,则会定义两个bean mailMessageBuidlerFactory
和mailMessageContentRenderer
。根据我真正期望的other people have done来覆盖渲染器并允许您自定义行为。当我进行日志记录以查看mailService.mailMessageBuilderFactory.mailMessageContentRenderer
的类时,它是自定义的类,因此布线似乎正常工作。我创建了以下自定义渲染器:
package gregg.stackoverflow
import org.codehaus.groovy.grails.commons.ConfigurationHolder
class CustomPathMailMessageContentRenderer extends grails.plugin.mail.MailMessageContentRenderer {
@Override
protected createTemplate(String templateName, String controllerName, String pluginName) {
def gspOverride = ConfigurationHolder.config.mailtemplate.gsp.dir
println "Custom one!"
if (!gspOverride) {
return super.createTemplate(templateName, controllerName, pluginName)
}
else {
def contextPath = gspOverride + templateName +".gsp"
def gspFile = new File(contextPath)
def template = groovyPagesTemplateEngine.createTemplate(gspFile)
if (!template) {
if (pluginName) {
throw new IllegalArgumentException("Could not locate email view ${templateName} in plugin [$pluginName]")
} else {
throw new IllegalArgumentException("Could not locate mail body ${templateName}. Is it in a plugin? If so you must pass the plugin name in the [plugin] variable")
}
}
return template
}
}
}
此外,我向Config.groovy
添加了一个属性,以指示名为mailtemplate.gsp.dir
的GSP目录,该目录将在默认功能和自定义目录之间切换。
但是我放在那里的println声明没有显示。经过漫长的一天后,我把这个弄得一团糟,所以我的大脑可能只是被油炸了,但今天我没有时间弄明白,所以很抱歉发布了非工作,非常粗糙的代码。希望你弄清楚。
<强> Upate 强>
好吧,因为我是OCD,一旦我开始这样的事情并且可以长时间饮用咖啡因而没有食物,我会在午餐时工作......有点像,大部分时间......: - )您必须使用GSP视图,但我不确定模板是否可行(我猜测在您的GSP视图中包含模板也不起作用)。所以sendMail
调用看起来像这样:
mailService.sendMail {
to "name@domain.tld"
body (view:"/test", model:[name:"Chris"])
// subject, from, etc still work
}
所以上面的代码和行:
mailtemplate.gsp.dir=C:\\gsptest
以及名为C:\gsptest\test.gsp
的GSP我能够成功向外发GSP发送电子邮件。