AWS SDK for Javaを使う#Amazon SES

AWS

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

いまやクラウドサービスの代表格とも言えるAmazonですが、EC2やS3をはじめとして、さまざまなサービスを提供しています。
数年前に私も少しだけEC2やS3を使用したことがあるのですが、最近はあまりさわっていませんでした。
しかし今回AWSについての調査をきっかけに、各種AWSサービスについて復習&AWS SDKでの動作確認をしていきたいと思います。

今回はメール送信サービス、Amazon Simple Email Service(Amazon SES)です。

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.2
  • Java : 1.6.0_26
  • Scala : 2.9.1 final
  • SBT : 0.11.2

なお、AWSへの登録は終わっているものとします。

Amazon SES

Amazon Simple Email Service(Amazon SES)は、大量のメールを送信するときに有用なサービスです。
自分でメールサーバーを立てたり、どこかのレンタルサーバーを使用したりする必要もありません。
また、メールを送信する方法も、一度認証を行えば通常のJava Mailを使った手法で送ることができます。

Amazon SESを利用する場合、まずは1日に最大200通のメッセージを検証されたアドレスにのみ送れるサンドボックスを使用します。
サンドボックスでのテスト後、プロダクションへのリクエストをすれば検証されていないアドレスにもメールを送ることが可能です。
※メールの送信数については、条件次第で自動的に変動します。詳しくはhttp://aws.amazon.com/jp/ses/faqs/#46を参照してください。

それではAmazon SESを使用したサンプルプログラムをみてみましょう。

実行環境のセットアップ

以前と同じくsbt + scala + aws-sdk-javaをセットアップしておきましょう。

Amazon SESサンプル作成

今回は1度目の実行で送信(受信)メールアドレスを認証し、二度目の実行でそのアドレスにメールを送信します。 src/main/scalaディレクトリに、SES.scalaファイルを作成してください。
fromEmailとtoEmailに受信可能なテスト用メールアドレスを記述してください。

import com.amazonaws.auth.BasicAWSCredentials

import java.util.Properties

import javax.mail.Message
import javax.mail.Session
import javax.mail.Transport
import javax.mail.internet.AddressException
import javax.mail.internet.InternetAddress
import javax.mail.internet.MimeMessage

import com.amazonaws.auth.PropertiesCredentials
import com.amazonaws.services.simpleemail.AWSJavaMailTransport
import com.amazonaws.services.simpleemail.AmazonSimpleEmailService
import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient
import com.amazonaws.services.simpleemail.model.ListVerifiedEmailAddressesResult
import com.amazonaws.services.simpleemail.model.VerifyEmailAddressRequest

import scala.collection.JavaConversions._

object SESMain extends App{
  // アクセスキー
  val accessKey = "アクセスキー"
  // シークレットキー
  val secretKey = "シークレットキー"
  // FROMメールアドレス
  val fromEmail = "FROMメールアドレス"
  // TOメールアドレス.テスト時はfromEmailと同じでなければならない
  val toEmail = "TOメールアドレス"

  val credentials = new BasicAWSCredentials(accessKey,secretKey)

  val ses = new AmazonSimpleEmailServiceClient(credentials)
  
  val verifiedEmails = ses.listVerifiedEmailAddresses()
  verifiedEmails.getVerifiedEmailAddresses().contains(fromEmail) match {
	case true => {
	  //メールアドレスが送信許可されているので、送信する
	  println("send email")
	  val props = new Properties()
	  props.setProperty("mail.transport.protocol", "aws");
          props.setProperty("mail.aws.user", credentials.getAWSAccessKeyId())
          props.setProperty("mail.aws.password", credentials.getAWSSecretKey())

          val session = Session.getInstance(props)
          val msg = new MimeMessage(session)
          msg.setFrom(new InternetAddress(fromEmail))
		
          msg.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail))
          msg.setSubject("Amazon SESテスト")
          msg.setText("テスト用メールです。")
          msg.saveChanges()
          val t = new AWSJavaMailTransport(session, null)
          t.connect();
          t.sendMessage(msg, null)
          t.close()
	}
	case false => {
	  //メールアドレスが送信許可されていないので、確認する
	  println("verify Email Address=" + fromEmail)
	  ses.verifyEmailAddress(new VerifyEmailAddressRequest().withEmailAddress(fromEmail))
	  System.out.println("Please check the email address " + fromEmail + " to verify it")
	}
  }
}

ではプログラムの解説です。
まず、AmazonSimpleEmailServiceClientのオブジェクトを作成した後、listVerifiedEmailAddressesメソッドで
認証されたメールアドレスを取得し、fromEmailが認証済みか確認しています。
一度目の起動では、認証されていないので、verifyEmailAddressメソッドで認証依頼をしています。

  val verifiedEmails = ses.listVerifiedEmailAddresses()
  verifiedEmails.getVerifiedEmailAddresses().contains(fromEmail) match {
	case true => {
	 ・・・・・・
	}
	case false => {
	  //メールアドレスが送信許可されていないので、検証する
	  println("verify Email Address=" + fromEmail)
	  ses.verifyEmailAddress(new VerifyEmailAddressRequest().withEmailAddress(fromEmail))
	  System.out.println("Please check the email address " + fromEmail + " to verify it")
	}

プログラムの記述ができたらsbtでプログラムを実行します。

% sbt
> run

1度目のプログラムが終了後、fromEmailに指定したアドレスに確認メールが届くので、リンクをクリックしてください。
するとメールアドレスの認証が完了します。

もう一度プログラムを実行すると、認証されたメールアドレスを使用してそのアドレス宛にメールを送信します。(SES.scalaの37行目から57行目)
これは通常のJava Mailを使用したメール送信です。
プログラム実行後、送信したメールが認証したアドレス宛に届いています。

まとめ

さて、今回はAmazon SESを使用してメールを送信してみました。
サンドボックスでの送信でしたが、簡単にメール送信のテストができたと思います。
本番環境でAmazon SESを使用しないとしても、テスト用メールサーバーとして使用するのもいいかと思います。

参考サイトなど