Envoyer un e-mail avec des pièces jointes par JavaMailSender de SpringFramework

Il s'agit d'un court article sur la façon d'envoyer des e-mails avec SpringFramework. Je fournirai quelques exemples et je montrerai un problème populaire .

C'est une tâche facile qui pourrait être implémentée comme ceci:

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

Mais ce n'est pas une situation typique lorsque l'application Web fonctionne directement avec le système de fichiers. Prenons l'exemple lorsque nous créons le document en mémoire et que nous voulons le joindre à notre e-mail.

Il existe quelques méthodes dans la classe MimeMessageHelper qui pourraient nous aider:

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

Voyons quelques exemples.

1. La pièce jointe est une interface InputStreamSource

C'est délicat, car dans ce cas, le développeur pourrait obtenir une exception IllegalArgumentException avec un message:

"La ressource transmise contient un flux ouvert: argument non valide. JavaMail nécessite un InputStreamSource qui crée un nouveau flux pour chaque appel. "

Cela se produit car il existe une vérification spéciale dans la méthode MimeMessageHelper # addAttachment () :

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

Par exemple, l'implémentation InputStreamResource renvoie toujours true à partir de la méthode isOpen () qui rend impossible l'utilisation de cette implémentation en tant que pièce jointe:

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

L'exemple de travail est:

 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. La pièce jointe est une interface DataSource

Cet exemple ne contient pas d'embûches et est assez clair:

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

Il serait utile de jeter un œil au chapitre de référence du printemps .

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


All Articles