Guide du courrier électronique de printemps

Guide de courriel de printemps

1. Vue d'ensemble

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

Lectures complémentaires:

Inscription - Activer un nouveau compte par email

Vérifiez les nouveaux utilisateurs enregistrés en leur envoyant un jeton de vérification par courrier électronique avant de leur permettre de se connecter - à l'aide de Spring Security.

Read more

Actionneur de botte de printemps

Une introduction rapide aux actionneurs Spring Boot: utilisation et extension de celles existantes, configuration et déploiement personnel.

Read more

2. Dépendances Maven

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

2.1. Printemps

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


    org.springframework
    spring-context-support
    5.0.1.RELEASE

La dernière version peut être trouvéehere.

2.2. Botte de printemps

Et pour Spring Boot:


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

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

3. Propriétés du serveur de messagerie

Les interfaces et les classes pour la prise en charge du courrier Java dans la structure Spring sont organisées comme suit:

  1. MailSender interface: l'interface de niveau supérieur qui fournit des fonctionnalités de base pour l'envoi d'e-mails simples

  2. JavaMailSender interface: la sous-interface desMailSender ci-dessus. Il prend en charge les messages MIME et est principalement utilisé en conjonction avec la classeMimeMessageHelper pour la création d'unMimeMessage. Il est recommandé d’utiliser le mécanismeMimeMessagePreparator avec cette interface

  3. JavaMailSenderImpl class: fournit une implémentation de l'interfaceJavaMailSender. Il prend en charge lesMimeMessage etSimpleMailMessage

  4. SimpleMailMessage class: utilisé pour créer un message électronique simple comprenant les champs from, to, cc, subject et text

  5. MimeMessagePreparator interface: fournit une interface de rappel pour la préparation des messages MIME

  6. MimeMessageHelper class: classe d'assistance pour la création de messages MIME. Il offre une prise en charge des images, des pièces jointes standard et du contenu textuel dans une présentation 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 peut être défini à l'aide desJavaMailSenderImpl.

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 fichierapplication.properties en utilisant l'espace de nomsspring.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, donc 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 email via le serveur SMTP Gmail. Jetez un œil auxdocumentation pour voir les propriétés du serveur SMTP de courrier sortant Gmail.

Notre fichierapplication.the properties 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 celink 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 vosapplication.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

Sachez qu'Amazon exige que vous vérifiiez vos informations d'identification avant de les utiliser. Suivez leslink 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 lesJavaMailSenderusmentionnés pour envoyer un e-mail.

Étant donné que le framework Spring 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 rédiger et envoyer un e-mail simple sans aucune pièce jointe:

@Component
public class EmailServiceImpl implements EmailService {

    @Autowired
    public JavaMailSender emailSender;

    public void sendSimpleMessage(
      String to, String subject, String text) {
        ...
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);
        message.setSubject(subject);
        message.setText(text);
        emailSender.send(message);
        ...
    }
}

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.

Par exemple, nous souhaitons envoyer un e-mail de confirmation de commande avec une facture jointe. Dans ce cas, nous devrions utiliser un message multipartieMIME de la bibliothèqueJavaMail au lieu deSimpleMailMessage. Spring prend en charge la messagerieJavaMail avec la classeorg.springframework.mail.javamail.MimeMessageHelper.

Tout d'abord, nous allons ajouter une méthode auxEmailServiceImpl pour envoyer des e-mails avec des pièces jointes:

@Override
public void sendMessageWithAttachment(
  String to, String subject, String text, String pathToAttachment) {
    // ...

    MimeMessage message = emailSender.createMimeMessage();

    MimeMessageHelper helper = new MimeMessageHelper(message, true);

    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. Modèle de courrier électronique simple

La classeSimpleMailMessage prend en charge la mise en forme du texte. Nous pouvons créer un modèle pour les emails en définissant un modèle de bean dans notre 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;
}

Maintenant, nous pouvons utiliser ce bean comme modèle pour le courrier électronique et il suffit de fournir les paramètres nécessaires au modèle:

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

5. Gestion des erreurs d'envoi

JavaMail fournitSendFailedException pour gérer les situations où un message ne peut pas être envoyé. Mais il est possible que vous n'obteniez pas cette exception lors de l'envoi d'un e-mail à une adresse incorrecte. La raison est la suivante:

Les spécifications de protocole pour SMTP dans RFC 821 spécifient le code retour 550 que le serveur SMTP doit renvoyer lorsqu’il tente d’envoyer un courrier électronique à une adresse incorrecte. Mais la plupart des serveurs SMTP publics ne le font pas. Au lieu de cela, ils envoient un e-mail «livraison échouée» à votre boîte, ou ne donnent aucun retour.

Par exemple, le serveur SMTP de Gmail envoie un message indiquant que la livraison a échoué. Et vous n'obtenez aucune exception dans votre programme.

Donc, il y a peu d'options que vous pouvez utiliser pour gérer ce cas:

  1. Attrapez lesSendFailedException, qui ne peuvent jamais être lancés

  2. Vérifiez votre boîte aux lettres d’expéditeur si le message «échec de la livraison» a été reçu 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 courriers électroniques à partir d'une application Spring Boot.

L'implémentation de tous ces exemples et extraits de code peut être trouvée dans lesGitHub project; il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.