N-LAB.

Amazon SESを利用してメールを配信する方法

投稿日:2023/04/16

目標

  • AWSのAmazon SESを用いてメールの配信を行う。
  • アプリからAmazon SESを利用してメールを送信する機能の実装。

※メール送信機能を実装するにあたりアプリの環境は以下のとおりです。
フレームワーク:Spring Boot 3.0
プログラミング言語:Java 17

前提

  • メール配信を行うための有効なメールアドレス(Gmailアドレス等)を所持していること。


注意点

  • 本手順は2023年4月16日時点でのAmazon SESの利用方法を記載しています。将来的にAmazon SESの利用手順の改正等で本手順書に記載の手順が実施できなくなる可能性があります。


目次

  1. Amazon SESとは
  2. Amazon SES サンドボックスとは
  3. Amazon SESで使用するメールアドレスの登録
  4. メールのテスト送信
  5. Amazon SESメールの送信機能の実装


1. Amazon SESとは

  • AWSが提供するメール配信サービスのこと。


  • 無料で利用でき、送信したメール数に応じて料金を支払う従量課金制。


  • 外部アプリからメール送信した場合は1000件ごとに0.10USD、EC2上のアプリからメールを送信した場合は62000件/月までは無料。

※詳しい料金形態はこちらを参照ください。

2. Amazon SES サンドボックスとは

  • Amazon SESの機能が制限された環境のこと。


  • 不正使用や悪用を防止するため、新しくAmazon SESを利用する場合は無条件でAmazon SESサンドボックスに配置される。


  • 制限されている内容は以下のとおり。

1. 検証済みのメールアドレス、または検証済みのドメインでしかメールの送受信ができない
2. 1日あたり200通しかメールを送信できない
3. 1秒あたり1メッセージしか送信できない

  • Amazon SES サンドボックスの制限を解除するには以下を参照ください。

https://docs.aws.amazon.com/ja_jp/ses/latest/dg/request-production-access.html

3. Amazon SESで使用するメールアドレスの登録

  • Amazon SESで使用するメールアドレスの登録を行います。

1. AWSにログイン後、検索欄より「simple email service」を入力し、「Amazon Simple Email Service」をクリックします。
search ses
2. 左ナビゲーションメニューの「検証済みID」をクリックし、「IDの作成」ボタンをクリックします。
id list
3. 「IDタイプ」で「Eメールアドレス」を選択し、Eメールアドレス入力欄に任意のアドレスを入力し、「IDの作成」ボタンをクリックします。
create id
4. 先ほど入力したメールアドレス宛に以下のメールが届くのでリンクをクリックします。
check email
5. リンククリック後に以下のページが表示されることを確認します。
email check complete
6. 左ナビゲーションメニューの「検証済みID」をクリックします。一覧に登録したメールアドレスが表示され、IDステータスが「検証済み」になっていることを確認します。
id list

4. メールのテスト送信

  • 現時点でメールの送信が可能になっているので、メールのテスト送信を行います。

1. 左ナビゲーションメニューの「検証済みID」をクリックします。一覧の「ID」列に表示されているメールアドレスをクリックします。
id list
2. 「テストEメールの送信」をクリックします。
id detail
3. Eメール形式に「フォーマット済み」を選択し、シナリオに「カスタム」を選択します。カスタム受信者に前項で登録したメールアドレスを入力します。「件名」と「本文」に任意の値を入力して「テストEメールの送信」をクリックします。
send test mail
4. 前項で登録したメールアドレス宛へメールが届いていることを確認します。併せて件名と本文が上記で設定した内容と一致していることも確認します。受信トレイにメールが見当たらない場合は迷惑メールを確認してください。

5. Amazon SESメールの送信機能の実装

  • Amazon SESを利用してメールを送信する機能を実装します。

実装するにあたりアプリの環境は以下のとおりです。
フレームワーク:Spring Boot 3.0
使用言語:Java 17
ビルドツール:Maven

1. pom.xmlのdependenciesに以下を追加します。

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-aws</artifactId>
	<version>2.2.6.RELEASE</version>
</dependency>
<dependency>
	<groupId>com.amazonaws</groupId>
	<artifactId>aws-java-sdk-ses</artifactId>
	<version>1.12.450</version>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-mail</artifactId>
</dependency>


2. src/main/java/{your project name}/configにAmazonSESConfig.javaを新規作成し、以下の内容で保存します。

package com.example.springsecuritysample.config;

import org.springframework.cloud.aws.mail.simplemail.SimpleEmailServiceMailSender;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.MailSender;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.simpleemail.AmazonSimpleEmailService;
import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClientBuilder;

@Configuration
public class AmazonSESConfig {
    @Bean
    public AmazonSimpleEmailService amazonSimpleEmailService() {
        // AWSの認証情報とリージョンを設定
        // accessKeyとsecretKeyはIAM→アクセス管理→ユーザ→セキュリティ認証情報→アクセスキーで表示されるものを使用する
        return AmazonSimpleEmailServiceClientBuilder.standard()
            .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("accessKey","secretKey")))
            .withRegion(Regions.AP_NORTHEAST_1).build();
    }

    @Bean
    public MailSender mailSender(AmazonSimpleEmailService ses) {
        return new SimpleEmailServiceMailSender(ses);
    }
}

※説明の簡略化のためaccessKeyとsecretKeyをハードコードしていますが、実際の運用にはapplication.ymlなどの外部ファイルに切り出すことが望ましいです。

3. src/main/java/{your project name}/serviceにMailService.javaを新規作成し、以下の内容で保存します。

package com.example.springsecuritysample.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Service;
import jakarta.mail.internet.InternetAddress;

@Service
public class MailService {
    @Autowired
    MailSender sender;

    // メールを送信するにはこちらのメソッドを実行する
    public void sendMail() throws Exception {
        // InternetAddressを使って「名前 <xxxx@gmail.com>」の形式に整形
        // メールアドレスはAmazonSESのコンソール上で検証済みとなっているアドレスを使用する
        // サンドボックスの制限を解除している場合は任意のメールアドレスを使用可能
        InternetAddress senderAddress = new InternetAddress("hoge@hogehoge.com", "test", "ISO-2022-JP");
        InternetAddress recieverAddress = new InternetAddress("hoge@hogehoge.com", "test", "ISO-2022-JP");

        SimpleMailMessage mailMessage = new SimpleMailMessage();
        // 送信先の設定
        mailMessage.setTo(recieverAddress.toString());
        // 送信元の設定
        mailMessage.setFrom(senderAddress.toString());
        // 返信先の設定
        mailMessage.setReplyTo(senderAddress.toString());
        // 件名の設定
        mailMessage.setSubject("テスト件名");
        // 本文の設定
        mailMessage.setText("テスト本文");
        // メール送信
        sender.send(mailMessage);
    }
}


4. メールを送信するにはMailService.javaのsendMail()を呼ぶことでメールを送信することができます。


以上で全ての手順は完了になります