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 InputStreamSourceC'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 {
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 DataSourceCet 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 .