Leitfaden für Spring Email

1. Übersicht

In diesem Artikel werden die Schritte beschrieben, die zum Senden von E-Mails sowohl von einer einfachen Vanilla Spring-Anwendung als auch von einer Spring Boot-Anwendung erforderlich sind, wobei die erstere die JavaMail-Bibliothek und die letztere die Spring-Boot-Starter-Mail- Abhängigkeit verwendet .

2. Maven-Abhängigkeiten

Zuerst müssen wir die Abhängigkeiten zu unserer pom.xml hinzufügen .

2.1. Frühling

Zur Verwendung im einfachen Vanille-Spring-Framework fügen wir Folgendes hinzu:

 org.springframework spring-context-support 5.2.8.RELEASE 

Die neueste Version finden Sie hier.

2.2. Frühlingsstiefel

Und für Spring Boot:

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

Die neueste Version ist im Maven Central-Repository verfügbar.

3. Mail Server Eigenschaften

Die Schnittstellen und Klassen für die Java Mail-Unterstützung im Spring Framework sind wie folgt organisiert:

  1. MailSender- Oberfläche : Die Oberfläche der obersten Ebene, die grundlegende Funktionen zum Senden einfacher E-Mails bietet
  2. JavaMailSender- Schnittstelle : Die Subschnittstelle des oben genannten MailSender . Es unterstützt MIME-Nachrichten und wird hauptsächlich in Verbindung mit der MimeMessageHelper- Klasse zum Erstellen einer MimeMessage verwendet . Es wird empfohlen, den MimeMessagePreparator- Mechanismus für diese Schnittstelle zu verwenden
  3. JavaMailSenderImpl- Klasse : Bietet eine Implementierung der JavaMailSender- Schnittstelle. Es unterstützt MimeMessage und SimpleMailMessage
  4. SimpleMailMessage- Klasse : Wird zum Erstellen einer einfachen E-Mail-Nachricht verwendet, die die Felder from, to, cc, subject und text enthält
  5. MimeMessagePreparator- Schnittstelle : Bietet eine Rückrufschnittstelle für die Vorbereitung von MIME-Nachrichten
  6. MimeMessageHelper- Klasse : Hilfsklasse zum Erstellen von MIME-Nachrichten. Es bietet Unterstützung für Bilder, typische E-Mail-Anhänge und Textinhalte in einem HTML-Layout

In den folgenden Abschnitten zeigen wir, wie diese Schnittstellen und Klassen verwendet werden.

3.1. Spring Mail Server-Eigenschaften

Mail-Eigenschaften, die zum Angeben des SMTP-Servers erforderlich sind, können mithilfe von JavaMailSenderImpl definiert werden .

Für Google Mail kann dies beispielsweise wie folgt konfiguriert werden:

@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. Eigenschaften des Spring Boot Mail-Servers

Sobald die Abhängigkeit besteht, müssen Sie im nächsten Schritt die Eigenschaften des Mailservers in der Datei application.properties mithilfe des Namespace spring.mail. * Angeben .

Die Eigenschaften für Google Mail SMTP Server können beispielsweise wie folgt angegeben werden:

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 

Einige SMTP-Server erfordern eine TLS-Verbindung, daher wird die Eigenschaft spring.mail.properties.mail.smtp.starttls.enable verwendet, um eine TLS-geschützte Verbindung zu aktivieren.

3.2.1. Google Mail SMTP-Eigenschaften

Wir können eine E-Mail über den Google Mail-SMTP-Server senden. In der Dokumentation finden Sie die Eigenschaften des SMTP-Servers für ausgehende Google Mail-E-Mails.

Unsere Anwendung. Die Eigenschaftendatei ist bereits für die Verwendung von Google Mail SMTP konfiguriert (siehe vorherigen Abschnitt).

Beachten Sie, dass das Kennwort für Ihr Konto kein gewöhnliches Kennwort sein sollte, sondern ein für Ihr Google-Konto generiertes Anwendungskennwort. Folgen Sie diesem Link, um die Details anzuzeigen und Ihr Google App-Passwort zu generieren.

3.2.2. SES SMTP-Eigenschaften

Um E-Mails mit dem Amazon SES-Dienst zu senden, legen Sie Ihre application.properties wie folgt fest:

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

Beachten Sie bitte, dass Sie bei Amazon Ihre Anmeldeinformationen überprüfen müssen, bevor Sie sie verwenden können. Folgen Sie dem Link, um Ihren Benutzernamen und Ihr Passwort zu überprüfen.

4. E-Mail senden

Sobald das Abhängigkeitsmanagement und die Konfiguration eingerichtet sind, können wir mit dem oben genannten JavaMailSender eine E-Mail senden.

Da sowohl das einfache Vanilla Spring-Framework als auch die Boot-Version das Verfassen und Senden von E-Mails auf ähnliche Weise handhaben, müssen wir in den folgenden Unterabschnitten nicht zwischen beiden unterscheiden.

4.1. Senden einfacher E-Mails

Lassen Sie uns zunächst eine einfache E-Mail-Nachricht ohne Anhänge verfassen und senden:

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

Beachten Sie , dass , obwohl es nicht zwingend notwendig ist die bieten von Adresse, würden viele SMTP - Server solche Nachrichten zurückweisen. Aus diesem Grund verwenden wir in unserer EmailService- Implementierung die E-Mail-Adresse [email protected] .

4.2. Senden von E-Mails mit Anhängen

Manchmal reicht das einfache Messaging von Spring für unsere Anwendungsfälle nicht aus.

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. Überprüfen Sie Ihr Absenderpostfach für einige Zeit auf die Meldung "Zustellung fehlgeschlagen". Dies ist nicht einfach und der Zeitraum ist nicht festgelegt
  3. Wenn Ihr Mailserver überhaupt kein Feedback gibt, können Sie nichts tun

6. Fazit

In diesem kurzen Artikel haben wir gezeigt, wie Sie E-Mails von einer Spring Boot-Anwendung aus einrichten und senden.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie auf GitHub.