Guide de Spring Email

1. Vue d'ensemble

Dans cet article, nous allons parcourir les étapes nécessaires pour envoyer des e-mails à la fois à partir d'une simple application Spring vanilla ainsi qu'à partir d'une application Spring Boot, la première utilisant la bibliothèque JavaMail et la seconde utilisant la dépendance spring-boot-starter-mail .

2. Dépendances de Maven

Tout d'abord, nous devons ajouter les dépendances à notre pom.xml .

2.1. Printemps

Pour une utilisation dans le framework Spring à la vanille, nous ajouterons:

 org.springframework spring-context-support 5.2.8.RELEASE 

La dernière version peut être trouvée ici.

2.2. Botte de printemps

Et pour Spring Boot:

 org.springframework.boot spring-boot-starter-mail 2.2.5.RELEASE 

La dernière version est disponible dans le référentiel Maven Central.

3. Propriétés du serveur de messagerie

Les interfaces et classes pour la prise en charge de la messagerie Java dans le framework Spring sont organisées comme suit:

  1. Interface MailSender : l' interface de premier niveau qui fournit des fonctionnalités de base pour l'envoi d'e-mails simples
  2. Interface JavaMailSender : la sous- interface du MailSender ci-dessus. Il prend en charge les messages MIME et est principalement utilisé en conjonction avec laclasse MimeMessageHelper pour la création d'un MimeMessage . Il est recommandé d'utiliser lemécanisme MimeMessagePreparator avec cette interface
  3. Classe JavaMailSenderImpl : fournit une implémentation de l'interface JavaMailSender . Il prend en charge MimeMessage et SimpleMailMessage
  4. Classe SimpleMailMessage : utilisée pour créer un message électronique simple comprenant les champs from, to, cc, subject et text
  5. Interface MimeMessagePreparator : fournit une interface de rappel pour la préparation des messages MIME
  6. Classe MimeMessageHelper : classe d' assistance pour la création de messages MIME. Il prend en charge les images, les pièces jointes typiques et le contenu texte dans une mise en page HTML

Dans les sections suivantes, nous montrons comment ces interfaces et classes sont utilisées.

3.1. Propriétés du serveur Spring Mail

Les propriétés de messagerie nécessaires pour spécifier par exemple le serveur SMTP peuvent être définies à l'aide de JavaMailSenderImpl .

Par exemple, pour Gmail, cela peut être configuré comme indiqué ci-dessous:

@Bean public JavaMailSender getJavaMailSender() { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost("smtp.gmail.com"); mailSender.setPort(587); mailSender.setUsername("[email protected]"); mailSender.setPassword("password"); Properties props = mailSender.getJavaMailProperties(); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.debug", "true"); return mailSender; } 

3.2. Propriétés du serveur de messagerie Spring Boot

Une fois la dépendance en place, l'étape suivante consiste à spécifier les propriétés du serveur de messagerie dans le fichier application.properties à l'aide de l' espace de noms spring.mail. * .

Par exemple, les propriétés du serveur SMTP Gmail peuvent être spécifiées comme suit:

spring.mail.host=smtp.gmail.com spring.mail.port=587 spring.mail.username= spring.mail.password= spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true 

Certains serveurs SMTP nécessitent une connexion TLS, c'est pourquoi la propriété spring.mail.properties.mail.smtp.starttls.enable est utilisée pour activer une connexion protégée par TLS.

3.2.1. Propriétés SMTP de Gmail

Nous pouvons envoyer un e-mail via le serveur SMTP de Gmail. Consultez la documentation pour voir les propriétés du serveur SMTP de courrier sortant Gmail.

Notre application.le fichier de propriétés est déjà configuré pour utiliser Gmail SMTP (voir la section précédente).

Notez que le mot de passe de votre compte ne doit pas être un mot de passe ordinaire, mais un mot de passe d'application généré pour votre compte Google. Suivez ce lien pour voir les détails et générer votre mot de passe Google App.

3.2.2. Propriétés SMTP SES

Pour envoyer des e-mails à l'aide du service Amazon SES, définissez votre application.properties comme nous le faisons ci-dessous:

spring.mail.host=email-smtp.us-west-2.amazonaws.com spring.mail.username=username spring.mail.password=password spring.mail.properties.mail.transport.protocol=smtp spring.mail.properties.mail.smtp.port=25 spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true

Veuillez noter qu'Amazon vous demande de vérifier vos informations d'identification avant de les utiliser. Suivez le lien pour vérifier votre nom d'utilisateur et votre mot de passe.

4. Envoi d'un e-mail

Une fois la gestion et la configuration des dépendances en place, nous pouvons utiliser JavaMailSender susmentionné pour envoyer un e-mail.

Étant donné que le framework Spring simple et la version Boot de celui-ci gèrent la composition et l'envoi d'e-mails de la même manière, nous n'aurons pas à faire la distinction entre les deux dans les sous-sections ci-dessous.

4.1. Envoi d'e-mails simples

Commençons par composer et envoyer un e-mail simple sans aucune pièce jointe:

@Component public class EmailServiceImpl implements EmailService { @Autowired private JavaMailSender emailSender; public void sendSimpleMessage( String to, String subject, String text) { ... SimpleMailMessage message = new SimpleMailMessage(); message.setFrom("[email protected]"); message.setTo(to); message.setSubject(subject); message.setText(text); emailSender.send(message); ... } }

Notez que même s'il n'est pas obligatoire de fournir l' adresse d' expédition, de nombreux serveurs SMTP rejetteraient ces messages. C'est pourquoi nous utilisons l'adresse e-mail [email protected] dans notre implémentation EmailService .

4.2. Envoi d'e-mails avec des pièces jointes

Parfois, la simple messagerie de Spring n'est pas suffisante pour nos cas d'utilisation.

For example, we want to send an order confirmation email with an invoice attached. In this case, we should use a MIME multipart message from JavaMail library instead of SimpleMailMessage. Spring supports JavaMail messaging with the org.springframework.mail.javamail.MimeMessageHelper class.

First of all, we'll add a method to the EmailServiceImpl to send emails with attachments:

@Override public void sendMessageWithAttachment( String to, String subject, String text, String pathToAttachment) { // ... MimeMessage message = emailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom("[email protected]"); helper.setTo(to); helper.setSubject(subject); helper.setText(text); FileSystemResource file = new FileSystemResource(new File(pathToAttachment)); helper.addAttachment("Invoice", file); emailSender.send(message); // ... }

4.3. Simple Email Template

SimpleMailMessage class supports text formatting. We can create a template for emails by defining a template bean in our configuration:

@Bean public SimpleMailMessage templateSimpleMessage() { SimpleMailMessage message = new SimpleMailMessage(); message.setText( "This is the test email template for your email:\n%s\n"); return message; }

Now we can use this bean as a template for email and only need to provide the necessary parameters to the template:

@Autowired public SimpleMailMessage template; ... String text = String.format(template.getText(), templateArgs); sendSimpleMessage(to, subject, text);

5. Handling Send Errors

JavaMail provides SendFailedException to handle situations when a message cannot be sent. But it is possible that you won't get this exception while sending an email to the incorrect address. The reason is the following:

The protocol specs for SMTP in RFC 821 specifies the 550 return code that SMTP server should return when attempting to send an email to the incorrect address. But most of the public SMTP servers don't do this. Instead, they send a “delivery failed” email to your box, or give no feedback at all.

For example, Gmail SMTP server sends a “delivery failed” message. And you get no exceptions in your program.

So, there are few options you can go through to handle this case:

  1. Catch the SendFailedException, which can never be thrown
  2. Vérifiez votre boîte aux lettres de l'expéditeur sur le message «Échec de la remise» pendant un certain temps. Ce n'est pas simple et la période n'est pas déterminée
  3. Si votre serveur de messagerie ne donne aucun commentaire, vous ne pouvez rien faire

6. Conclusion

Dans cet article rapide, nous avons montré comment configurer et envoyer des e-mails à partir d'une application Spring Boot.

L'implémentation de tous ces exemples et extraits de code peut être trouvée sur GitHub.