Amazon SESを使ってメールを送信する

Spring Cloud AWS を使用して、Amazon SESでメールを送信する実装方法を説明します。

サンプルコードの動作確認環境については、 動作確認環境と依存ライブラリについて を参照してください。

サンプル全体は aws-ses を参照してください。

AWS SESを使用するための設定例

pom.xml

依存ライブラリにspring-cloud-aws-starter-sesを追加します。また、Spring Bootでメールを送信するためのライブラリも依存ライブラリに追加します。

<dependency>
  <groupId>io.awspring.cloud</groupId>
  <artifactId>spring-cloud-aws-starter-ses</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

Tip

spring-cloud-aws-starter-s3version を指定していませんが、 サンプルでは Spring Cloud AWSが提供するBOM を使用してSpring Cloud AWS関連ライブラリのバージョンを制御しています。

AWSのリージョン

AWSのリージョンを実行環境に設定します。 デフォルトのリージョンはAWS SDKが提供する DefaultAwsRegionProviderChain により決定され、実行環境に設定されたAWSアカウント情報や、EC2のメタデータからリージョンを取得します。

明示的に指定する場合は、 spring.cloud.aws.region.static 、または spring.cloud.aws.ses.region プロパティにリージョンを設定します。

設定可能な値の詳細については Spring Cloud AWS Core - Region および SES Integration - Configuration を参照してください。

AWSアカウントのクレデンシャル情報

AWSアカウントのクレデンシャル情報を実行環境に設定します。 クレデンシャル情報の設定方法はいくつかありますが、例えば環境変数を使用する方法であれば、以下の環境変数にクレデンシャル情報を設定します。

  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

クレデンシャル情報の設定方法の詳細については Spring Cloud AWS Core - Credentials を参照してください。

Tip

IAMによるアクセス制御を行う場合、実行環境には必要な権限を付与する必要があります。 必要な権限の詳細については SES Integration - IAM Permissions を参照してください。

メール送信の実装例

この例では、メールアドレスが環境によって異なる場合を想定し、プロパティで設定可能にする実装とします。

mail.from=foo@test.com
mail.to=bar@test.com

プロパティファイルに合わせて、プロパティ値をバインドするためのBeanを定義します。

package keel.aws.ses;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "mail")
public class MailProperties {
    
    private String from;
    private String to;

    public String getFrom() {
        return from;
    }

    public void setFrom(String from) {
        this.from = from;
    }

    public String getTo() {
        return to;
    }

    public void setTo(String to) {
        this.to = to;
    }
}

ファイルを添付しないような単純なメールを送信する場合には、Springが提供する MailSender を使用して簡潔に実装できます。

package keel.aws.ses;

import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Service;

@Service
public class SimpleMailService {
    
    private final MailSender mailSender;
    private final MailProperties mailProperties;

    public SimpleMailService(MailSender mailSender, MailProperties mailProperties) {
        this.mailSender = mailSender;
        this.mailProperties = mailProperties;
    }

    public void sendMail() {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(mailProperties.getFrom());
        message.setTo(mailProperties.getTo());
        message.setSubject("タイトル");
        message.setText("本文");

        mailSender.send(message);
    }

}

ファイルを添付する場合は、Springが提供する JavaMailSender を使用して実装できます。 ファイルの添付が必要ない場合でも、 MailSender ではなく JavaMailSender を使用することで詳細な設定を行うことができます。

package keel.aws.ses;

import org.springframework.core.io.ClassPathResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

@Service
public class AttachmentMailService {

    private final JavaMailSender javaMailSender;
    private final MailProperties mailProperties;

    public AttachmentMailService(JavaMailSender javaMailSender, MailProperties mailProperties) {
        this.javaMailSender = javaMailSender;
        this.mailProperties = mailProperties;
    }

    public void sendMail() {
        javaMailSender.send(mimeMessage -> {
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            
            helper.setFrom(mailProperties.getFrom());
            helper.setTo(mailProperties.getTo());
            
            helper.setSubject("タイトル(ファイル添付)");
            helper.setText("本文");

            // この例では、クラスパス上にあるファイルを添付ファイルとして追加しています。
            ClassPathResource resource = new ClassPathResource("sample.txt");
            helper.addAttachment("sample.txt", resource);
        });
    }
}