AWS S3とSESで「メーラーを用いた会員登録」を実装する
2018/10/09
Table of Contents
SESの設定をする
AWSマネジメントコンソールのSESのEmail Receivingの設定をします。
まずはRule setの新規作成で、受け取り用のメールアドレスを追加します。
ドメインをVerifyしていない場合は、SESのIdentity Managementの設定から、Domainを選択して、認証を完了する必要があります。
設定の際に発行される、MXレコードをDNSに追加することで、認証が可能です。
(※この際、「Use Route53」を押すと、Route53のMXレコードが自動で上書きされるため、注意してください。)
次にActionを設定します。
今回はS3にメールの内容を保存するため、S3を選択します。
S3bucketは既存のものを選択、もしくは新規作成をします。
既存のものを選択した場合は、権限に注意してください。
また、prefixは任意に設定。
SNS topicもここで新規作成が可能です。
最後にRule nameを入力して、SESの設定は完了です。
メールがS3に保存されるか確認する
設定したメールアドレスにメールを送ると、S3にメールの内容が保存されるか確認します。
以下のようにS3にファイルが保存されていることがわかります。
ファイルをダウンロードして、中身を確認すると、メールのヘッダーと共に、メールの内容が表示されます。
S3からメールアドレスを取得して、会員登録メールを送る
次にメールを送信したユーザーのアドレスに対して、会員登録用のリンクを送付します。
今回はアプリケーション側はCakePHP3を用いているため、CakePHP3のShellの機能を利用します。
class MailRegisterShell extends AppShell
{
private $s3Region = '';
private $s3Key = '';
private $s3Secret = '';
private $s3Bucket = '';
public function startup()
{
parent::startup();
// S3の読み取り権限のみを付与した、AWSのIAMの情報を入力します。
$this-\>s3Region = Configure::read('MailRegister\_Aws\_Settings.Region');
$this-\>s3Key = Configure::read('MailRegister\_Aws\_Settings.Key');
$this-\>s3Secret = Configure::read('MailRegister\_Aws\_Settings.Secret');
$this-\>s3Bucket = Configure::read('MailRegister\_Aws\_Settings.Bucket');
}
public function main()
{
$this-\>getFromS3();
}
public function getFromS3()
{
$s3 = Aws\S3\S3Client::factory([
'region' =\> $this-\>s3Region,
'key' =\> $this-\>s3Key,
'secret' =\> $this-\>s3Secret,
]);
try {
// Bucketからオブジェクト一覧を取得
$list = $s3-\>ListObjects(['Bucket' =\> $this-\>s3Bucket]);
// オブジェクトからメールアドレスを取得
$emails = $this-\>getEmail($s3, $list['Contents']);
foreach ($emails as $email) {
try {
// ここにメールを送るメソッドを記述
} catch (Exception $e) {
echo $e-\>getMessage();
}
}
// オブジェクトを削除
$this-\>deleteObject($s3, $list['Contents']);
} catch (S3Exception $e) {
echo $e-\>getMessage();
}
}
// S3オブジェクトからメールアドレスのみをとってくる
private function getEmail($client, $objects)
{
$emails = [];
foreach ($objects as $object) {
$result = $client-\>getObject([
'Bucket' =\> $this-\>s3Bucket,
'Key' =\> $object['Key'],
]);
// \<\>で囲まれた部分をとってくる
$start = mb\_strpos($result['Body'], '\<') + 1;
$end = mb\_strpos($result['Body'], '\>');
array\_push($emails, mb\_substr($result['Body'], $start, $end - $start));
}
// 重複を削除
$emails = array\_unique($emails);
return $emails;
}
// S3オブジェクトを削除する
public function deleteObject($client, $objects)
{
foreach ($objects as $object) {
$result = $client-\>deleteObject([
'Bucket' =\> $this-\>s3Bucket,
'Key' =\> $object['Key'],
]);
}
}
}
このShellをcronで定期的に実行することによって、メールを送信したユーザーに対して、会員登録のメールが届きます。
以上、AWS S3とSESで「メーラーを用いた会員登録」を実装してみました。
SESの設定、非常に手軽にできますので、是非やってみてください。
ありがとうございました。