【AWS】Amazon SESを生涯初めてセットアップした話

研究
John-Mark Smith at Pexels
この記事は約7分で読めます。

この記事は2年前の記事です。当時の情報、理解に基づいておりますのでご留意ください

必要に駆られましたorz

経緯としては以下の通り

・Lightsailにてsendmailから発信する、GSuiteでアカウント作ったメールの配信が遅延する
・maillogを漁っていると、以下のメッセージ

Deferred: Connection timed out with aspmx.l.google.com.

・他のサーバでは発生していない

・そのくせメールの遅配が命取りになり兼ねないオーダーなので、仕方ないからAmazon SESを使う旨提案

Amazon SES(高可用性で低価格なEメール送信サービス)| AWS
Amazon SESは、デジタルマーケティング担当者やアプリケーション開発者がマーケティング、通知、トランザクションに関するEメールを送信できるように設計された、クラウドベースのEメール送信サービスです。Eメールを利用してお客様とのつながりを維持するあらゆる規模の企業を対象とした、コスト効率の高い信頼できるサービスです...

珍しく提案が通ったよ。

Amazon SESとは

Amazon SESがどの様なものかは以下に詳しいです。

Amazon SESによるメール送信環境の構築と実践 | DevelopersIO
Amazon SES を利用してメール送信する際に必要となるスパム対策の基礎知識と、環境構築や利用申請の方法については具体的にステップ・バイ・ステップで説明します。SESのメール送信では、SESの利用方法や応用例をご紹介 …

超ざっくり言うと、今までEC2が散々スパムの踏み台にされて来たので、今度はAmazon様が公式にメールの発信元の裏どりをしてくれる次第になった模様です。

設定

まずAWSのコンソールに入り、Amazon SESを探し出し画面を展開

2019/12/19現在、東京リージョンで展開されていない
ムンバイ、シドニー、フランクフルト、アイルランド、バージニア、オレゴン…さあどこにしよう、という次第でバージニアに

ここで認証して欲しい送信元のドメイン、もしくはメルアドを指定します。今回はドメインの認証をもらいます。

AWS SESで送信ドメイン認証を設定する - Qiita
送信ドメイン認証 前回の記事では送信ドメイン認証について簡単にまとめてみました。 今回はAWS SESを用いて実際に送信ドメイン認証を導入してみます 送信ドメイン認証についておさらいしたい方はこちらの記事もどうぞ↓ ...

手順はこちらに詳しいです。

ドメインを認証する為にDNSレコードに入れる設定値をもらえます。認証が通るとVerifiedになります。

認証が通ったので送信実験を行うも、外部ドメインに発信しようとすると

Email address is not verified. The following identities failed the check in region ほにゃらら

と叱られます。さっきVerified言ったじゃんorz

ここからハマったポイント

ハマりポイント1

「違う、そうじゃない」話でした。
デフォルトはSandboxモードなので外部への発信を行うにはAWS様にお断りを入れろ、的な話なんです。
その旨まっすぐ言ってくれればいいのにorz

そこでサポートへお断りを入れます。

Amazon SES でドメイン検証してメールを送信してみた - michimani.net
Amazon SES からメールを送信するには、メールアドレスまたはドメインを検証する必要があります。今回はドメインを検証してメールを送信するところまでやってみたのでそのメモです。

入力項目が煩雑でわかりにくいですが手順はこちらが詳しいです。

んで実作業を行うのは多分バージニア、人力なので一晩待機。Resolvedになったら、コマンドラインでメールが送れるかを検証します。

コマンドラインでの作業含めSESからメールを発信するにはSMTP情報が必要になります。

Amazon SES SMTP 認証情報の取得 - Amazon Simple Email Service
Amazon SES SMTP ユーザー名とパスワードを取得して、Amazon SES SMTP インターフェイスにアクセスできるようにします。

SMTP情報はIAMユーザーに付与されるので、以下の画面の「Create My SMTP Credentials」からIAMの画面を展開して登録します。

自分で忘れさえしなければデフォルト値でOK。

ハマりポイント2

そして、IAMのアクセスキー等々とSMTP情報は別物なので、この画面から取得できる情報またはCredential.csvを保持して使わないとなりません。

やっと以下の通りに、サーバのコマンドラインでコマンドを流してみて送信確認をとります。

コマンドラインを使用して Amazon SES SMTP インターフェイスへの接続をテストする - Amazon Simple Email Service
一般的なコマンドラインユーティリティを使用して、Amazon SES SMTP インターフェイスへの接続をテストします。

ハマりポイント3

なおここで

OpenSSL を使用して SMTP インターフェイスに接続する場合は、base64 エンコードを使用して SMTP 認証情報をエンコードする必要があります。

この1文を読み飛ばしていた為ハマりました。orz

openssl s_client -crlf -quiet -starttls smtp -connect email-smtp.us-west-2.amazonaws.com:587
openssl s_client -crlf -quiet -connect email-smtp.us-west-2.amazonaws.com:465

ここで email-smtp.us-west-2.amazonaws.com を任意のリージョンのそれに読み替えます。

よしなにメールが飛んだところを確認したら、やっとPHPに組み込んでやります。

システムはPHP+CodeIgniter3なので、

$this->load->library('email');
$config['protocol']  = 'smtp';
$config['smtp_port'] = '587';
$config['smtp_host'] = 'email-smtp.us-east-1.amazonaws.com';
$config['smtp_user'] = 'base64する前のユーザーID';
$config['smtp_pass'] = 'base64する前のパスワード';
$config['smtp_timeout'] = 15;

と書いていた。
(注:CodeIgniter4と記述が異なります)

Error: 530 Must issue a STARTTLS command first

と叱られた。orz

$config['smtp_crypto'] = 'tls';

この1行がいなかった。
斯くして…飛んだ!!駄菓子菓子。

Action: failed
Remote-MTA: dns; amazonses.com
Final-Recipient: rfc822; hoge@foo.bar
Diagnostic-Code: Amazon SES did not send the message to this address because it is on the suppression list for your account. For more information about removing addresses from the suppression list, see the Amazon SES Developer Guide at https://docs.aws.amazon.com/ses/latest/DeveloperGuide/sending-email-suppression-list.html
Status: 5.1.1

と仰られる。orz
調べると

バウンスアクション - Amazon Simple Email Service
Amazon SES による E メール受信に関して、バウンスアクションを設定する方法を説明します。

Mailbox Does Not Exist

要するにいつも悩んでるんですが独自ドメインのサーバから同一のドメイン先にメールを送信しようとするとメールがサーバの外に出てくれない現象なので
今回は幸いGSuite。
ドメイン名の後ろに hoge@foo.com.test-google-x.com とかつく予備メルアドが有るので、これを使わせていただくことにしましたw

しかし

独自ドメインのサーバから同一のドメイン先にメールを送信しようとするとメールがサーバの外に出てくれない

以前解決した様な気がしたんだけどなー、これ。
すごく時間がある時に調べよう。なんか勘違いしてるかもしれないし。

コメント

タイトルとURLをコピーしました