Leitfaden für Spring Email

Anleitung zu Spring Email

1. Überblick

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 BibliothekJavaMailund die letztere diespring-boot-starter-mailverwendet. s Abhängigkeit.

Weitere Lektüre:

Registrierung - Aktivieren Sie ein neues Konto per E-Mail

Überprüfen Sie neu registrierte Benutzer, indem Sie ihnen ein Bestätigungs-Token per E-Mail senden, bevor Sie ihnen die Anmeldung erlauben - mit Spring Security.

Read more

Federbeinantrieb

Eine kurze Einführung in Spring Boot Actuators - unter Verwendung und Erweiterung der vorhandenen, Konfiguration und Rolling Ihrer eigenen.

Read more

2. Maven-Abhängigkeiten

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

2.1. Frühling

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


    org.springframework
    spring-context-support
    5.0.1.RELEASE

Die neueste Version finden Sie unterhere.

2.2. Spring Boot

Und für Spring Boot:


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

Die neueste Version ist im Repository vonMaven Centralverfügbar.

3. Mailserver-Eigenschaften

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

  1. MailSender interface: Die Benutzeroberfläche der obersten Ebene, die grundlegende Funktionen zum Senden einfacher E-Mails bietet

  2. JavaMailSender interface: die Subschnittstelle der obigenMailSender. Es unterstützt MIME-Nachrichten und wird hauptsächlich in Verbindung mit der KlasseMimeMessageHelper zum Erstellen vonMimeMessage verwendet. Es wird empfohlen, den MechanismusMimeMessagePreparatorfür diese Schnittstelle zu verwenden

  3. JavaMailSenderImpl class: Bietet eine Implementierung derJavaMailSender-Schnittstelle. Es unterstützt dieMimeMessage undSimpleMailMessage

  4. SimpleMailMessage class: Wird verwendet, um eine einfache E-Mail-Nachricht mit den Feldern from, to, cc, subject und text zu erstellen

  5. MimeMessagePreparator interface: Bietet eine Rückrufschnittstelle für die Vorbereitung von MIME-Nachrichten

  6. MimeMessageHelper class: 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 wird gezeigt, wie diese Schnittstellen und Klassen verwendet werden.

3.1. Spring Mail Server-Eigenschaften

E-Mail-Eigenschaften, die zum Angeben von z. Der SMTP-Server kann mitJavaMailSenderImpl 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, besteht der nächste Schritt darin, die Eigenschaften des Mailservers in der Dateiapplication.propertiesunter Verwendung des Namespacespring.mail.*anzugeben.

Beispielsweise können die Eigenschaften für Gmail SMTP Server 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 Eigenschaftspring.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 SMTP-Server von Google Mail senden. Sehen Sie sich diedocumentation an, um die Eigenschaften des SMTP-Servers für ausgehende Google Mail-E-Mails anzuzeigen.

Unsereapplication.the properties-Datei ist bereits für die Verwendung von Google Mail SMTP konfiguriert (siehe vorherigen Abschnitt).

Beachten Sie, dass das Passwort für Ihr Konto kein gewöhnliches Passwort sein sollte, sondern ein Anwendungspasswort, das für Ihr Google-Konto generiert wurde. Befolgen Sie dieselink, 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 Ihreapplication.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. Befolgen Sie dielink, um Ihren Benutzernamen und Ihr Passwort zu überprüfen.

4. Email schicken

Sobald das Abhängigkeitsmanagement und die Konfiguration eingerichtet sind, können wir die oben genanntenJavaMailSenderverwenden, um eine E-Mail zu senden.

Da sowohl das einfache Vanilla Spring-Framework als auch die Boot-Version das Verfassen und Versenden 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
    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. Senden von E-Mails mit Anhängen

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

Beispielsweise möchten wir eine Auftragsbestätigungs-E-Mail mit einer beigefügten Rechnung senden. In diesem Fall sollten wir anstelle vonSimpleMailMessage eine mehrteilige Nachricht vonMIMEaus der Bibliothek vonJavaMailverwenden. Spring unterstütztJavaMail Messaging mit derorg.springframework.mail.javamail.MimeMessageHelper Klasse.

Zunächst fügen wir denEmailServiceImpleine Methode hinzu, um E-Mails mit Anhängen zu senden:

@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. Einfache E-Mail-Vorlage

Die Klasse vonSimpleMailMessageunterstützt die Textformatierung. Wir können eine Vorlage für E-Mails erstellen, indem wir in unserer Konfiguration eine Vorlagen-Bean definieren:

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

Jetzt können wir diese Bean als Vorlage für E-Mails verwenden und müssen nur noch die erforderlichen Parameter für die Vorlage bereitstellen:

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

5. Behandlung von Sendefehlern

JavaMail bietetSendFailedException, um Situationen zu behandeln, in denen eine Nachricht nicht gesendet werden kann. Es ist jedoch möglich, dass Sie diese Ausnahme nicht erhalten, wenn Sie eine E-Mail an die falsche Adresse senden. Der Grund ist der folgende:

Die Protokollspezifikation für SMTP in RFC 821 gibt den 550-Rückkehrcode an, den der SMTP-Server zurückgeben soll, wenn er versucht, eine E-Mail an die falsche Adresse zu senden. Die meisten öffentlichen SMTP-Server tun dies jedoch nicht. Stattdessen senden sie eine E-Mail mit der Aufschrift „Versand fehlgeschlagen“ an Ihre Box oder geben überhaupt kein Feedback.

Beispielsweise sendet der SMTP-Server von Google Mail die Nachricht "Zustellung fehlgeschlagen". Und Sie bekommen keine Ausnahmen in Ihrem Programm.

Es gibt also einige Optionen, die Sie durchlaufen können, um diesen Fall zu behandeln:

  1. Fange dieSendFailedException, die niemals geworfen werden können

  2. Überprüfen Sie das Postfach Ihres Absenders 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 wurde gezeigt, wie Sie E-Mails von einer Spring Boot-Anwendung einrichten und senden.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie inGitHub project; Da es sich um ein Maven-basiertes Projekt handelt, sollte es einfach zu importieren und auszuführen sein.