Amazon SESとAWS SDK for iOSを使ってiPhoneからメールを送信する方法

Amazon SES

Amazon Web Serviceのサービスの一つにAmazon SES(Simple Email Service)という大規模メール配信用サービスがあります。

SMTPを使ったメール送信の他に、多くのプログラミング言語用に用意されているSDKを使ってのメール送信が可能とのことなのでiOS用のSDKを使ってiPhoneからメール送信してみました。その方法をまとめます。

Amazon SESとは

Amazonが提供するメール配信用のクラウドサービスです。Eメールを1,000通当たり$0.10と転送量による課金だけで安価に大量に送信することができます。

公式サイトによる説明は以下の通りです。

Amazon Simple Email Service(Amazon SES)は、企業や開発者のための、非常に拡張性が高くコスト効率の良いトランザクションバルクメール送信サービスです。Amazon SES により、社内でEメールソリューションを構築したり、サードパーティのEメールサービスをライセンス、インストール、または操作したりする煩雑さやコストから解放されます。

AWS SDK for iOSを使ってのメール送信

通常のメール送信のようにSMTPを設定してメール送信することもできますが、多くのプログラミング言語から使うことができるAWS SDK(開発キット)を使ってのメール送信も可能です。

以下にAWS SDK for iOS(Objective-C)を使ってのメール送信方法を画像つき手順でご紹介します。

1.AWS側の設定

はじめにAmazon SESとIAM(Identity and Access Management)の設定を行います。

1-1.Amazon SESの設定

Amazon SESは初期状態ではsandboxモードとなっており、許可したメールアドレスにしかメールを送信できません。sandboxでも少量のメール送信は可能なので、今回はsandboxモードでメールアドレスを許可する手順からスタートします。

Amazon SES sandboxのインフォメーション

sandboxモードであることを表すインフォメーション

Amazon SESマネジメントコンソール左側のメニューより「Verified Senders」の「Email Addresses」を開き、「Verify a New Email Address」ボタンをクリックします。
Amazon SES 設定1
送信元としての使用を許可するメールアドレスを入力します。サンドボックスモードではここで許可したメールアドレスにのみメールが送信できます。今回は許可するメールアドレスを一つだけ登録します(送信元・送信先アドレスが同じになります)
Amazon SES 設定2
メールアドレスを入力して「Verify This Email Address」ボタンを押すと登録したアドレスに「Amazon SES Address Verification Request」という件名のメールが届きます。メール中のリンクをクリックすると、登録したメールアドレスでの送信と受信が可能になります。
Amazon SES 設定3

今回は許可するメールアドレスを指定しましたが、この他にドメインに所定のTXTレコードを設定することでドメイン単位でのメール送信許可を設定することも可能なようです。

1-2.IAMでメール送信用ユーザの作成

SDKを使ってAmazon SESでメール送信するためには認証用のアクセスキーとシークレットキーが必要です。IAM(Identity and Access Management)でメール送信用のAWSユーザを作成します。

IAMマネジメントコンソールの「Users」を開き、「Create New Users」ボタンを押します。
Amazon SES 設定4
任意のユーザ名を入力し、「Generate an access key for each user」にチェックを入れた状態で「Create」ボタンを押します。
Amazon SES 設定5
ユーザ作成が完了するとアクセスキーとシークレットキーが生成されます。画面表示されたものをコピーするか「Download Credencials」ボタンから認証情報をダウンロードします。
※シークレットキーはここで保存しておかないと再度表示できません。紛失した場合はアクセスキーを新しく登録することとなります。
Amazon SES 設定6
作成したユーザにSESへのアクセスを許可するポリシーを設定するため、IAMのユーザ一覧に戻ります。

作成したユーザを選択し、「Permissions」タブの「Attach User Policy」ボタンを押します。
Amazon SES 設定7
ポリシーの一覧から「Amazon SES Full Access」の「Select」ボタンを押します。
Amazon SES 設定8
JSON形式のポリシードキュメントが表示されるため「Apply Policy」ボタンを押します。
Amazon SES 設定9
以上でメール送信用のSESとIAMの設定は完了です。

ちなみにSESマネジメントコンソールの「SMTP Settings」で「Create My SMTP Credentials」からユーザを作成できますが、ここから作成したユーザにはSMTPからメール送信するための権限しか与えられないためAWS SDKからのメール送信はできません。
Amazon SES SMTPユーザの作成

2.iOSアプリ側(XCode)の設定とコーディング

iOSからのメール送信するためのXCodeの設定とコーディングを行います。

2-1.SDKのインポート

AWS SDK for iOSをダウンロードします。
AWS SDK for iOSのダウンロード
ダウンロードしたzipアーカイブを解凍し、AWSRuntime.frameworkAWSSES.frameworkをXCodeプロジェクトにドラッグして追加します。
AWS SDK for iOSのXCodeプロジェクトへの追加

2-2.SDKを使用してコーディング

AWSRuntime/AWSRuntime.hAWSSES/AWSSES.h#importし、コーディングを行います。

以下は任意のViewControllerで任意のボタンを押下したときメールを送信するサンプルです。
ACCESS_KEY,SECRET_KEY,FROM_ADDRESS,TO_ADDRESS は「1.AWS側の設定」で設定したものに置き換えて下さい。

#import "ViewController.h"

#import <AWSRuntime/AWSRuntime.h>
#import <AWSSES/AWSSES.h>

#define ACCESS_KEY @"YOUR_ACCESS_KEY"
#define SECRET_KEY @"YOUR_SECRET_KEY"
#define FROM_ADDRESS @"you@example.com"
#define TO_ADDRESS @"you@example.com"


@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (IBAction)sendEmailWithSES:(id)sender {

    [self sendMailWithSES];

}

- (void)sendMailWithSES
{
    AmazonSESClient *sesClient = [[AmazonSESClient alloc] initWithAccessKey:ACCESS_KEY
                                                              withSecretKey:SECRET_KEY];
    
    //件名の情報
    SESContent *subject = [[SESContent alloc] init];
    subject.data = [NSString stringWithFormat: @"%@", @"件名です"];
    
    //本文の情報
    SESContent *messageBody = [[SESContent alloc] init];
    messageBody.data = [NSString stringWithFormat: @"%@", @"本文です"];
    
    SESBody *body = [[SESBody alloc] init];
    body.text = messageBody;
    
    SESMessage *message = [[SESMessage alloc] init];
    message.subject = subject;
    message.body    = body;
    
    //送信先の情報
    SESDestination *destination = [[SESDestination alloc] init];
    [destination.toAddresses addObject:TO_ADDRESS];
    
    SESSendEmailRequest *ser = [[SESSendEmailRequest alloc] init];
    
    ser.source      = FROM_ADDRESS; //送信元アドレス
    ser.destination = destination; //送信先の情報
    ser.message     = message; //メッセージの情報
    
    @try {
        //sendEmail でメール送信
        SESSendEmailResponse *response = [sesClient sendEmail:ser];
        NSLog(@"%@",[response description]);
    }
    @catch (AmazonServiceException *exception) {
        //例外があればこちらへ
        NSLog(@"%@",[exception message]);
    }

}

@end

上記プログラムからメール送信したところ問題なく送信できました。ちなみにgmailではamazonses.com経由であることが表示されます。
Amazon SESメール送信サンプル

おわりに

iOSではアプリからメールを送信する場合、標準メーラーを起動して送信する方法が一般的かと思いますが、Amazon SESとAWS SDK for iOSを使えばバックグラウンドでのメール送信も出来そうです。

SDKはiOSからも手軽に使えるため、AWSの他のサービスについてもSDKを使って利用してみたくなりました。