【问题标题】:send an email using a template - grails使用模板发送电子邮件 - grails
【发布时间】:2014-06-28 05:02:16
【问题描述】:

我想使用模板发送电子邮件。我想要一个 GSP 文件,我可以在其中设置样式并发送电子邮件。目前发送邮件功能如下:

def sendEmail(){

    mailService.sendMail {
        to "email","**email**"
        from "email"
        subject "Hi"
        body 'Hi'
    }
}

在我的config.groovy 文件中

grails {
    mail {
      host = "smtp.gmail.com"
      port = 465
      username = "email"
      password = "pwd"
      props = ["mail.smtp.auth":"true",
               "mail.smtp.socketFactory.port":"465",
               "mail.smtp.socketFactory.class":"javax.net.ssl.SSLSocketFactory",
               "mail.smtp.socketFactory.fallback":"false"]
    }
 }

我经历了另一个Stack Overflow post:我应该在哪里添加邮件模板?它在视图文件夹中吗?

sendMail{
    multipart true
    to "[hidden email]"
    subject "Subject goes here"
    html  g.render( template: '/emails/mailTemplate')
    inline 'springsourceInlineImage', 'image/jpg', new File('./web-app/images/springsource.png')
}

更新

我尝试在 EMAILS/ 下添加一个 mailTemplate.gsp,但它不起作用。

ERROR I GOT Template not found for name [/emails/mailTemplate] 和路径 [/emails/_mailTemplate.gsp]

【问题讨论】:

  • views/emails/_mailTemplate.gsp
  • 请将@Abincepto 的答案标记为正确答案。

标签: email grails groovy


【解决方案1】:

您可以使用 groovyPageRenderer.render() 来解析您的电子邮件。下面是一个例子:

class MailingService {

    def groovyPageRenderer
    def mailService

    def yourFunction(User user) {

        def content = groovyPageRenderer.render(view: '/mails/myTemplate')
        mailService.sendMail {
            to user.email
            from "email@test.com"
            subject "MySubject"
            html(content)
        }
    }
}

在这种情况下,模板在这里:/views/mails/MyTemplateFile.gsp

希望这会有所帮助。

编辑: 并且渲染可以与模型一起使用。示例:

groovyPageRenderer.render(view:'/mails/myTemplate',model:[user:user])

编辑2: 我忘记在第一个回复中添加 mailService

【讨论】:

  • 我收到此错误“无法在空对象上调用方法渲染()。堆栈跟踪如下:消息:无法在空对象上调用方法渲染()”
  • 您是否添加了我的答案“def groovyPageRenderer”的第二行?
  • 我已经包含了那行。但我仍然收到错误Cannot invoke method render() on null object
  • 可能您需要添加此导入:“import grails.gsp.PageRenderer”并将渲染器定义为“PageRenderer groovyPageRenderer”。我尝试了使用 Grails 2.3.7 的代码,它可以工作。我希望你的代码能适应这些修改。
  • 请注意。我已经在Services 部分添加了代码。
【解决方案2】:

嗯,你可以试试这段代码……

mailService.sendMail {
            to user.email
            from "email@test.com"
            subject "MySubject"
            body(view:'/emails/mailTemplate', model: [a:A])
        }

这里mailTemplate.gspview/emails 中。在邮件服务正文中,您可以使用渲染语法。 然后在mailTemplate.gsp顶部添加'<%@ page contentType="text/html" %>'

【讨论】:

  • 抛出异常Exception occurred in job: Grails Job org.quartz.JobExecutionException: java.lang.IllegalArgumentException: Mail views cannot be loaded from relative view paths where there is no current HTTP request [See nested exception: java.lang.IllegalArgumentException: Mail views cannot be loaded from relative view paths where there is no current HTTP request]
【解决方案3】:

看看你的代码,一切看起来都不错。

html g.render(template : '/path/to/template')

应该呈现您的模板,它将成为您邮件的正文。

你确定你的模板是_template。由于所有以(_) 开头的 gsp 都只被视为模板。

您还应该使所有样式(css)内联,以便在所有邮件提供商中呈现时不会出错。

【讨论】:

    猜你喜欢
    • 2018-07-11
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多