5.7. メール送信

5.7.1. Overview

本節では、Amazon Simple Email Service(以下、Amazon SES)を使用したEメール送信の実装方法について説明する。

Note

本ガイドラインで説明の対象としているのはメールを送信する部分のみである。メール送信に係る処理方式については言及していない。

また、Amazon SESが提供する機能についても、公式ドキュメントと記述が重複する為、メール送信に直接関わらないものは説明を割愛している。 その為、本ガイドラインだけでなく、Amazon SESの公式ドキュメントAmazon Simple Email Service (SES)を必ず参照した上で、開発に臨んで頂きたい。

5.7.1.1. Amazon SESとは

Amazon SESは、Amazon Web Serviceが提供するEメールプラットフォームである。
Amazon Web Service上で動作する為、ユーザはメールサーバ構築やネットワークの管理などのインフラ整備を行う必要がなく、容易にメールサービスを実装することができる。
Amazon SESの詳細については、Amazon Simple Email Service (SES)を参照されたい。

5.7.1.2. JavaアプリケーションからのAmazon SESの利用

Amazon Web Serviceでは、JavaアプリケーションからAmazon SESを利用する為のAPIを提供している。

  • Amazon SES API(AWS SDK for Java)
com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClientをはじめとする、AWSが提供するSDKに含まれるAmazon SES用のAPI。
詳細についてはAWS SDK for Javaおよび Amazon SES APIを使用してEメールを送信するを参照されたい。
  • SMTPインタフェース(Amazon SES SMTP Interface)
SMTPを使用してAmazon SESにメール送信する為のインタフェース。
SMTPインタフェースの詳細についてはAmazon SES SMTPインターフェイスを使用してEメールを送信するを参照されたい。

5.7.1.3. Spring Cloud AWSのコンポーネントを使用したAmazon SESの利用

Spring Cloudが提供する Spring Cloud for Amazon Web Services(以下、Spring Cloud AWS)を利用することで、設定ファイルの記述量を抑えてAmazon SESへのメール送信アプリケーションを実装することができる。
本ガイドラインでは、このSpring Cloud AWSを利用した実装方法について紹介する。

Spring Cloud AWSを利用したメール送信については、Spring Cloud AWSのドキュメントSending mailsに紹介されている為、本ガイドラインと合わせて参照されたい。

5.7.1.4. Spring Frameworkのコンポーネントを使用したAmazon SESの利用

Spring Frameworkはメール送信を行うためのコンポーネント(org.springframework.mailパッケージ)を提供している。
このパッケージに含まれるコンポーネントはメール送信に係る詳細なロジックを隠蔽し、低レベルのAPIハンドリング(JavaMailのAPI呼び出し)を代行する。
詳しくは、Macchinetta Server Framework for Java (1.x) のガイドラインSpring FrameworkのMail連携用コンポーネントについてに紹介されている為、参照されたい。

本ガイドラインで使用するコンポーネントを以下に示す。

  • JavaMailSender
    JavaMail用のメール送信インターフェース。
    JavaMailのMimeMessageとSpringのSimpleMailMessageの両方に対応している。
  • MimeMessageHelper
    JavaMailのMimeMessageの作成を容易にするためのヘルパークラス。
    MimeMessageHelperには、MimeMessageに値を設定するための便利なメソッドがいくつも用意されている。
  • SimpleMailMessage
    単純なメールメッセージを作成するためのクラス。
    英文のプレーンテキストメールを作成する際に使用できる。
    UTF-8等の特定のエンコード指定、HTMLメールや添付ファイル付きメールの送信、あるいはメールアドレスに個人名を付随させるといったリッチなメッセージの作成を行う際は、JavaMailのMimeMessageを使用する必要がある。

5.7.2. How to use

5.7.2.1. Amazon SESの設定

Amazon SESを使用する為に必要な設定について説明する。

Amazon SESの利用開始時点では、不正利用防止の為、サンドボックスと呼ばれる制限環境下で利用する事となる。
サンドボックス内では、認証済のメールアドレスでのみ、メールの送信・受信が可能な為、メールアドレス認証を行う必要がある。
メールアドレスの認証については、 Amazon SES でのEメールアドレスの検証を参照されたい。

製造フェーズ等の開発段階ではサンドボックス環境を利用し、本番環境を想定した試験等のタイミングでサンドボックス外に移行する運用が考えられる。
サンドボックス外への移動については、 Amazon SES サンドボックスの外への移動を参照されたい。

Note

メールの送信上限について

Amazon SESを利用する際には、24 時間当たりに送信できるメールの最大数と、1秒あたりに送信できるメールの最大数が存在する。制限はサンドボックス内・外どちらにも存在する。

送信上限は必要に応じて引き上げ申請が可能な為、 Amazon SES の送信制限の管理および Amazon SES の送信制限の引き上げを参照されたい。

Note

メールボックスシミュレーターについて

テスト工程などでは、実在する宛先にメールを送らずに、バウンスやサプレッションリストへの送信確認などを行いたい場合が存在する。

Amazon SESはメールボックスシミュレータを提供している為、特定のアドレスをToに設定して送信することで、いくつかのシミュレートを行う事ができる。 詳細についてはAmazon SES Eメール送信のテストを参照されたい。

5.7.2.2. 依存ライブラリの設定

本ガイドラインで紹介する実装に必要となるライブラリの依存関係をpom.xmlに追加する。

記述例を以下に示す。

  • xxx-domain/pom.xml

    <dependencies>
    
        <!-- (1) -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-aws</artifactId>
        </dependency>
        <!-- (2) -->
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-ses</artifactId>
        </dependency>
        <!-- (3) -->
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
        </dependency>
    
    </dependencies>
    
    項番 説明
    (1)
    spring-cloud-starter-awsをdependenciesに追加する。
    (2)
    aws-java-sdk-sesをdependenciesに追加する。
    (3)
    javax.mailをdependenciesに追加する。

5.7.2.3. Spring Cloud AWSの設定

Spring Cloud AWSのメール送信コンポーネントを利用する為の設定を行う。

記述例を以下に示す。

  • xxx-infra.xml
<!-- (1) -->
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aws-mail="http://www.springframework.org/schema/cloud/aws/mail"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/cloud/aws/mail
        http://www.springframework.org/schema/cloud/aws/mail/spring-cloud-aws-mail.xsd">

    <!-- (2) -->
    <aws-mail:mail-sender id="sesMailSender" region="us-east-1"/>
項番 属性名 内容
(1)
xmlns:aws-mail
aws-mail Namespaceを定義する。
値としてhttp://www.springframework.org/schema/cloud/aws/mailを指定する。
  xsi:schemaLocation
スキーマのURLを指定する。
値にhttp://www.springframework.org/schema/cloud/aws/mailhttp://www.springframework.org/schema/cloud/aws/mail/spring-cloud-aws-mail.xsdを追加する。
(2)
-
<aws-mail:mail-sender/>を利用して、Spring Cloud AWSが提供するJavaMailSenderの実装クラスをDIコンテナに登録する。
  id
JavaMailSenderの実装クラスがDIコンテナに登録される際のBeanIDとなる。
  region
Amazon SESで個別のリージョンを指定する必要がある場合、region属性にリージョンを指定する。

Note

本ガイドライン執筆現在、Amazon SESは限られたリージョンでしかサービスを提供していない。Amazon SES利用の際には留意して頂きたい。

なお、上記の設定は、Spring BootのAuto-configurationが提供するorg.springframework.cloud.aws.autoconfigure.mail.MailSenderAutoConfigurationが無効になっている事が前提である。 デフォルトではMailSenderAutoConfigurationは有効になっている為、本設定を行う際は、必ずAuto-configurationの設定を確認すること。

Note

MailSenderAutoConfigurationが提供するBean定義では、Amazon SESをEC2とは異なるリージョンで使用する場合に、リージョン情報の差し替えに対応できない。 その為、本ガイドラインではaws-mail Namespaceを使用する方法を紹介している。

MailSenderAutoConfigurationを無効にする設定例を以下に示す。

  • Bootstrap.java

    package com.example.xxx.app;
    
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.cloud.aws.autoconfigure.mail.MailSenderAutoConfiguration;
    import org.springframework.boot.web.support.SpringBootServletInitializer;
    
    // omitted
    
    @EnableAutoConfiguration(exclude = MailSenderAutoConfiguration.class)
    public class Bootstrap extends SpringBootServletInitializer {
    
        // omitted
    }
    

    Note

    上記の記述例は、MailSenderAutoConfigurationの除外にフォーカスして紹介している。 Bootstrapクラスのその他の定義例については、エントリポイントの作成 にて紹介している為、必要に応じて参照されたい。

    Warning

    MailSenderAutoConfigurationというクラス名のAuto-configurationクラスは複数存在する。

    除外する際はパッケージ名まで確認の上、org.springframework.cloud.aws.autoconfigure.mail.MailSenderAutoConfigurationを対象とすること。

5.7.2.4. SimpleMailMessageによるメール送信方法

英文のプレーンテキストメール(エンコードの指定や添付ファイル等が不要なメール)を送信する場合は、Springが提供しているSimpleMailMessageクラスを使用する。

実装例については、Macchinetta Server Framework for Java (1.x) のガイドラインSimpleMailMessageによるメール送信方法を参照されたい。

5.7.2.5. MimeMessageによるメール送信方法

英文以外のメールやHTMLメール、添付ファイルの送信を行う場合、javax.mail.internet.MimeMessageクラスを使用する。 本ガイドラインではMimeMessageHelperクラスを使用してMimeMessageを作成する方法を推奨している。

実装例については、Macchinetta Server Framework for Java (1.x) のガイドラインMimeMessageによるメール送信方法を参照されたい。