就業型インターンでAmazon SESを触ったのでまとめてみた

背景

私は8月上旬ごろから就業型インターンとしてエキサイトのヘルスケア事業に携わらせていただきました。今回はPHPのBEARというフレームワークを使用して開発を行いました。

この時に「現在配信しているテキストメールをマルチパートメールに変換する」というタスクがあり、もう一人のインターン生の子と一緒に、ツールやサービスで配信されているメールをほぼ全てマルチパートメールに対応させました。

エキサイトでメール配信に使用されているサービスがAmazon SESでした。

普段はあまりAWSを触らないのでやったことの整理と共にSESについて少しだけ調べてみました。

Amazon SESについて

そもそもAmazon SESって?

SESは、Amazon Simple Email Serviceの略です。 公式によると、「デベロッパーが任意のアプリケーションでメールを送信できるようにする、費用対効果の高い、柔軟でスケーラブルなメールサービス」のことだそうです。

使用した分のみに対して料金が発生するので、ユースケースによってはコストを低く抑えることができます。

とはいえ、無料枠では24時間で200通ほど送信することができるので、個人開発だったらあまりこの範囲を超えることはないんじゃないかなーと思います。それ以降 1,000 通ごとに 0.10USDがかかります。

取引EメールやマーケティングEメール、また通知などの一斉送信にも利用されています。

エキサイトでは、パスワード変更や予約の確認通知に使用されていました。

マルチパートメールについて

マルチパートメールとは、HTMLメールとテキストメールをひとまとめにして送信できるメールのことで、受信者の環境に合わせたメール配信をすることができます。

メールの形式はヘッダーのContent-typeから確認できます。

実際に何をしたのか?

PHPAPIを使用してメールの設定変更を行いました。元々テキストメールで配信していた通知をマルチパートメールにしました。

Amazon SES コンソール、API、または SMTP のいずれかを使用して送信設定を行います。

1から開発するのなら色々初期設定が必要そう(phpmailerのインストール、エンドポイントと接続、メールサーバーとの接続など)なのですが、業務では扱わなかったので一旦割愛します。

今回はAWS SDK for PHP経由でAPIを利用しました。これによってSendEmailメソッドを使うことができます。標準的なメッセージだけでなく、rawメールやテンプレートを使うこともできます。

環境: 言語: PHP(BEAR.Saturday) Amazon SES API v2 AWS SDK v3.173

変更するSESの設定ファイル

<?php

require 'vendor/autoload.php';

use Aws\Ses\SesClient;
use Aws\Exception\AwsException;

$SesClient = new SesClient([
    'profile' => 'default',
    'version' => '2010-12-01',
    'region'  => 'us-west-2'
]);


$sender_email = 'sender@example.com';
$recipient_emails = ['recipient1@example.com','recipient2@example.com'];
$configuration_set = 'ConfigSet';

$subject = 'Amazon SES test (AWS SDK for PHP)';
$plaintext_body = 'This email was sent with Amazon SES using the AWS SDK for PHP.' ;
$html_body =  '<h1>AWS Amazon Simple Email Service Test Email</h1>'.
              '<p>This email was sent with <a href="https://aws.amazon.com/ses/">'.
              'Amazon SES</a> using the <a href="https://aws.amazon.com/sdk-for-php/">'.
              'AWS SDK for PHP</a>.</p>';
$char_set = 'UTF-8';

try {
    $result = $SesClient->sendEmail([
        'Destination' => [
            'ToAddresses' => $recipient_emails,
        ],
        'ReplyToAddresses' => [$sender_email],
        'Source' => $sender_email,
        'Message' => [
          'Body' => [
// マルチパートメールにするにはBodyにHtmlとTextを両方指定する
              'Html' => [
                  'Charset' => $char_set,
                  'Data' => $html_body,
              ],
              'Text' => [
                  'Charset' => $char_set,
                  'Data' => $plaintext_body,
              ],
          ],
          'Subject' => [
              'Charset' => $char_set,
              'Data' => $subject,
          ],
        ],
        'ConfigurationSetName' => $configuration_set,
    ]);
    $messageId = $result['MessageId'];
    echo("Email sent! Message ID: $messageId"."\n");
} catch (AwsException $e) {
    echo $e->getMessage();
    echo("The email was not sent. Error message: ".$e->getAwsErrorMessage()."\n");
    echo "\n";
}

Bodyにはと文字コードの設定とメール本文の入力を行います。 この部分にHtmlのみのメール本文を指定した場合はHTMLメールに、Textのみメール本文を指定した場合はテキストメールになります。マルチパートメールの場合は両方とも指定します。

HtmlとTextのData両方にメール本文が入っていた場合は、Htmlの内容が優先されます。Textのみに値が入っていた場合はContent-type: text/plainとしてテキストメールが送信されていました。

テキストメールからマルチパートメールになったことで何が変わったのか

マルチパートメールにすることで、HTMLとしての表示、テキストメールとしての表示が可能となります。

エキサイトでは、変更以前はテキストメールとして配信していました。HTMLメールでの配信ができるようになったことで

  • リンクが踏めるようになった
  • 画像の添付が可能になった

というメリットが生まれました。

まず、リンクが踏めるようになったことに関してです。使用しているメールアプリによっては、テキストメールであってもリンクを認識するとリンクとして踏めるようになっていますが、その仕組みがないものについては文字列として表示されているだけでした。

この変更によりどのメーラーでもリンクとして表示されるので、ユーザー側でいちいちコピペをする手間を省くことができます。

次に画像の添付についてです。 今後もしユーザー宛のメールに広告を貼ったり画像を使用するようになるとテキストメールだけでは対応できなくなります。

HTMLメールを活用することで、より具体的なイメージを伝えたり、視覚的な訴求をすることができます。

このように、HTMLメールにも対応できることでユーザーの利便性を高めることにつながりました。

最後に

メールを普段使いしなくなったこともあり、メールについて知る機会がほぼありませんでした。 そもそもAWSにメールサービスがあること自体を初めて知ることになり、良い経験だったと思います。

場面や目的に応じてどのような形式が良いかを考えて使うことが重要だと思いました。