Подтвердить что ты не робот

Как использовать spring отправить письмо с вложением, используя InputStream?

ситуация такова:

сначала мы создаем файл в памяти, мы можем получить объект InputStream  во-вторых, объект InputStream должен быть отправлен как вложение электронной почты.. язык java, мы используем spring для отправки электронной почты.

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

InputStreamSource iss = null;
                    iss = new InputStreamResource(new FileInputStream("c:\\a.txt"));
MimeMessageHelper message = new MimeMessageHelper(mimeMessage,
                        true, "UTF-8");
message.addAttachment("attachment", iss1);

но мы исключение:

Входящий ресурс содержит открытый поток: недопустимый аргумент. JavaMail требует InputStreamSource, который создает новый поток для каждого вызова.

4b9b3361

Ответ 1

Для файлов, сгенерированных в памяти, вы можете использовать ByteArrayResource. Просто преобразуйте объект InputStream с помощью IOUtils из Apache Commons. Это довольно просто:

    helper.addAttachment("attachement",
    new ByteArrayResource(IOUtils.toByteArray(inputStream)));

Ответ 2

Посмотрите справочную главу spring 24.3 Использование JavaMail MimeMessageHelper

Пример оттуда, я думаю, он хочет, чтобы вы хотели:

JavaMailSenderImpl sender = new JavaMailSenderImpl();
sender.setHost("mail.host.com");

MimeMessage message = sender.createMimeMessage();

// use the true flag to indicate you need a multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setTo("[email protected]");

helper.setText("Check out this image!");

// let attach the infamous windows Sample file (this time copied to c:/)
FileSystemResource file = new FileSystemResource(new File("c:/Sample.jpg"));
helper.addAttachment("CoolImage.jpg", file);

sender.send(message);

Ответ 3

Вы можете сделать простую реализацию InputStreamSource и передать в нее свежий InputStream, если хотите:

InputStreamSource iss = new InputStreamSource() {
    @Override
    public InputStream getInputStream() throws IOException {
        // provide fresh InputStream
        return new FileInputStream("c:\\a.txt");
    }
}
MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, "UTF-8");
message.addAttachment("attachment", iss);

Ответ 4

//inlineFileObjectCreated - вы можете создать объект StringBuilder для примера

ByteArrayDataSource source = new ByteArrayDataSource("file name", "contentType", inlineFileObjectCreated.getBytes() );

                JavaMailSender mailSender = (JavaMailSender) ServicesHome.getService("javaMailSender");
                MimeMessage mimeMessage = mailSender.createMimeMessage();
                MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
                mimeMessageHelper.setTo(toArray);           
                mimeMessageHelper.setSubject("");
                mimeMessageHelper.setText("");
                mimeMessageHelper.addAttachment("filename", source);
                mailSender.send(mimeMessageHelper.getMimeMessage());

/////////////////////////////////////////////

import javax.activation.DataSource;

    public class ByteArrayDataSource implements DataSource {
        byte[] bytes;
        String contentType;
        String name;

        public ByteArrayDataSource( String name, String contentType, byte[] bytes ) {
          this.name = name;
          this.bytes = bytes;
          this.contentType = contentType;
        }

        public String getContentType() {
          return contentType;
        }

        public InputStream getInputStream() {
          return new ByteArrayInputStream(bytes);
        }

        public String getName() {
          return name;
        }

        public OutputStream getOutputStream() throws IOException {
          throw new FileNotFoundException();
        }
      }