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-SchnittstelleEs 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 {
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-SchnittstelleDieses 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.