Amazon SESをColdFusion10とAWS SDK for javaの組み合わせで操作する

2013.09.03

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

今回は利用する事も多くなりそうなサービスである Amazon SES を体験してみたいと思います。
初めて Amason SES を利用する場合はsandbox状態になっています。その状態でも無料で利用できるのですが、

  1. メールの送信は1日に200通
  2. メールの送信間隔は1秒間に1通
  3. 認証済みのメールアドレスにしかメールを送信できない

という制限事項があります。Management Consoleで確認すると下記の様に制限事項を確認することができます。

awsses0

動作させた環境

  • Windows7 64Bit
  • ColdFusion10 デベロッパー版
  • AWS SDK for java 1.5.3

Amazon SESを使う

流れは以下のような感じでサンプルプログラムを組み立ててます。

  1. listVerifiedEmailAddressesを使って認証済みメールアドレス一覧を取得します。
  2. sandbox状態なので、指定メールアドレスが認証済みかどうかをチェックします。
  3. 認証済み(Verified)でない場合はverifyEmailAddressで認証要求を出します。
  4. 認証済み(Verified)の場合はsetToAddressesでメールアドレスを設定します。
  5. その他の設定(TOの指定、件名の作成、本文の作成、Sourceの指定)をします。
  6. sendEmailで実際にメールを送信します。

listVerifiedEmailAddressesを使って認証済みメールアドレス一覧を取得する

メールアドレス一覧を取得するには下記の様にすることで、取得できます。

<cfset awscreds = createObject("java","com.amazonaws.auth.BasicAWSCredentials").init(aws_AK,aws_SK)>
<cfset SESClient = createObject("java","com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient").init(awscreds)>

<!--- 既にverifiedされいるEmailアドレス一覧を取得する --->
<cfset verifiedEmails = SESClient.listVerifiedEmailAddresses()>

verifiedEmailsには認証済みのすべてのメールアドレスが返ってきますので、ArrayToListを使ってカンマ区切りのリスト形式に変換します。あとはcfloopでループさせ、指定したメールアドレスが存在するかをチェックします。下記がそのサンプル

<!--- テストなので自分のEmailアドレスを設定します。--->
<cfset Email = "認証されているかを確認したいメールアドレスを指定">
<cfset verifiedEmailsList = ArrayToList(verifiedEmails.getVerifiedEmailAddresses(), ",")>
<cfset flg = 0>

<!--- 既にverifiedされいるかをチェックする --->
<cfloop index="lpc" from="1" to="#ArrayLen(verifiedEmails.getVerifiedEmailAddresses())#">
	<cfif listGetAt(verifiedEmailsList, lpc, ",") is #Email#>
		<!--- 合致した場合にフラグを1にする --->
		<cfset flg = 1>
	</cfif>
</cfloop>

flg=0の場合はメールアドレスが認証されていないので、認証するためにverifyEmailAddressのmethodを呼び出してまずは認証済みのアドレスとします。以下がそのサンプル

	<cfset SESVerifyEmailAddressRequest = createObject("java","com.amazonaws.services.simpleemail.model.VerifyEmailAddressRequest").init()>
	<cfset SESVerifyEmailAddressRequest.setEmailAddress("認証させたいメールアドレスを指定")>
	<cfset ses_send_test = SESClient.verifyEmailAddress(SESVerifyEmailAddressRequest)>

verifyEmailAddressを呼び出すとsetEmailAddressで指定したメールアドレスに確認メールが送信されます。まだ認証を完了させていないので、Management Consoleでステータスを確認してみるとpending verificationとなっていることが確認できます。

awsses2

メールを確認すれば下記の様な内容のメールが到着していると思います。

awsses1_1

メール内にあるリンクをクリックして認証を完了させます。認証が完了すると下記の様な画面が表示されます。

awsses3

再度Management Consoleで確認してみると、Statusがverifiedになっていることが確認できます。

awsses4

sendEmailでテストメールを送信する

これでメールアドレスの認証が完了したので、早速メールを送信してみたいと思います。メール送信に必要な情報をセットして最後にsendEmailを呼び出してメールの送信は完了です。

	<!--- verifiedされてるアドレスなので、送信リクエストを送る --->
	<cfset SESDestination = createObject("java","com.amazonaws.services.simpleemail.model.Destination").init()>
	<cfset SESDestination.setToAddresses([toEmail])>

	<cfset SESSendEmailRequest = createObject("java","com.amazonaws.services.simpleemail.model.SendEmailRequest").init()>

	<!--- TOの指定 --->
	<cfset SESSendEmailRequest.setDestination(SESDestination)>
	<cfset SESmessage = createObject("java","com.amazonaws.services.simpleemail.model.Message").init()>

	<!--- 件名の作成 --->
	<cfset SEScontent = createObject("java","com.amazonaws.services.simpleemail.model.Content").init()>
	<cfset SEScontent.setData("CF10 and SES send mail test!")>
	<cfset SESmessage.setSubject(SEScontent)>

	<!--- 本文の作成 --->
	<cfset SEStext = createObject("java","com.amazonaws.services.simpleemail.model.Content").init()>
	<cfset SEStext.setData("これは本文です。日本語化けずに送信できるかな?")>

	<cfset SESbody = createObject("java","com.amazonaws.services.simpleemail.model.Body").init()>
	<cfset SESbody.setText(SEStext)>
	<cfset SESmessage.setBody(SESbody)>
	<cfset SESSendEmailRequest.setMessage(SESmessage)>

	<!--- Sourceの指定(このサンプルではToと同じアドレスを指定します。) --->
	<cfset SESSendEmailRequest.setSource(toEmail)>

	<!--- メッセージ送信 --->
	<cfset ses_send_test = SESClient.sendEmail(SESSendEmailRequest)>

sendEmailで送信されたメールは下記の様な感じで届きました。

awsses5

これでCFMLテンプレート内で設定したメールタイトルと本文が正しく設定されたメールが確認できました。

サンプルソース(aws_ses_sendmail.cfm)

一連の動作を検証したCFMLソースは下記になります。

<cfcontent type="text/html; charset=utf-8">
<cfprocessingdirective pageEncoding="utf-8" suppressWhitespace="true">

<cflock scope = "Session" timeout = "30" type = "Exclusive">
    <cfset aws_AK = #accessKeyId#> <!--- Your Access Key --->
    <cfset aws_SK = #secretAccessKey#> <!--- Your Secret Key --->
</cflock>

<cfoutput>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>Coldfusion + AWS SDK for java Simple Email Service Sample</title>
</head>

<body>

<!--- テストなので自分のEmailアドレスを設定します。--->
<cfset Email = "認証されているかを確認したいメールアドレスを指定">

<cfset awscreds = createObject("java","com.amazonaws.auth.BasicAWSCredentials").init(aws_AK,aws_SK)>
<cfset SESClient = createObject("java","com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient").init(awscreds)>

<!--- 既にverifiedされいるEmailアドレス一覧を取得する --->
<cfset verifiedEmails = SESClient.listVerifiedEmailAddresses()>

<cfset flg = 0>
<cfset verifiedEmailsList = ArrayToList(verifiedEmails.getVerifiedEmailAddresses(), ",")>

<!--- テストなので、toEmail も自分のEmailアドレスを指定します --->
<cfset toEmail = #Email#>

<!--- 既にverifiedされいるかをチェックする --->
<cfloop index="lpc" from="1" to="#ArrayLen(verifiedEmails.getVerifiedEmailAddresses())#">
	<cfif listGetAt(verifiedEmailsList, lpc, ",") is #Email#>
		<cfset flg = 1>
	</cfif>
</cfloop>

<cfif flg eq 0>
	<!--- まだverifyされていないEmailアドレスなので、verifyのリスエストを投げる --->
	<cfset SESVerifyEmailAddressRequest = createObject("java","com.amazonaws.services.simpleemail.model.VerifyEmailAddressRequest").init()>
	<cfset SESVerifyEmailAddressRequest.setEmailAddress("ここには認証させたいメールアドレスを指定します。")>
	<cfset ses_send_test = SESClient.verifyEmailAddress(SESVerifyEmailAddressRequest)>
<cfelse>	
	<!--- 既にverifiedされてるアドレスなので、送信リクエストを作成する --->
	<cfset SESDestination = createObject("java","com.amazonaws.services.simpleemail.model.Destination").init()>
	<cfset SESDestination.setToAddresses([toEmail])>

	<cfset SESSendEmailRequest = createObject("java","com.amazonaws.services.simpleemail.model.SendEmailRequest").init()>

	<!--- TOの指定 --->
	<cfset SESSendEmailRequest.setDestination(SESDestination)>
	<cfset SESmessage = createObject("java","com.amazonaws.services.simpleemail.model.Message").init()>

	<!--- 件名の作成 --->
	<cfset SEScontent = createObject("java","com.amazonaws.services.simpleemail.model.Content").init()>
	<cfset SEScontent.setData("CF10 and SES send mail test!")>
	<cfset SESmessage.setSubject(SEScontent)>

	<!--- 本文の作成 --->
	<cfset SEStext = createObject("java","com.amazonaws.services.simpleemail.model.Content").init()>
	<cfset SEStext.setData("これは本文です。日本語化けずに送信できるかな?")>

	<cfset SESbody = createObject("java","com.amazonaws.services.simpleemail.model.Body").init()>
	<cfset SESbody.setText(SEStext)>
	<cfset SESmessage.setBody(SESbody)>
	<cfset SESSendEmailRequest.setMessage(SESmessage)>

	<!--- Sourceの指定(このサンプルではToと同じアドレスを指定します。) --->
	<cfset SESSendEmailRequest.setSource(toEmail)>

	<!--- メッセージ送信 --->
	<cfset ses_send_test = SESClient.sendEmail(SESSendEmailRequest)>
</cfif>	

</cfoutput>
</cfprocessingdirective>      
<cfsetting enablecfoutputonly="false">

</body>
</html>

まとめ

ようやく3つ目のサービスを体験できました。Amazon SESはSQS、SNSより設定する項目が多いのとsetToAddressesのところで若干ハマりましたがなんとか動作させることができて一安心できました。