AWS で手軽にメール送信する

Webサービスなどを構築する際にクラウドサービスを利用するのは、もはや当たり前とも言える時代です。そんな時、メール送信周りがうまくいかずにトラブルになるという話も良く聞かれます。送信はできるようになっても、迷惑メールとして判定されてしまったという話も聞かれます。

今回はそんなトラブルを回避すべく、AWSとCustomers Mail Cloudを組み合わせる方法を紹介します。

Customers Mail Cloudの設定

まずはCustomers Mail Cloudにて送信サーバの設定を行います。

ユーザ登録

ユーザ登録はまず、メールアドレスとパスワードを入力するところからはじまります。

f:id:moongift:20190510151017p:plain
ユーザ登録

入力したメールアドレス宛にメールアドレスの確認メール(仮登録受付メール)が届きますので、URLをクリックします。その後、名前や住所といった必要な情報を入力します。ユーザ登録が完了すると、無料トライアル開始のための審査が入ります。時間は長くとも30分程度です。「Customers Mail Cloud 無料トライアル利用開始のご案内」というメールが届いたら利用できます。

ログイン後に行うこと

ログインしたら、2つの作業を行う必要があります。

f:id:moongift:20190510150911p:plain
ダッシュボード

DKIMキーを設定する

DKIMキーはメールのなりすましを防止するための技術になります。メール配信を行うドメインのTXTレコードに対して設定します。管理コンソールでドメインを追加しようとすると、専用のキーが表示されます。

f:id:moongift:20190510150735p:plain
DKIMキーの取得

ドメインは s999999999999._domainkey.example.com のような形式になります。設定する値は v=DKIM1; p=MIG...QAB のように指定されるはずです。この設定はシステム管理者などに依頼して行ってもらってください。

DNS設定はすぐに反映されませんので、数分後にDNSを確認ボタンを押します。正しく設定されていれば、ドメインが追加登録できます。

ユーザを追加する

次にメール配信を行うユーザを追加します。これはAPI設定にて行います。ユーザ名(メールアドレス形式)、パスワードを設定します。また、利用できる機能を制限できます。例えばSMTPのみ、APIのみといった指定も可能です。

f:id:moongift:20190510150841p:plain
ユーザの追加

サーバに設定を反映する

設定を行ったら、それをサーバに反映します。サーバ構成機能にて行います。この反映を行わないと、DKIMやユーザ追加設定が反映されませんので注意してください。ここまでで以下の情報が入手できているはずです。

  • SMTPサーバのアドレス
  • SMTPサーバのポート番号
  • APIユーザ
  • APIキー

これらの情報はメール送信時に設定しますので覚えておいてください。

AWSのセットアップ

続いてAWS EC2でインスタンスを立てます。今回はAmazon Linux AMIを使っています。CentOSベースでYumでパッケージ管理できます。

f:id:moongift:20190704174647p:plain
Amazon Linux AMIでインスタンス作成

インスタンスにログイン

Amazon Linux AMIの場合、デフォルトで ec2-user というユーザが作られますので、インスタンスのIPアドレスを指定してログインします。smtps.keyはインスタンスを作成する際にダウンロード(または既存のものを指定)する認証鍵です。

ssh -i smtps.key ec2-user@(インスタンスのIPアドレス)

セットアップ

まずはYumでパッケージを更新します。

sudo yum update

今回はPHPから送信を試したいと思いますので、PHP(バージョン7.3)をインストールします。

yum install php73

Postfixの設定

メール送信はSendmailではなく、SMTPリレーに対応したPostfixを使います。設定は /etc/postfix/main.cf に記述されています。このファイルを vi や nanoなどで開きます。

修正点は以下の通りです。まず relayhost という設定があるので、Customers Mail CloudのSMTPサーバアドレスとポート番号を記述します。以下は一例です。

# SMTPサーバのIPアドレス:ポート番号 という形です
relayhost = sandbox.smtps.jp:10025

ファイルの末尾に以下を記述します。これは認証設定になります。

smtp_tls_security_level = encrypt
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
header_size_limit = 4096000
smtp_sasl_security_options = noanonymous

設定ファイルを閉じます。

認証設定を行う

次に以下のコマンドを実行します。括弧内をすべて指定されたものに書き換えてください。この一連の操作はroot権限で行っています。

# echo (SMTPサーバアドレス):(ポート番号) (APIユーザ):(APIキー) >> /etc/postfix/sasl_passwd

例えば下記のようになります。

# echo sandbox.smtps.jp:10025 user:password >> /etc/postfix/sasl_passwd

DBファイルを生成します。

# postmap /etc/postfix/sasl_passwd

DBファイル化したオリジナルファイルは不要なので削除します。

# rm /etc/postfix/sasl_passwd

DBファイルに対してアクセス権限を設定します。

# chmod 600 /etc/postfix/sasl_passwd.db

Postfixを再起動して設定を反映します。

# service postfix start
# chkconfig postfix on

Composerのインストール

PHPのパッケージ管理であるComposerをインストールします。Download Composerに書かれている内容のままです。

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

PHPMailerのインストール

メール送信用のライブラリとしてPHPMailerをインストールします。インストールはComposerのコマンドで行います。まずは初期化します。

php composer.phar init

入力必須なのは名前とメールアドレスになります。初期化したらPHPMailerをインストールします。

php composer.phar require phpmailer/phpmailer

メール送信する

では実際にメール送信を行います。まずライブラリを読み込みます。

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';

そしてPHPMailerを初期化します。日本語メールのために文字コードをUTF-8で指定します。

$mail = new PHPMailer(true);
$mail->CharSet = 'UTF-8';
$mail->Encoding = 'base64';

次に送信元、送信先の設定を行います。

// 送信元
$mail->setFrom('info@smtps.jp', '管理者');
// 送信先(複数指定可能)
$mail->addAddress('user@smtps.jp', 'ユーザ');
// 件名
$mail->Subject = '日本語の件名';
// HTMLメールの場合
$mail->isHTML(true);
// HTMLでの本文
$mail->Body    = 'これはHTMLメールです <b>in bold!</b>';
// HTMLに対応していなかった場合の本文
$mail->AltBody = 'これはテキストメールです';

そして最後に送信処理を行います。

$mail->send();

管理画面

メール配信状況であったり、エラーの捕捉が管理画面で可能です。管理画面があれば配信が正しく行われているかどうか、一目で分かるでしょう。

f:id:moongift:20190704174730p:plain
Customers Mail Cloudの管理画面

クラウドからのメール送信を簡単に。確実に。| Customers Mail Cloud