3

我正在使用带有邮件插件的 Grails 。在开发模式下,我希望我的应用程序发送的邮件被渲染(以捕获模板中的错误)但打印到控制台。

我发现的唯一选择是

grails.mail.disabled=true

但是,根据文档

这会将任何对 mailService.sendMail() 的调用视为无操作

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

有没有一种将邮件“传递”到控制台的好方法?我知道我可以用另一个地址覆盖收件人字段,但我宁愿在测试时不涉及我们的邮件服务器。

4

2 回答 2

4

您可以创建自己的虚拟实现mailService作为一个类,src/groovy然后放入一些条件代码grails-app/conf/spring/resources.groovy以仅在开发模式下定义您的虚拟服务。我能想到的最简单的方法是

src/groovy/com/example/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/spring/resources.groovy

import grails.util.Environment

beans = {
  if(Environment.current == Environment.DEVELOPMENT) {
    mailService(com.example.DummyMailService)
  }
}

显然你可以更聪明,例如使用 logger 而不是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')
  }
}
于 2013-05-30T10:16:52.537 回答
1

GreenMail 插件是我能想到的最接近您想要的插件(请参阅此处的插件)。它将在网页中呈现电子邮件(插件提供控制器),不确定您是否可以设置 Log4j 将电子邮件记录到控制台...

于 2013-05-30T11:01:37.367 回答