Senden Sie eine E-Mail mit Anhängen von JavaMailSender von SpringFramework

Dies ist ein kurzer Artikel zum Versenden von E-Mails mit SpringFramework. Ich werde einige Beispiele nennen und ein beliebtes Problem aufzeigen.

Es ist eine einfache Aufgabe, die folgendermaßen umgesetzt werden könnte:

public void send(String subject, String from, String to, File file) throws MessagingException { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setSubject(subject); helper.setFrom(from); helper.setTo(to); helper.setReplyTo(from); helper.setText("stub", false); helper.addAttachment("document.txt", file); javaMailSender.send(message); } 

Es ist jedoch keine typische Situation, wenn die Webanwendung direkt mit dem Dateisystem arbeitet. Betrachten wir das Beispiel, wenn wir das Dokument im Speicher erstellen und es an unsere E-Mail anhängen möchten.

In der MimeMessageHelper- Klasse gibt es einige Methoden, die uns helfen könnten:

 public class MimeMessageHelper { ... public void addAttachment(String attachmentFilename, InputStreamSource inputStreamSource) { ... } public void addAttachment(String attachmentFilename, DataSource dataSource) throws MessagingException { ... } } 

Sehen wir uns einige Beispiele an.

1. Anhang ist eine InputStreamSource-Schnittstelle

Es ist schwierig, da der Entwickler in diesem Fall eine IllegalArgumentException mit der folgenden Meldung erhalten könnte:

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

Dies geschieht, weil die Methode MimeMessageHelper # addAttachment () einer speziellen Prüfung unterzogen wird :

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

Beispielsweise gibt die Implementierung InputStreamResource immer true von der Methode isOpen () zurück , die es unmöglich macht, diese Implementierung als Anhang zu verwenden:

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

Das Arbeitsbeispiel ist:

 public void send() { try { final ByteArrayOutputStream stream = createInMemoryDocument("test document text"); final InputStreamSource attachment = new ByteArrayResource(stream.toByteArray()); sendMimeMessageWithAttachments( "subject", "random@random.com", "random@random.com", attachment); } catch (IOException | MailException | MessagingException e) { logger.warn(e.getMessage(), e); } } private void sendMimeMessageWithAttachments(String subject, String from, String to, InputStreamSource source) throws MessagingException { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setSubject(subject); helper.setFrom(from); helper.setTo(to); helper.setReplyTo(from); helper.setText("stub", false); helper.addAttachment("document.txt", source); javaMailSender.send(message); } private ByteArrayOutputStream createInMemoryDocument(String documentBody) throws IOException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); outputStream.write(documentBody.getBytes()); return outputStream; } 

2. Anhang ist eine DataSource-Schnittstelle

Dieses Beispiel enthält keine Fallstricke und ist ziemlich klar:

 public void send() { try { final ByteArrayOutputStream document = createInMemoryDocument("test document text"); final InputStream inputStream = new ByteArrayInputStream(document.toByteArray()); final DataSource attachment = new ByteArrayDataSource(inputStream, "application/octet-stream"); sendMimeMessageWithAttachments( "subject", "anonymous@xyz-mail.com", "anonymous@xyz-mail.com", attachment); } catch (IOException | MailException | MessagingException e) { logger.warn(e.getMessage(), e); } } private void sendMimeMessageWithAttachments(String subject, String from, String to, DataSource dataSource) throws MessagingException { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setSubject(subject); helper.setFrom(from); helper.setTo(to); helper.setReplyTo(from); helper.setText("stub", false); helper.addAttachment("document.txt", dataSource); javaMailSender.send(message); } 

Es wäre hilfreich, einen Blick auf das Federreferenzkapitel zu werfen.

Source: https://habr.com/ru/post/de439176/


All Articles