如何使用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\", iss);
但我们例外:   传入的资源包含一个开放流:无效参数。 JavaMail需要一个InputStreamSource来为每个调用创建一个新的流。     
已邀请:
对于内存中生成的文件,可以使用ByteArrayResource。只需使用来自Apache Commons的IOUtils转换InputStream对象。这很简单:
    helper.addAttachment(\"attachement\",
    new ByteArrayResource(IOUtils.toByteArray(inputStream)));
    
看看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(\"test@host.com\");

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)附件是“ 6”接口
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(\"from@from.com\");
    helper.setTo(\"to@to.com\");
    helper.setReplyTo(\"replyTo@replyTo.com\");
    helper.setText(\"stub\", false);
    helper.addAttachment(\"document.txt\", attachment);
    javaMailSender.send(message);
}
2)附件是“ 8”接口
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(\"from@from.com\");
        helper.setTo(\"to@to.com\");
        helper.setReplyTo(\"replyTo@replyTo.com\");
        helper.setText(\"stub\", false);
        helper.addAttachment(\"document.txt\", attachment);
        javaMailSender.send(message);
    }
说明:   传入的资源包含一个开放流:无效参数。   JavaMail需要一个InputStreamSource来为它创建一个新的流   每个电话。 如果开发人员使用ѭ6的实现并在
isOpen()
方法中返回ѭ11,则可能会出现此消息。 方法
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;
   }
   //...
}
    

要回复问题请先登录注册