web-dev-qa-db-ja.com

InputStreamとSpringを使用して添付ファイル付きのメールを送信するにはどうすればよいですか?

状況は次のとおりです。

まず、メモリ内にファイルを生成します。InputStreamオブジェクトを取得できます。次に、InputStreamオブジェクトをメールの添付ファイルとして送信する必要があります。言語はJavaで、Springを使ってメールを送信します。

たくさんの情報を見つけましたが、InputStreamを使用してメールの添付ファイルを送信する方法が見つかりません。私はこのようにしようとします:

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

しかし、私は例外を受け取ります:

渡されたリソースに開いているストリームが含まれています:引数が無効です。 JavaMailには、呼び出しごとに新しいストリームを作成するInputStreamSourceが必要です。

30
kaka2008

メモリで生成されたファイルの場合、ByteArrayResourceを使用できます。 Apache CommonsのIOUtilsを使用して、InputStreamオブジェクトを変換するだけです。それは非常に簡単です:

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

春のリファレンスの章を見てください 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's 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);
6
Ralph

要求に応じて、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);
1
Michal Moravcik

// 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();
        }
      }
0
Sujith

実際の例は次のとおりです。

1)添付ファイルはInputStreamSourceインターフェースです

_public void send() throws IOException, MessagingException {
    final ByteArrayOutputStream stream = createInMemoryDocument("body");
    final InputStreamSource attachment = new ByteArrayResource(stream.toByteArray());
    final MimeMessage message = javaMailSender.createMimeMessage();
    final MimeMessageHelper helper = new MimeMessageHelper(message, true);
    helper.setSubject("subject");
    helper.setFrom("[email protected]");
    helper.setTo("[email protected]");
    helper.setReplyTo("[email protected]");
    helper.setText("stub", false);
    helper.addAttachment("document.txt", attachment);
    javaMailSender.send(message);
}
_

2)添付ファイルはDataSourceインターフェースです

_public void send() throws IOException, MessagingException {
        final ByteArrayOutputStream document = createInMemoryDocument("body");
        final InputStream inputStream = new ByteArrayInputStream(document.toByteArray());
        final DataSource attachment = new ByteArrayDataSource(inputStream, "application/octet-stream");
        final MimeMessage message = javaMailSender.createMimeMessage();
        final MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setSubject("subject");
        helper.setFrom("[email protected]");
        helper.setTo("[email protected]");
        helper.setReplyTo("[email protected]");
        helper.setText("stub", false);
        helper.addAttachment("document.txt", attachment);
        javaMailSender.send(message);
    }
_

説明:

渡されたリソースに開いているストリームが含まれています:引数が無効です。 JavaMailには、呼び出しごとに新しいストリームを作成するInputStreamSourceが必要です。

このメッセージは、開発者がisOpen()メソッドでInputStreamSourceを返すtrueの実装を使用している場合に表示される可能性があります。

メソッドMimeMessageHelper#addAttacment()には特別なチェックがあります:

_public void addAttachment(String attachmentFilename, InputStreamSource inputStreamSource, String contentType) {
    //...
    if (inputStreamSource instanceof Resource && ((Resource) inputStreamSource).isOpen()) {
        throw new IllegalArgumentException(
        "Passed-in Resource contains an open stream: invalid argument. " +
        "JavaMail requires an InputStreamSource that creates a fresh stream for every call.");
    }
    //...
}
_

InputStreamResource#isOpen()は常にtrueを返すため、この実装を添付ファイルとして使用することはできません。

_public class InputStreamResource extends AbstractResource {
   //...
   @Override
   public boolean isOpen() {
      return true;
   }
   //...
}
_
0