状況は次のとおりです。
まず、メモリ内にファイルを生成します。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が必要です。
メモリで生成されたファイルの場合、ByteArrayResourceを使用できます。 Apache CommonsのIOUtilsを使用して、InputStreamオブジェクトを変換するだけです。それは非常に簡単です:
helper.addAttachment("attachement",
new ByteArrayResource(IOUtils.toByteArray(inputStream)));
春のリファレンスの章を見てください 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);
要求に応じて、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);
// 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();
}
}
実際の例は次のとおりです。
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;
}
//...
}
_