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

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

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

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

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

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

Amazon SES(高可用性で低価格なEメール送信サービス)| AWS

大規模なインバウンドおよびアウトバウンドのクラウドメールサービス Amazon Simple Email Service (SES) は、デベロッパーが任意のアプリケーションでメールを送信できるようにする、費用対効果の高い、柔軟でスケーラブルなメールサービスです。Amazon SES はすぐに設定でき、トランザクション、マーケティング、大量の E メール通信など、いくつかの E メールのユースケースをサポートします。 Amazon SES の柔軟な IP デプロイと E メール認証オプションは、配信可能性を高め、送信者のレピュテーションを保護すると同時に、送信分析で各 E メールの影響を測定します。Amazon SES を使用すると、安全、グローバル、大規模に E メールを送信できます。 Reddit が Amazon SES を使用して、何百万ものグローバルユーザーにエンドユーザーのエンゲージメントを進める方法について学びます。 詳細 Amazon SES を使用して、Netflix がいかにしてメールの配信可能性、受信トレイの配置、送信者のスコアを向上させたかについて学びます。 詳細 Duolingo が Amazon SES を使用して 3 億人を超えるユーザーが新しい言語を学べるよう支援する方法について学びます。 詳細 バウンスと苦情の処理 2020 年 4 月 23 日 受信メールを外部の宛先に転送する 2019 年 10 月 8 日 詳細 ” メールテンプレートと一括送信の紹介 2017 年 10 月 11 日 Amazon SES の特徴のページにアクセスします。 詳細 AWS マネジメントコンソールで Amazon SES を使った構築を始めましょう。 サインイン

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

Amazon SESによるメール送信環境の構築と実践 | Developers.IO

Amazon SES(Simple Email Service)は Amazonが提供するフルマネージド型のメール配信サービスで以下の特徴があります。 初期費用無し、低価格 配送機能のみ提供 Email配送API 高可用性・高信頼性・スケーラブル 稼働時間とメール到達性に最適化 Amazonで証明された配送実績 SESの全体像については、 「AWS Black Belt Tech Webinar 2014 – Amazon Simple Email Service」レポート にまとめられていますのご覧ください。 メールを受信するサーバーではスパムメールを受信しないための対策を行っています。その結果、普通のメールを送る場合でも、送信ドメイン認証を導入していないメールサーバーからメール送信するとスパムメール扱いを受けてしまいメールが相手に届きません。メールの送信者偽称を防ぐ送信ドメイン認証技術として、SPF と DKIMがあります。 送信元IPアドレスをチェックする SPF SPF(Sedber Policy Framework) はメール送信元のIPアドレスを基準に送信者を認証します。ドメインのメールを送信するサーバのIPアドレスをリストして管理して、リストにないIPアドレスからのメールを破棄します。DNSにTXT/SPFレコードを追加してSESからのメール送信を許可する設定をします。 送信ドメインを電子署名で認証する DKIM DKIM(Domainkeys indentification) は電子署名を使って送信ドメインを認証します。送信側で電子署名を施し、受信側で電子署名の照合を行うことで、偽者を見破り破棄することができます。DNSにCNAMEレコード(公開鍵)を追加して、SESからのメール送信を受信側で電子署名の照合を行い、不一致のメールは破棄します。 SPFとDKIMの具体的な設定方法や内容については後述します。また、これらの詳細について知りたい場合は、 Amazon SESでSPFとDKIMを用いて高信頼なメールを送る を参照してください。 メールを安定して送信するには、スパムメールの送信者として扱いを受けないように、常にバウンス率や苦情率を低く保ち続ける運用が必要となります。 バウンス(Bounce)とは、配信したメール・配信しようとしたメールがなんらかのエラーによって 送信者に差し戻されたメールのことです。SESではバウンス率が一定の水準を超えるとそのアカウントのメール配信が停止されますので、バウンスは常に注意が必要です。その理由は、スパム事業者は不特定多数のメールアドレスに対して大量のメールを送り付けますが、スパムメールが到達した後に受信者がドメイン拒否の設定などによって到達しなくなることで、バウンス率が上昇することがあるからです。「バウンス」に関しては Amazon SES のバウンスに関するよくある質問 にまとめられていますので御覧ください。 過去 14 日以内にハードバウンスの原因となった受信メールアドレスを保持する仕組みがあり、これを サプレッションリストと呼びます。サプレッションリストに登録されているアドレスにメールを送信しようとした場合、SES の呼び出しは成功しますが、このメールを送信せず、送信量上限やバウンス率にカウントするので注意が必要です。Management Console の Suppression List Removal からサプレッションリスト登録されたメールアドレスを削除することができます。詳細は Amazon SES サプレッションリストからの E メールアドレスの削除 をご参考にしてください。 苦情(Complaint)とは、メールの受信者がメッセージがスパムと報告すると ISP はこのことを苦情として記録します。このような苦情が多すぎる場合は、送信者がスパムを送信していると ISP が判断する可能性が高くなります。SESでは苦情率が一定の水準を超えるとそのアカウントのメール配信が停止されますので、苦情についても常に注意が必要です。SES では、苦情を申し立てたことを送信者に知らせるため、フィードバックループを採用している ISP からの苦情は自動的に送信者に転送されます。「苦情」に関しては Amazon SES の苦情に関するよくある質問 にまとめられていますので御覧ください。 下記のAWSの公式ドキュメントでは、「基本的に バウンス率は 5% 以下に維持してください。」「基本的に 苦情率は 0.1% 未満 に維持してください。」と記載されています。バウンスや苦情については、Management Console の Your …

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

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

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

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

AWS SESで送信ドメイン認証を設定する – Qiita

前回の記事では送信ドメイン認証について簡単にまとめてみました。 今回はAWS SESを用いて実際に送信ドメイン認証を導入してみます 送信ドメイン認証についておさらいしたい方はこちらの記事もどうぞ↓ SES = Simple Email Service の略 AWSが提供する、メールを送ることに特化したシステムです。本来メールを送るには、いろいろとインストールをしたり、セットアップしたり、ライセンスが必要だったりします。でも、Amazon SES は単純に API を使うだけで利用出来ます。というかコンソール上でだいたいのことができます。 AWS SES (上述のとおり) AWS Route53 (AWSのDNSウェブサービス SESを使うならこれが便利) Freenom (無料ドメインがもらえるDNSウェブサービス) Gmail では本題の送信ドメイン認証の導入をしていきます。 今回はDKIMの設定をすることとします。 まずは、SESのDomainsの設定からです。AWS SESのコンソール画面へ行きます。 これはSESコンソールのDomains画面です。モザイクをかけていますが、3つドメインがありますね。 ここで、この記事のゴールを以下のように設定しましょう。 DKIMによって認証されたドメインがこの画面に追加されていること DKIMによって認証されたドメインからメールを送ること これらのゴールに向けて進めていきます。 では、次にドメインを入手します。ドメインの入手方法は以下の2つを紹介しようと思います。 ・AWS Route53 (AWSのDNSウェブサービス SESを使うならこれが便利) ・Freenom (無料ドメインがもらえるDNSウェブサービス) AWS Route53を使う場合 送信ドメイン認証の設定は非常に簡単ですが無料のドメインは無かったと思います。 すでに持っている方はいいですが、試しにこれからやってみる程度の温度感の場合ちょっと有料だと気が引けますね。 有料でもいいから試してみたいという方はこちらの記事を参考にドメインを取得してみてください。 http://qiita.com/sk565/items/2da1fc0c5fc676f54994 無料ドメインで試す場合 海外のサービスですが、freenomというDNSサービスを発見しました。期間はありますが、無料でドメインが取得できるのでこちらでも試すことができます。 http://www.freenom.com/ja/freeandpaiddomains.html さて、ドメインを入手したらいよいよ送信ドメイン認証の導入作業に入ります。 先ほどのSESコンソールのDomains画面で「verify a New Domain」を押します。 すると、以下のような画面が出てくるので、登録するドメインを入力します。 このとき、「verify a New Domain」を押す前に「Generate DKIM Settings」にチェックを入れるのをお忘れなく。 「Verify this Domain」を押すと、以下のようにDKIMの設定に必要なレコードが複数出てくるので、 これらを控えておいてください。 もし、Route53で取得したドメインを使った場合は「USE Route53」のボタンが出現しこちらを押すだけでDKIMの設定が完了するので、レコードを控える必要もないです。おつかれさまでした。 Route53でドメインを取得していない場合は、先ほど控えたレコードをDNSサービス側で設定してあげなければなりません。 今回は先ほど紹介したfreenomでの作業例を紹介します。 こちらがfreenomのDNSレコード設定画面です。 取得したドメインに対して先ほど控えておいたTYPEがTXTのレコード1件と、TYPEがCNAMEのレコード3件を登録します。 登録が完了したら、数日待ちましょう。そのうち認証されます。 認証が完了した場合、DKIM欄の「pending verification」の文字列が 以下のように「verified」になります。この状態になればドメインに対してDKIMの設定が完了となります。 せっかくドメインの認証をしたので、メールを送ってみましょう!

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

ドメインを認証する為に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 からメールを送信するには、メールアドレスまたはドメインを検証する必要があります。今回はドメインを検証してメールを送信するところまでやってみたのでそのメモです。 Amazon SES (以下、SES) からメールを送信してみます。 SES からメールを送信するためには、送信元となる メールアドレスを検証 する方法と、送信元となるメールアドレスの ドメインを検証 する方法があります。 メールアドレスの検証では、 test@michimani.net というアドレスを検証することでこのアドレスからメールを送信することができるようになります。 一方、ドメインの検証では、 miichimani.net というドメインを検証することで、 test-desu@michimani.net や test-dayo@michimani.net など、ドメインさえ michimani.net であれば @ 以前はなんでもよくなります。 今回は後者の ドメインを検証 してメールを送信してみます。 ちなみに Amazon SES は 2019年11月時点では東京リージョン (ap-northeast-1) で利用できないため、バージニア北部リージョン (us-east-1) で利用します。 具体的な手順は下記の流れになります。 SES でドメイン検証 サンドボックステスト実施 SES からの送信制限解除をサポートに申請 外部ドメインに対してメール送信してみる マネジメントコンソールで SES のダッシュボードを開き、サイドメニューの Domains

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

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

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

Amazon SES SMTP 認証情報の取得

英語の翻訳が提供されている場合で、内容が矛盾する場合には、英語版がオリジナルとして取り扱われます。翻訳は機械翻訳により提供されています。 Amazon SES SMTP インターフェイスにアクセスするには、Amazon SES SMTP のユーザー名とパスワードが必要です。 Amazon SES SMTP インターフェイスを介して E メールを送信するために使用する認証情報は、各 AWS リージョンに固有のものです。Amazon SES SMTP インターフェイスを使用して複数のリージョンに E メールを送信する場合は、各リージョンで SMTP 認証情報のセットを生成する必要があります。 2019年1月10日以前にSMTP認証情報を作成した場合、SMTP認証情報は、 AWS 署名。セキュリティ上の理由から、この日付より前に作成した資格情報を削除し、新しい資格情報に置き換える必要があります。 古い認証情報は、IAM コンソールを使用して削除 できます。 Amazon SES コンソールを使用して SMTP 認証情報を生成する場合、Amazon SES コンソールは、Amazon SES を呼び出すための適切なポリシーを持った IAM ユーザーを作成した上で、そのユーザーに関連付けられている SMTP 認証情報を提示します。 IAM ユーザーは Amazon SES SMTP 認証情報を作成できます。ただし、Amazon SES SMTP

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

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

  • ハマりポイント2

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

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

コマンドラインを使用して Amazon SES SMTP インターフェイスへの接続をテストする

英語の翻訳が提供されている場合で、内容が矛盾する場合には、英語版がオリジナルとして取り扱われます。翻訳は機械翻訳により提供されています。 Amazon SES SMTP インターフェイスは、オペレーティングシステムのコマンドラインから操作できます。このセクションで説明する方法は、Amazon SES SMTP エンドポイントへの接続のテスト、SMTP 認証情報の検証、および接続問題のトラブルシューティングでの使用を目的としています。以下の手順では、代表的なオペレーティングシステムに搭載されているツールやライブラリを使用します。 SMTP 接続問題のトラブルシューティングの詳細については、「 Amazon SES SMTP に関する問題 」を参照してください。 Amazon SES SMTP インターフェイスに接続するときは、SMTP 認証情報のセットを指定する必要があります。SMTP 認証情報は、標準の AWS 認証情報とは異なります。2 つのタイプの認証情報は、一方をもう一方の代わりに使用することはできません。SMTP 認証情報を取得する方法の詳細については、「 Amazon SES SMTP 認証情報の取得 」を参照してください。 コマンドラインを使用すると、認証情報の入力やメッセージの送信を行うことなく、Amazon SES SMTP インターフェイスへの接続をテストできます。この手順は、基本的な接続問題のトラブルシューティングに役立ちます。 このセクションでは、OpenSSL (ほとんどの Linux、macOS、Unix ディストリビューションに搭載され、Windows でも使用可能) と PowerShell の Test-NetConnection コマンドレット (ほとんどの最新バージョンの Windows に搭載) の両方を使用して接続をテストする手順を示します。 コマンドラインを使用して、Amazon SES SMTP インターフェイスを介してメッセージを送信することもできます。この手順は、SMTP 認証情報をテストする場合や、Amazon SES を使用して送信するメッセージを特定の受信者が受信できるかどうかをテストする場合に役立ちます。 ブラウザで JavaScript が無効になっているか、使用できません。

  • ハマりポイント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
調べると

バウンスアクション

英語の翻訳が提供されている場合で、内容が矛盾する場合には、英語版がオリジナルとして取り扱われます。翻訳は機械翻訳により提供されています。 バウンス アクションは、送信者にバウンス応答を返すことによって E メールを拒否し、オプションで Amazon SNS を通じて通知します。このアクションには以下のオプションがあります。 SMTP Status Code – で定義される SMTP 拡張ステータスコード。 Message – バウンス E メールに含める、人間が読み取れるテキスト。 Reply Sender – バウンス E メールの送信者の E メールアドレス。これは、バウンス E メールの送信元アドレスです。Amazon SES で検証されている必要があります。 SNS Topic – バウンス E メールが送信されたときにオプションで通知するための Amazon SNS トピックの名前または ARN。Amazon SNS トピックの ARN の例は、 arn:aws:sns:us-west-2:123456789012:MyTopic となります。アクションを設定するときに [ Create

Mailbox Does Not Exist

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

しかし

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

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

コメント

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