我正在使用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"
答案 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
,则可以直接将字节流式传输到邮件插件,而不是加载它们进入记忆。