Guida all'email di primavera

1. Panoramica

In questo articolo, esamineremo i passaggi necessari per inviare e-mail sia da una semplice applicazione Spring vanilla che da un'applicazione Spring Boot, la prima utilizzando la libreria JavaMail e la seconda utilizzando la dipendenza spring-boot-starter-mail .

2. Dipendenze di Maven

Innanzitutto, dobbiamo aggiungere le dipendenze al nostro pom.xml .

2.1. Primavera

Per l'uso nel framework Spring in tinta unita, aggiungeremo:

 org.springframework spring-context-support 5.2.8.RELEASE 

L'ultima versione può essere trovata qui.

2.2. Spring Boot

E per Spring Boot:

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

L'ultima versione è disponibile nel repository Maven Central.

3. Proprietà del server di posta

Le interfacce e le classi per il supporto della posta Java nel framework Spring sono organizzate come segue:

  1. Interfaccia MailSender : l' interfaccia di primo livello che fornisce funzionalità di base per l'invio di semplici e-mail
  2. Interfaccia JavaMailSender : la sottointerfaccia del suddetto MailSender . Supporta i messaggi MIME e viene utilizzato principalmente in combinazione con laclasse MimeMessageHelper per la creazione di un MimeMessage . Si consiglia di utilizzare ilmeccanismo MimeMessagePreparator con questa interfaccia
  3. Classe JavaMailSenderImpl : fornisce un'implementazionedell'interfaccia JavaMailSender . Supporta la MIMEMessage e SimpleMailMessage
  4. Classe SimpleMailMessage : utilizzata per creare un semplice messaggio di posta che include i campi da, a, cc, oggetto e testo
  5. Interfaccia MimeMessagePreparator : fornisce un'interfaccia di callback per la preparazione dei messaggi MIME
  6. Classe MimeMessageHelper : classe helper per la creazione di messaggi MIME. Offre supporto per immagini, allegati di posta tipici e contenuto di testo in un layout HTML

Nelle sezioni seguenti, mostriamo come vengono utilizzate queste interfacce e classi.

3.1. Proprietà del server di posta Spring

Le proprietà di posta necessarie per specificare, ad esempio, il server SMTP possono essere definite utilizzando JavaMailSenderImpl .

Ad esempio, per Gmail questo può essere configurato come mostrato di seguito:

@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. Proprietà del server di posta Spring Boot

Una volta stabilita la dipendenza, il passaggio successivo consiste nello specificare le proprietà del server di posta nel file application.properties utilizzando lo spazio dei nomi spring.mail. * .

Ad esempio, le proprietà per il server SMTP di Gmail possono essere specificate come:

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 

Alcuni server SMTP richiedono una connessione TLS, quindi la proprietà spring.mail.properties.mail.smtp.starttls.enable viene utilizzata per abilitare una connessione protetta da TLS.

3.2.1. Proprietà SMTP di Gmail

Possiamo inviare un'e-mail tramite il server SMTP di Gmail. Dai un'occhiata alla documentazione per vedere le proprietà del server SMTP della posta in uscita di Gmail.

Il nostro file application.the proprietà è già configurato per utilizzare Gmail SMTP (vedere la sezione precedente).

Tieni presente che la password del tuo account non deve essere una normale password, ma una password dell'applicazione generata per il tuo account Google. Segui questo link per vedere i dettagli e per generare la tua password per l'app Google.

3.2.2. Proprietà SES SMTP

Per inviare e-mail utilizzando il servizio Amazon SES, imposta le proprietà application.properties come di seguito:

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

Tieni presente che Amazon richiede di verificare le tue credenziali prima di utilizzarle. Segui il link per verificare il tuo nome utente e la password.

4. Invio di e-mail

Una volta che la gestione delle dipendenze e la configurazione sono in atto, possiamo utilizzare il suddetto JavaMailSender per inviare un'e-mail.

Poiché sia ​​il semplice framework Spring vanilla che la versione Boot di esso gestiscono la composizione e l'invio di e-mail in modo simile, non dovremo distinguere tra i due nelle sottosezioni seguenti.

4.1. Invio di semplici e-mail

Per prima cosa componiamo e inviamo un semplice messaggio di posta elettronica senza allegati:

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

Notare che anche se non è obbligatorio fornire l' indirizzo del mittente, molti server SMTP rifiuterebbero tali messaggi. Ecco perché utilizziamo l'indirizzo e-mail [protetto da posta elettronica] nella nostra implementazione del servizio di posta elettronica .

4.2. Invio di e-mail con allegati

A volte la semplice messaggistica di Spring non è sufficiente per i nostri casi d'uso.

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. Controlla la tua casella di posta del mittente sul messaggio "recapito non riuscito" per un certo periodo di tempo. Questo non è semplice e il periodo di tempo non è determinato
  3. Se il tuo server di posta non fornisce alcun feedback, non puoi fare nulla

6. Conclusione

In questo rapido articolo, abbiamo mostrato come configurare e inviare e-mail da un'applicazione Spring Boot.

L'implementazione di tutti questi esempi e frammenti di codice può essere trovata su GitHub.