Отправляйте несколько вложений с помощью Grains Async Mail Plugin - PullRequest
2 голосов
/ 13 марта 2012

Я использую плагин Grains 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);
            }
    }//

}

Теперь приведенный выше код работает в значительной степени корректно, но он отправляет электронное письмо для каждого вложения, я не уверен, как я могу переместить этот цикл внутри отправки почты, чтобы я мог отправить несколько вложений в электронном письме.

Также есть способ отправить электронное письмо, чтобы мне не нужно было загружать весь файл в байтах []?

Я использую 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 Ответ

3 голосов
/ 13 марта 2012

Вам нужен ваш цикл внутри адрес электронной почты:

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 выглядит так, как будто он относится к обычному почтовому плагину. Документы обычного почтового плагина описывают как использовать несколько вложений .

Это будет выглядеть примерно так:

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

Я не знаю, какой плагин S3 вы используете, но если есть способ извлечь из него InputStreamSource, похоже, что вы можете передавать байты непосредственно в почтовый плагин, вместо загрузки их в память .

...