2013-05-30 21 views
3

我正在使用Grails和mail plugin。在开发模式中,我希望我的应用程序发送的邮件能够呈现(以捕捉模板中的错误),但是会打印到控制台。将Grails邮件插件传递到控制台/登录开发模式

我发现的唯一的选择是

grails.mail.disabled=true 

但是,根据documentation

这将把到mailService.sendMail)任何呼叫(如无操作

这不是我想要的,因为我希望开发人员能够点击我们的确认链接(为此我需要邮件输出)。

有没有一种很好的方式将邮件“传递”给控制台?我知道我可以用另一个地址覆盖to-field,但我宁愿在测试时不涉及我们的邮件服务器。

回答

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') 
    } 
} 
+0

谢谢您的建议!我测试了你的代码,它抛出了一个异常,声明'没有方法的签名:my.package.CallPrinter.to()'。当我将'invokeMethod'重命名为'methodMissing'时,它就起作用了。我不是groovy的元编程大师,所以我不能说哪种方法是正确的。唯一缺少的就是渲染模板,我需要在前面提到的确认链接上点击。如果任何人有另一个建议,我将再开放一段时间。 – msung

+0

@msung我已经添加了渲染正文模板的可能选项。 –

1

讹诈插件是最接近你就像我能想到的那样(参见插件here)。它会呈现在网页上的电子邮件(该插件提供了一个控制器),不知道您是否可以设置Log4j将电子邮件记录到控制台...

相关问题