Springメールガイド

1概要

この記事では、プレーンな通常のSpringアプリケーションからも、Spring Bootアプリケーションからも電子メールを送信するために必要な手順について説明します。[JavaMail]ライブラリと後者は spring-boot-starter-mail 依存関係を使っています。

2 Mavenの依存関係

まず、 pom.xml に依存関係を追加する必要があります。

2.1. 春

プレーンなvanilla Springフレームワークで使用するために、以下を追加します。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.0.1-RELEASE</version>
</dependency>

最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Cspring-context-support[here]にあります。

2.2. 春のブーツ

そして春のブーツのために:

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

最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.springframework.boot%22%20AND%20a%3A%22spring-boot-starter-で入手できます。 mail%22[Maven Central]リポジトリ。

3メールサーバーのプロパティ

SpringフレームワークにおけるJavaメールサポートのためのインタフェースとクラスは次のように構成されています。

  1. MailSender interface :基本を提供する最上位インタフェース

簡単なEメールを送信するための機能 。 JavaMailSender interface :上記のサブインタフェース

MailSender 。 MIMEメッセージをサポートし、主にで使用されています を作成するための MimeMessageHelper クラスとの組み合わせ MimeMessage MimeMessagePreparator を使用することをお勧めします このインタフェースの仕組み 。 JavaMailSenderImpl class :の実装を提供します。

JavaMailSender インターフェース。それは MimeMessage SimpleMailMessage SimpleMailMessage class :単純なメールメッセージを作成するために使用されます。

from、to、cc、件名、およびテキストフィールドを含む 。 MimeMessagePreparator interface :コールバックインタフェースを提供します。

MIMEメッセージの準備 。 MimeMessageHelper class :MIME作成用のヘルパークラス

メッセージHTMLレイアウトの画像、一般的なメール添付ファイル、およびテキストコンテンツをサポート

次のセクションでは、これらのインタフェースとクラスの使い方を説明します。

3.1. Spring Mail Serverのプロパティ

指定に必要なメールプロパティSMTPサーバーは JavaMailSenderImpl を使用して定義できます。

たとえばGmailの場合、これは次のように設定できます。

@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. Spring Bootメールサーバのプロパティ

依存関係が整ったら、次のステップは、 spring.mail。** 名前空間を使用して application.properties ファイルにメールサーバーのプロパティを指定することです。

たとえば、Gmail SMTP Serverのプロパティは次のように指定できます。

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

一部のSMTPサーバーはTLS接続を必要とするため、 spring.mail.properties.mail.smtp.starttls.enable プロパティを使用してTLS保護された接続を有効にします。

3.2.1. Gmail SMTPプロパティ

Gmail SMTPサーバー経由でEメールを送信できます。 https://support.google.com/mail/answer/13273?hl=jaをご覧ください。

application.the properties ファイルは、Gmail SMTPを使用するように既に設定されています(前のセクションを参照)。

アカウントのパスワードは通常のパスワードではなく、Googleアカウント用に生成されたアプリケーションパスワードにしてください。

link に従って詳細を確認し、Googleアプリのパスワードを生成してください。

3.2.2. SES SMTPプロパティ

Amazon SESサービスを使用してEメールを送信するには、以下のように application.properties を設定します。

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

Amazonでは、使用する前に認証情報の確認を求めています。 link に従って、ユーザー名とパスワードを確認してください。

4メールを送る

依存関係の管理と設定が完了したら、前述の JavaMailSender を使用して電子メールを送信できます。

プレーンなバニラスプリングフレームワークとそのブートバージョンはどちらも電子メールの作成と送信を同じように処理するので、以下のサブセクションで2つを区別する必要はありません。

4.1. 簡易メールの送信

まず、添付ファイルなしで簡単な電子メールメッセージを作成して送信しましょう。

@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. 添付ファイル付きのメールの送信

Springの単純なメッセージングでは、私たちのユースケースには不十分な場合があります。

たとえば、請求書を添付した注文確認メールを送信します。この場合、 SimpleMailMessage の代わりに JavaMail ライブラリからの MIME マルチパートメッセージを使用する必要があります。 Springは org.springframework.mail.javamail.MimeMessageHelper クラスで JavaMail メッセージングをサポートしています。

まず最初に、添付ファイル付きのEメールを送信するためのメソッドを EmailServiceImpl に追加します。

@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. 簡易メールテンプレート

SimpleMailMessage クラスはテキストフォーマットをサポートします。私たちの設定でテンプレートBeanを定義することでEメール用のテンプレートを作成できます。

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

これで、このBeanを電子メールのテンプレートとして使用でき、必要なパラメータをテンプレートに提供するだけで済みます。

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

5送信エラーの処理

JavaMail は、メッセージを送信できない場合の状況に対処するために SendFailedException を提供します。ただし、間違ったアドレスにメールを送信している間は、この例外が発生することはありません。その理由は次のとおりです。

RFC 821のSMTPのプロトコル仕様では、誤ったアドレスにEメールを送信しようとしたときにSMTPサーバーが返す550の戻りコードが指定されています。しかし、ほとんどのパブリックSMTPサーバーはこれを行いません。

代わりに、彼らはあなたのボックスに "配達失敗"のEメールを送るか、あるいはまったくフィードバックを与えません。

たとえば、Gmail SMTPサーバーは「配信失敗」メッセージを送信します。そして、あなたはあなたのプログラムで例外を受けません。

したがって、このケースを処理するために通過できるオプションはいくつかあります。

  1. スローされることはありません SendFailedException をキャッチします.

  2. 一定期間、「配信に失敗しました」メッセージで送信者のメールボックスを確認してください.

時間のこれは簡単ではなく、期間はそうではありません。 決定 。あなたのメールサーバが全くフィードバックを与えないなら、あなたは何もすることができません。

6. 結論

この簡単な記事では、Spring Bootアプリケーションから電子メールを設定して送信する方法を示しました。

これらすべての例とコードスニペットの実装は GitHubプロジェクト にあります。これはMavenベースのプロジェクトなので、そのままインポートして実行するのは簡単なはずです。