it-swarm.com.de

wie benutzt man spring send email mit anhang mit InputStream?

die Situation ist wie folgt:

erstens erzeugen wir eine Datei im Speicher, wir können ein InputStream-Objekt erhalten. Zweitens muss das InputStream-Objekt als Anhang einer E-Mail gesendet werden. Die Sprache ist Java. Wir verwenden spring, um E-Mails zu senden.

ich finde eine Menge, aber ich kann nicht finden, wie ich einen E-Mail-Anhang mit InputStream verschicke ... Ich versuche das so zu machen:

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

aber wir die ausnahme:

Übergebene Ressource enthält einen offenen Stream: ungültiges Argument. JavaMail erfordert eine InputStreamSource, die für jeden Aufruf einen neuen Stream erstellt.

23
kaka2008

Für im Speicher erzeugte Dateien können Sie ByteArrayResource verwenden. Konvertieren Sie einfach Ihr InputStream-Objekt mit IOUtils von Apache Commons. Es ist ganz einfach:

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

Schauen Sie sich das Kapitel "Spring Reference" an 24.3 Verwenden des JavaMail MimeMessageHelper

Das Beispiel ist von dort, ich glaube, Sie möchten es tun:

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);
5
Ralph

Sie können InputStreamSource einfach implementieren und nach Bedarf frischen InputStream darin übergeben:

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 - Sie können ein StringBuilder-Objekt für ein Beispiel erstellen 

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

Die Arbeitsbeispiele sind:

1) Anhang ist eine InputStreamSource-Schnittstelle

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) Anhang ist eine DataSource-Schnittstelle

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);
    }

Die Erklärung:

Übergebene Ressource enthält ein offenes Stream: ungültiges Argument. JavaMail erfordert eine InputStreamSource, die für jeden Aufruf einen neuen Stream für Erstellt.

Diese Meldung kann angezeigt werden, wenn der Entwickler eine Implementierung von InputStreamSource verwendet, die true in der isOpen()-Methode zurückgibt.

Es gibt eine spezielle Prüfung in der Methode 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() gibt immer true zurück, sodass diese Implementierung nicht als Anhang verwendet werden kann:

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