2013-05-30 22 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將電子郵件記錄到控制檯...

相關問題