Пока не работает, но на этот вопрос, похоже, нет много ответов, поэтому я не думаю, что это здесь слишком отвлекает.
Вот что я попробовал в resources.groovy:
mailMessageContentRenderer(gregg.stackoverflow.CustomPathMailMessageContentRenderer) {
groovyPagesTemplateEngine = ref('groovyPagesTemplateEngine')
groovyPagesUriService = ref('groovyPagesUriService')
grailsApplication = ref('grailsApplication')
}
Если вы просматриваете mail-plugin, то определены два bean-компонента mailMessageBuidlerFactory
и mailMessageContentRenderer
. Исходя из того, что сделали другие люди , я действительно ожидал, что это переопределит средство визуализации и позволит вам настроить поведение. Когда я включаю запись в журнал, чтобы увидеть класс 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
, чтобы указать каталог GSP с именем mailtemplate.gsp.dir
, который будет переключаться между функциональностью по умолчанию и пользовательским каталогом.
Но напечатанное мной утверждение println не отображается. Я очень долго отвлекался от этого после очень долгого дня, так что, возможно, мой мозг просто зажегся, но у меня не будет времени разобраться с этим сегодня, извините за публикацию нерабочего, очень неполированного кода. Надеюсь, вы это выясните.
Upate
Ладно, потому что я заболел, как только начал работать с такими вещами, и могу долго жить на кофеине и без еды, я получил эту работу за ланчем ... вроде как, в большинстве случаев ...: -) Вы должны использовать представления 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
и GSP с именем C:\gsptest\test.gsp
Мне удалось успешно отправить электронное письмо из внешнего GSP.