我正在使用带有mail plugin的Grails。在开发模式中,我希望我的应用程序发送的邮件被呈现(以捕获模板中的错误),但打印到控制台。
我找到的唯一选择是
grails.mail.disabled=true
但是,根据documentation:
这会将对mailService.sendMail()的任何调用视为无操作
这不是我想要的,因为我希望开发人员能够点击我们的确认链接(我需要邮件输出)。
有没有一种方法可以将邮件“传递”到控制台?我知道我可以使用另一个地址覆盖to-field,但在测试时我宁愿不涉及我们的邮件服务器。
答案 0 :(得分:4)
您可以在mailService
中创建自己的src/groovy
虚拟实现作为类,然后在grails-app/conf/spring/resources.groovy
中添加一些条件代码,以便仅在开发模式下定义虚拟服务。我能想到的最简单的就是
<强>的src /常规/ COM /示例/ DummyMailService.groovy 强>
package com.example
import org.springframework.mail.MailMessage
class DummyMailService {
MailMessage sendMail(Closure callable) {
callable.delegate = new CallPrinter()
callable.call()
return null
}
}
class CallPrinter {
def methodMissing(name, args) {
println "${name}: ${args}"
}
}
<强>的grails-app / CONF /弹簧/ resources.groovy 强>
import grails.util.Environment
beans = {
if(Environment.current == Environment.DEVELOPMENT) {
mailService(com.example.DummyMailService)
}
}
显然你可能更聪明,例如使用记录器而不是println
,或者根据配置选项而不仅仅是环境切换虚拟服务(这样您以后可以在开发模式下打开邮件时特别想要测试它)。
如果您希望能够处理呈现模板的body(view:'...', model:[:])
次调用,则可以使用groovyPageRenderer
执行此操作:
class DummyMailService {
def callPrinter
MailMessage sendMail(Closure callable) {
callable.delegate = callPrinter
callable.call()
return null
}
}
class CallPrinter {
def groovyPageRenderer
def methodMissing(name, args) {
println "${name}: ${args}"
}
void body(Map params) {
methodMissing("body", groovyPageRenderer.render(params))
}
}
并在resources.groovy
mailService(com.example.DummyMailService) {
callPrinter = { com.example.CallPrinter p ->
groovyPageRenderer = ref('groovyPageRenderer')
}
}
答案 1 :(得分:1)
GreenMail插件是我能想到的最接近你想要的插件(参见插件here)。它将在网页中呈现电子邮件(插件提供控制器),不确定是否可以设置Log4j以将电子邮件记录到控制台...