使用Grails Async Mail Plugin发送多个附件

时间:2012-03-13 04:28:16

标签: email grails plugins groovy

我正在使用grails Async Mail插件在我的应用中发送带附件的电子邮件。实现我已编写以下代码

def sendEmail = {
    def documentsInstances = Documents.getAll(params.list('ids[]'))
    def s3Service = new AmazonS3Service()
    documentsInstances.each(){documentsInstance->
            asyncMailService.sendMail {
                multipart true
                to documentsInstance.author.emailAddress
                subject 'Test';
                html '<body><u>Test</u></body>';
                attachBytes documentsInstance.filename , 'text/plain', s3Service.getBytes(session.uid,documentsInstance.filename);
            }
    }//

}

现在上面的代码工作得非常正确,但它会为每个附件发送一封电子邮件,我不知道如何在发送邮件中移动此循环,以便我可以在电子邮件中发送多个附件。

还有办法发送电子邮件,以便我不必在byte []中加载整个文件吗?

我使用JetS3t访问Amazon S3,我尝试使用

“附加”方法

new InputStreamResource(s3Obj.getDataInputStream())

attach documentsInstance.filename , 'text/plain', new InputStreamResource(s3Obj.getDataInputStream());

但我正在

"Passed-in Resource contains an open stream: invalid argument. JavaMail requires an InputStreamSource that creates a fresh stream for every call"

1 个答案:

答案 0 :(得分:3)

你需要你的 电子邮件

def sendEmail = {
    def documentsInstances = Documents.getAll(params.list('ids[]'))
    def s3Service = new AmazonS3Service()
    asyncMailService.sendMail {
        multipart true
        to documentsInstance.author.emailAddress
        subject 'Test';
        html '<body><u>Test</u></body>';

        // loop over attachments
        documentsInstances.each{ documentsInstance->
            attachBytes documentsInstance.filename , 'text/plain', s3Service.getBytes(session.uid, documentsInstance.filename);
        }
    }
}

这应附加多个文件。

如果它引发了一个关于无法找到attachBytes方法的错误,则可能需要显式调用owner.attachBytes,这应该引用外部sendMail闭包。


根据评论更新:

Async插件看起来像是普通的邮件插件。普通邮件插件的文档描述了how to use multiple attachments

这看起来像是:

   // loop over attachments
    documentsInstances.each{ documentsInstance->
        attach documentsInstance.filename , 'text/plain', s3Service.getBytes(session.uid, documentsInstance.filename);
      //^^^^^^ Notice, just 'attach', not 'attachBytes'
    }

我不知道您正在使用的S3插件,但如果有办法从中检索InputStreamSource,则可以直接将字节流式传输到邮件插件,而不是加载它们进入记忆。