Code, Learn

Spring-mail: gestire le notifiche email in Spring

30 Aprile 2020 - 3 minuti di lettura

Nell’ultimo periodo lavorativo ho avuto la necessità di studiare come implementare un sistema di notifica via email all’interno di un progetto ed è così che mi sono imbattuta in spring-mail.

Che cosa ho imparato? Ve lo mostro in questo articolo presentandovi un piccolo progetto che permette di inviare email.

Spring-mail: configurazione

È sufficiente partire con un progetto Spring Boot e aggiungere la dipendenza spring-mail.

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

A questo punto ho aggiunto le proprietà per la configurazione all’interno del file application.yml. Ho specificato i valori di host (ho usato il server SMTP di Gmail), porta (specifica per il TLS) e username (l’indirizzo Gmail). Per quanto riguarda la password, non ho usato la mia ma ne ho creata una specifica per l’applicazione in modo che sia autorizzata ad accedere all’account Google sul quale deve essere attivata l’autenticazione a due fattori.

spring:
 mail:
  host: smtp.gmail.com
  port: 587
  username: <login user to smtp server>
  password: <app password>
  properties:
   mail:
    smtp:
     auth: true
     starttls:
      enable: true
     ssl:
      trust: smtp.gmail.com

Impostando queste proprietà è possibile avere l’inizializzazione del JavaMailSender che si occuperà dell’invio della email e sarebbero già sufficienti per passare all’implementazione.

Spring-mail: classe EmailConfiguration

Per rendere l’applicazione più configurabile ho pensato di aggiungere altre proprietà per gestire il destinatario, l’oggetto e il corpo dell’email così da non dover modificare il codice qualora questi valori dovessero cambiare.

email:
 to: "<recipient email>"
 subject: "Cosa abbiamo imparato"
 body: "È uscito l’ultimo numero della rubrica!"

Per rendere disponibili queste proprietà all’interno del codice ho creato una classe di configurazione.

@Configuration
@ConfigurationProperties(prefix = "email")
public class EmailConfiguration {

 private String to;
 private String subject;
 private String body;

 // Getter and setter

}

Spring-mail: implementazione di EmailServiceImpl e test

E’ finalmente è arrivato il momento di passare all’implementazione del servizio necessario per l’invio dell’email.

public class EmailServiceImpl {

 final JavaMailSender javaMailSender;
 final EmailConfiguration emailConfiguration;

 public EmailServiceImpl(JavaMailSender javaMailSender, EmailConfiguration emailConfiguration) {
  this.javaMailSender = javaMailSender;
  this.emailConfiguration = emailConfiguration;
 }

 public void sendEmail() {
  SimpleMailMessage message = new SimpleMailMessage();
  message.setTo(emailConfiguration.getTo());
  message.setSubject(emailConfiguration.getSubject());
  message.setText(emailConfiguration.getBody());
  javaMailSender.send(message);
 }

}

Ho istanziato un oggetto SimpleMailMessage per il quale ho settato le proprietà custom (è possibile configurare altre proprietà) e infine, sfruttando l’istanza di JavaMailSender e il suo metodo send, ho realizzato la magia. Il gioco è fatto!

Questo servizio potrà essere chiamato da qualsiasi punto dell’applicazione, per esempio da un controller REST oppure da un task schedulato. Nel mio caso ho deciso di sfruttare una classe di test per verificarne l’effettivo funzionamento.

Il test è andato a buon fine, come potete vedere nell’immagine seguente relativa alla mia casella di posta.

Conclusioni

Ovviamente è possibile modificare come si preferisce il corpo dell’email, avere allegati e usare altri server SMTP. Con questo piccolo esempio ho potuto constatare quanto sia semplice avere un sistema di notifica via email che richiede poco tempo di sviluppo, poche righe di codice e adattabile con qualche modifica in diversi ambiti.

Articolo scritto da