Memo

メモ > サーバ > サービス: AWS > SES メール送信

■SES メール送信
■メールの送信 Amazon EC2 Eメール送信ベストプラクティス http://dev.classmethod.jp/cloud/aws/ec2-send-email-best-practice/ Amazon SESによるメール送信環境の構築と実践 http://dev.classmethod.jp/cloud/aws/amazon-ses-build-and-practice/ AWS SDK を使用して Amazon SES から E メールを送信する https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-an-email-using-sdk.html 以下は未検証だが比較的最近の記事 AWS再入門ブログリレー Amazon SES編 | Developers.IO https://dev.classmethod.jp/cloud/aws/re-introduction-2019-amazon-ses/ Amazon SES ベストプラクティス&アンチパターン - 後ろを向いて後退します http://micpsm.hatenablog.com/entry/2019/12/06/120000 【Amazon SES】SESでメール送信する時に知っておきたい事 - websandbag ブログ https://blog.websandbag.com/entry/2019/07/31/160557 Amazon SES でメール送信するときのベストプラクティスまとめ(2020年10月) | Developers.IO https://dev.classmethod.jp/articles/ses-send-mail-best-practices-summary/ SESが不正利用された!?その調査と対応 | Developers.IO https://dev.classmethod.jp/articles/ses_compromised_check/ さらにその後、以下の記事もあった 参考にできそう 大規模Email配信システムのクラウドジャーニー - DeNA Engineers' Blog https://engineer.dena.com/posts/2021.05/email-cloud-migration/ そのメール、本当に届いてる?Amazon SESの運用で得た監視プラクティス - Cybozu Inside Out | サイボウズエンジニアのブログ https://blog.cybozu.io/entry/2021/11/26/075846 AWS SESで信頼性の高いメール送信(SPF, DKIM, DMARC) with Terraform - 電気ひつじ牧場 https://cha-shu00.hatenablog.com/entry/2022/03/06/175823 2020年7月から東京リージョンが利用できるようになったので、東京リージョンで使用する Amazon SES 東京リージョン対応のお知らせ | Amazon Web Services ブログ https://aws.amazon.com/jp/blogs/news/amazon-ses-tokyo/ ■メール送信のベストプラクティス SESはバウンスや苦情を抑えることが重要になる 対策例が以下に紹介されているので参考にする Amazon SES を使用した E メール送信のベストプラクティス - Amazon Simple Email Service https://docs.aws.amazon.com/ja_jp/ses/latest/dg/best-practices.html ヒントとベストプラクティス - Amazon Simple Email Service https://docs.aws.amazon.com/ja_jp/ses/latest/dg/tips-and-best-practices.html Amazon SES 送信レビュープロセスに関するよくある質問 - Amazon Simple Email Service https://docs.aws.amazon.com/ja_jp/ses/latest/dg/faqs-enforcement.html 特に「Q11. バウンスを最小限に抑えるにはどうすればよいですか?」の項目が参考になりそう 例えばメールでの仮登録機能などは「友だちにメールを送る」機能の対策が参考になりそう Amazon Simple Email Service Eメール送信のベストプラクティス(PDF) https://media.amazonwebservices.com/jp/wp/AWS_Amazon_SES_Best_Practices.pdf 以下、実際に試した内容のメモ ■ドメインの登録 Amazon Simple Email Service → 設定 → 検証済みID → IDの作成 「IDの詳細」で以下のように入力する IDタイプ: ドメイン ドメイン: refirio.net 「デフォルト設定セットの割り当て」と「カスタムMAIL FROMドメインの使用」にはチェックを入れない 続いて「ドメインの検証」の「DKIM の詳細設定」で以下のように入力する IDタイプ: Easy DKIM DKIM署名キーの長さ: RSA_2048_BIT 「DNSレコードのRoute53への発行」と「DKIM署名」にチェックを入れる これで「IDの作成」ボタンをクリック 完了画面に
必要なアクション この ID の所有権を確認するには、指定された CNAME レコードを使用してドメインの DNS 設定で DKIM を設定する必要があります。
と表示された 画面上部の「ID ステータス」で「検証保留中」となっている また画面下部の「DomainKeys Identified Mail (DKIM)」で「DKIM の設定」が「保留中」となっている また「DNSレコードの発行」部分にCNAMEレコードが表示されている このレコードを登録する必要がある…かと思ったが、Route53を確認すると登録済みになっていた(Route53にドメインが存在する場合、自動で設定されるのかもしれない) SESの画面を再読み込みすると、どちらも「検証済み」になっていた また数分待つと「DKIM setup SUCCESS for refirio.net in Asia Pacific (Tokyo) region」というメールが届いた また、Route53を確認すると対象のCNAMEが登録されていた (サブドメインの権限を移譲した先のAWSアカウントでも問題無かった) ■SMTPアカウントの発行 Amazon Simple Email Service → SMTP設定 → SMTP認証情報の作成 IAMユーザの作成画面になる 「IAM User Name」はそのままで「作成」ボタンをクリック ボタンが「認証情報のダウンロード」に変わり、クリックするとアカウント情報が記載されたCSVファイルをダウンロードできる 今回は以下の情報を取得できた IAM User Name: ses-smtp-user.12345678-901234 Smtp Username: XXXXXXXXXX Smtp Password: YYYYYYYYYY それ以外の情報は、「SMTP設定」の画面に表示されている 今回は以下のように表示されていた SMTPエンドポイント: email-smtp.ap-northeast-1.amazonaws.com Transport Layer Security (TLS): 必須 STARTTLS ポート: 25、587 または 2587 カスタム SSL クライアントのサポート: - TLS ラッパーポート: 465 または 2465 この情報をもとに、いったんPHPMailerからメール送信テストを行なってみる(送信プログラムの詳細は、後述の「PHPMailerからSMTPでメールを送信」を参照) …が。以下のエラーになった 接続はできているようだが、送信制限に引っかかっているのだと思われる この時点では、送信元も送信先も refirio.net である必要がある…はず
CLIENT: 554 Message rejected: Email address is not verified. The following identities failed the check in region AP-NORTHEAST-1: refirio.work@gmail.com
■送信制限の解除 Amazon SES サンドボックス外への移動 - Amazon Simple Email Service https://docs.aws.amazon.com/ja_jp/ses/latest/dg/request-production-access.html Amazon Simple Email Service → アカウントダッシュボード 準備ができたら本稼働アクセスのリクエストをするように案内が表示されている 現時点では以下のように送信制限が表示されている 日次送信クォータ: 200(24時間あたりのEメール数) 最大送信レート: 1(1秒あたりのEメール数) 「本稼働アクセスのリクエスト」ボタンをクリック リクエストするための画面に遷移するので、以下のように入力 メールタイプ: トランザクション ウェブサイトのURL: https://refirio.net/ ユースケースの説明: お客様宛に通知メールを送信します。メール受信者のアドレスはシステムで管理されており、送信できないメールアドレスは登録されておりません。 その他の連絡先: (空欄) 連絡する際の希望言語: Japanese 「私はAWSサービス条件と適正利用規約(AUP)に同意します」にチェックを入れ、「リクエストの送信」ボタンをクリック 以下のように表示された
本稼働アクセスのリクエストが正常に送信されました。リクエストの詳細を確認するまでに最大で 24 時間かかることがあります。
翌日に以下のメールが届き、送信制限は解除された
平素は Amazon Web Services をご利用いただき、誠にありがとうございます。 このたびは、送信制限の引き上げ申請をご送信いただき、ありがとうございます。 新たな送信クォータは、1 日あたり 50,000 メッセージとなります。 新たな最大送信レートは、毎秒 14 メッセージです。 また、お客様のアカウントを Amazon SES サンドボックスから移動いたしました。 この引き上げは、アジアパシフィック (東京)リージョンにおいて、直ちに有効になります。 Amazon SES コンソールの送信統計情報のページで、または GetSendQuota API を使って、お客様のアカウントの現在の送信レートと送信クォータを確認することができます。 Amazon SES をご利用いただくうえで、下記の点にご留意ください。 - Amazon Web Services の規約( http://aws.amazon.com/aup/ )に準拠し、Amazon SES Service のサービス条件 セクション 22 ( http://aws.amazon.com/service-terms/ )をご確認ください。 - メール送信の明示的なリクエストがあった受信者に、質の高いコンテンツを送信してください。 詳細に関しては、下記のリンクをご参照ください。 https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/tips-and-best-practices.html - バウンスと苦情に対応するプロセスを設定してください。 詳細に関しては、下記のリンクをご参照ください。 https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/monitor-sending-activity.html - 複数のアカウントがある場合、新しいアカウントからは、既存のアカウントとは異なるタイプの E メールを送信してください。 詳細に関しては、下記のリンクをご参照ください。 https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/Welcome.html - Amazon SES のメールボックスシミュレーターを使用することで、テスト送信中にアカウントへ悪影響を及ぼすことなく、システム機能をテストできます。 詳細に関しては、下記のリンクをご参照ください。 https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/mailbox-simulator.html - 必要となる前に、送信制限の引き上げを申請してください。 詳細については、下記のリンクをご参照ください。 https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/manage-sending-limits.html - Amazon SES では、実際に使用した分についてのみ料金が発生します。 サブスクリプションや契約交渉、最低料金はありません。 詳細については、下記のリンクをご参照ください。 https://aws.amazon.com/jp/ses/pricing/ Amazon Web Servicesをご利用いただき、誠にありがとうございます。
再度PHPMailerからメール送信テストを行うと、無事にメールが送信できた またGmailからメールのヘッダを確認すると、以下のとおりSPF&DKIMともに「PASS」になっていた
SPF: PASS(IP: 23.251.234.10) DKIM: 'PASS'(ドメイン: refirio.net)詳細
■送信制限の解除(トラブル事例) 当初は上に記載の内容で申請が通っていたが、2023年ごろから以下の返信が来るようになった より詳細な情報を提出する必要があるとのこと
このたびは、送信制限の申請をいただきありがとうございます。 残念ながら現時点ではお客様のユースケースについて十分な情報がないため、この申請を承認することはできません。 Amazon SES の使用計画について詳しい情報をご提供いただければ、申請が承認される可能性があります。 返信の際に、お客様のメール送信プロセスや手順について、可能な限り詳しい情報を記載してください。 たとえば、メールを送信する頻度、受信者リストのメンテナンス方法、バウンス、申し立て、解除申請の管理方法についてご説明ください。 送信する予定のメールのサンプルをご提供いただければ、お客様が高品質のコンテンツを送信していることを確認するために役立ちます. この情報を受け取り次第、お客様の申請を審査させていただきます。 24時間以内にご連絡をいたします。 必要な情報をすべてご提示いただいた場合は、24時間以内に申請を承認いたします。 追加で情報が必要な場合は、申請の実装に長くかかる可能性がございますことをご了承ください。
以下を返信して申請が通ったことはある
現在他社のサーバで運用しているサービスについて、AWSへの移行をしております。 それに当たり、メール送信周りはすべてSESを利用したいと考えております。 メールの利用用途は、以下のとおりです。 ・会員登録時における、システムからユーザへの自動返信 ・ユーザへのお知らせ ・システムエラー発生時、運営への通知 ・運営へのサーバ稼働レポート 送信セキュリティについては、SPFレコードおよびDKIMを利用します。 なお、存在しない等不正なメールアドレスへの対処については、次回以降送信しない等の措置が実施されます。
■送信制限の解除(昔の手順) Amazon SES サンドボックスの外への移動 http://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/request-production-access.html 「Sending Statistics」画面に表示されている「Request a Sending Limit Increase」をクリックする 名前: refirio-user アカウント: 123456789012 内容: サービス制限の増加 制限タイプ: SES送信制限 リージョン: 米国東部 (バージニア北部) 制限: 希望する最大送信レート 新しい制限値: 3 メールの種類: システム通知 ウェブサイトのURL: (空欄) 私は AWS サービス利用規約と AUP に準拠してメールを送信します: はい 私は明確にリクエストされた受信者にのみメールを送信します: はい バウンスや苦情を処理するプロセスがあります: はい 申請理由の説明: お客様宛にニュースを定期配信します。メール受信者のアドレスはシステムで管理されており、送信できないメールアドレスは登録されておりません。 お問い合わせ言語: 日本語 連絡方法: Web ※最大送信レート Amazon SES が 1 秒あたりにアカウントから受け付ける E メールの最大数。 この制限を瞬間的に超えることはできますが、制限を超えた状態が長時間続くことは許可されません。 https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/manage-sending-limits.html 申請後、3時間ほどで返信が来て制限が解除された ■送信制限の解除(昔の手順でのトラブル事例) 申請後、3時間ほどで返信が来て制限が解除された…と思ったが、 相変わらず「Sending Statistics」画面に「Request a Sending Limit Increase」と表示されてことがあった 未承認アドレスへのメール送信テストもエラーになった 2日経っても変化がないのでクローズされたケースを再開し、以下の問い合わせをした 一応日本語と英語を併記した
お世話になります。 > アカウントはサンドボックス環境から移動しましたので、今後受信者のメールアドレスを承認する必要はありません。 対応ありがとうございます。 しかしながら、以下の画面には「Your Amazon SES account has "sandbox" access in region US East (N. Virginia).」と表示されたままです。 https://console.aws.amazon.com/ses/home?region=us-east-1#dashboard: また、以下の画面から送信テストを行う場合も、受信者のメールアドレス承認が必要なままです。 https://console.aws.amazon.com/ses/home?region=us-east-1#verified-senders-email: こちらで他にも何らかの手続が必要でしょうか? それとも、反映までにはまだ時間がかかるのでしょうか? よろしくお願いいたします。 - - - - - Dear Amazon Web Services, > アカウントはサンドボックス環境から移動しましたので、今後受信者のメールアドレスを承認する必要はありません。 Thank you for support. However, 'Your Amazon SES account has "sandbox" access in region US East (N. Virginia).' is still displayed on the following page. https://console.aws.amazon.com/ses/home?region=us-east-1#dashboard: And, When I try out the transmission test from the page below, the recipient's email address approval is still required. https://console.aws.amazon.com/ses/home?region=us-east-1#verified-senders-email: Do I need to do some other steps? Or, Does it take to be reflected time? Thanks.
半日程度で以下の返信があり、制限は解除された AWS側で正しく手続きできていなかったみたい?
Thank you very much for bringing this to our attention. After investigating, we have discovered that the problem was on our end and we have increased your sending quota to 50,000 messages per day and your maximum send rate to 14 messages per second in AWS Region US East (N. Virginia). Your account has also been moved out of the sandbox, so you no longer need to verify recipient addresses.
■PHPMailerからSMTPでメールを送信 ※PHPMailerでのメール送信については、Etcetera.txt の「PHPMailerを使ってSMTPでメールを送信する」も参照
<?php require_once 'PHPMailer/class.phpmailer.php'; require_once 'PHPMailer/class.smtp.php'; // SMTPサーバ: ホスト define('SMTP_HOST', 'email-smtp.ap-northeast-1.amazonaws.com'); // SMTPサーバ: メールアカウント define('SMTP_USERNAME', 'XXXXXXXXXX'); // SMTPサーバ: メールパスワード define('SMTP_PASSWORD', 'YYYYYYYYYY'); // SMTPサーバ: プロトコル (ssl または tls) define('SMTP_SECURE', 'tls'); // SMTPサーバ: 送信ポート (ssl:465, tls:587) define('SMTP_PORT', '587'); // メール送信準備 $mail = new PHPMailer(); $mail->isSMTP(); $mail->SMTPAuth = true; $mail->Host = SMTP_HOST; $mail->Username = SMTP_USERNAME; $mail->Password = SMTP_PASSWORD; $mail->SMTPSecure = SMTP_SECURE; $mail->Port = SMTP_PORT; // メール内容定義 $mail->CharSet = 'UTF-8'; $mail->Encoding = 'base64'; $mail->setFrom('from@example.com', 'メール送信者'); $mail->addAddress('to@example.com', 'メール受信者'); $mail->Subject = 'SESからの送信テスト'; $mail->Body = "テスト。\nこれはテストです。"; // メール送信 if (!$mail->send()) { exit('Error: ' . $mail->ErrorInfo); } exit('complete');
tls と 587 は、ssl と 465 にしても送信できたが、tls(587)の方が推奨されるらしい ポートの違いについては以下を参照 ポート465と587の違いとは? | SendGridブログ https://sendgrid.kke.co.jp/blog/?p=12945 ■PostfixからSMTPでメールを送信 後述の「SES PostfixからSMTPでメールを送信」を参照 ■メーラーからSMTPでメールを送信 SMTPを使ってAmazonSESのメールをGmailで送信できるようにする | Hodalog https://hodalog.com/sending-email-with-ses-using-smtp-and-gmail/ Amazon SESでメールクライアントからSMTP送信を行う | DevelopersIO https://dev.classmethod.jp/articles/amazon-ses-smtp/ ■サブドメインでのメール送信 例えば refirio.net のドメインからメールを送信できるようにした場合、 自動的に stg.refirio.net などサブドメインからも送信できるようになる SESで承認したドメインのサブドメインを送信元アドレスとしてメールを送信してみる | DevelopersIO https://dev.classmethod.jp/articles/send-email-with-subdomain-of-verified-domain-in-ses-as-source-ad... 「上位ドメインを一つSESで承認しておけば、環境や用途ごとに異なるサブドメインをメール送信に使えるのは便利ですね。」 ■メールの一括送信 Amazon SESでメールを一括送信したい時の留意点 | DevelopersIO https://dev.classmethod.jp/articles/points-to-keep-in-mind-when-you-want-to-send-emails-in-bulk-with... Laravel + Amazon SES でクリック率が分かるメルマガを一斉送信する - console dot log https://blog.capilano-fw.com/?p=9186 SDK経由で、メールの一括送信ができる ただし「1回のAPI実行でのメッセージ送信可能数は最大50通」という制限があるので注意 APIを複数回に分けて叩く必要があるようなので、それなら独自にキューで送信する仕組みを作成する方が自由度が高いか また一括送信する場合、メールを見たユーザが一斉にアクセスが来るとサーバ負荷が上がるので、徐々に送信することも考えたい ■Return-Pathの設定 何もしなければ、以下のようなReturn-Pathになっていた (SPFのために、Amazon所有のドメインが使用されるらしい) Return-Path: <012345678901cee8-57b4ef59-99a0-4548-b220-f14c687d28f2-000000@ap-northeast-1.amazonses.com> 以下は参考になるかもしれないが、現状未検証 AWS SES で検証済のドメインとメールアドレスが競合しているときのカスタム MAIL FROM での書き換え #AWS - Qiita https://qiita.com/ngyuki/items/63e0e57cab2cba266eef Amazon SES でメール送信するときのベストプラクティスまとめ(2020年10月) | DevelopersIO https://dev.classmethod.jp/articles/ses-send-mail-best-practices-summary/ Amazon SESのE メール形式 - Amazon Simple Email Service https://docs.aws.amazon.com/ja_jp/ses/latest/dg/send-email-concepts-email-format.html 到達率に影響すると思われるので、それとは関係なく設定しておくべきか…と思うが、設定するとバウンスメールの受け取りに悪影響があるか そもそも、後述の「バウンスメールの設定」を行うなら不要か 以下の公式解説では「Amazon SES を使用する場合は、常に「Return-Path」パラメータを設定して、バウンスを常時把握し、バウンスの発生時に適切なアクションを実行できるようにすることをお勧めします。」となっている が、「バウンスメールの設定」によってAmazonのアドレスが入っているのなら、変更すべきでは無いか Amazon SESのE メール形式 - Amazon Simple Email Service https://docs.aws.amazon.com/ja_jp/ses/latest/dg/send-email-concepts-email-format.html ■メール送信ログの設定 後述の「SES メール送信ログの設定」を参照 ■通知先の作成 Amazon SNS → トピック → トピックの作成 タイプ: スタンダード 名前: refirio 「トピックの作成」ボタンをクリック トピックが作成されたことを確認する Amazon SNS → サブスクリプション → サブスクリプションの作成 トピックARN: (上で作成したトピックを選択) プロトコル: Eメール エンドポイント: server@refirio.net 「サブスクリプションの作成」ボタンをクリック サブスクリプションが作成されたことを確認する また、上で設定したメールアドレスに「AWS Notification - Subscription Confirmation」というメールが送信される これはメールアドレスの存在確認なので、本文のURLをクリックする ■バウンスメールの設定 Amazon SES → 検証済みID → refirio.net → 通知 フィードバック通知として3つ表示されており、それぞれ Bounce: SNSトピックなし Complaint: SNSトピックなし Delivery: SNSトピックなし となっている 「編集」ボタンをクリック SNSトピックの設定が表示される 「バウンスフィードバック」と「苦情のフィードバック」に上で作成した通知先を設定し、 それぞれ「元のEメールヘッダーを含める」にチェックを入れ、「変更の保存」ボタンをクリックする SESのバウンス情報をメールで受け取る方法 - Qiita https://qiita.com/K5K/items/2ab9c82fd7b139384ea0 SESでバウンスメールを確認する方法をいくつか試してみた | DevelopersIO https://dev.classmethod.jp/articles/ses-bounce-check/ AWS SESでハードバウンスのようなメールがソフトバウンス扱いで届いた場合のしくみと対処について - コネヒト開発者ブログ https://tech.connehito.com/entry/2022/09/22/180521 【こんなときどうする?】Amazon SESのバウンスレートが高くて、メールの送信ができない | SunnyCloud https://www.sunnycloud.jp/column/20210923-01/ ■バウンスメールのテスト Amazon SES → 検証済みID → refirio.net → テストEメールの送信 Eメール形式: フォーマット済み From-address: info@refirio.net シナリオ: バウンス 件名: 送信テスト 本文: これは送信テストです。(バウンス) 設定セット: refirio-ses-log 「テストEメールの送信」ボタンをクリック 「通知先の作成」で指定したメールアドレスに、実際に「AWS Notification Message」という件名のメールが届けば成功 送信元は no-reply@sns.amazonaws.com で、送信先は server@refirio.net となっていた 本文は以下のとおり(冒頭のJSONは、実際は改行なしで記載されていた)
{ "notificationType":"Bounce", "bounce":{ "feedbackId":"01060180bcc4a2c6-12345678-d33a-40e9-9db7-896a09ad3459-000000", "bounceType":"Permanent", "bounceSubType":"General", "bouncedRecipients":[ { "emailAddress":"bounce@simulator.amazonses.com", "action":"failed", "status":"5.1.1", "diagnosticCode":"smtp; 550 5.1.1 user unknown" } ], "timestamp":"2022-05-13T09:34:05.000Z", "remoteMtaIp":"203.0.113.2", "reportingMTA":"dns; e234-3.smtp-out.ap-northeast-1.amazonses.com" }, "mail":{ "timestamp":"2022-05-13T09:34:04.020Z", "source":"test@refirio.net", "sourceArn":"arn:aws:ses:ap-northeast-1:123456789012:identity/refirio.net", "sourceIp":"203.0.113.1", "callerIdentity":"refirio-user", "sendingAccountId":"123456789012", "messageId":"01060180bcc49ef4-12345678-3bb4-4a9c-ad17-4ff037d8e4cc-000000", "destination":[ "bounce@simulator.amazonses.com" ] } } -- If you wish to stop receiving notifications from this topic, please click or visit the link below to unsubscribe: https://sns.ap-northeast-1.amazonaws.com/unsubscribe.html?SubscriptionArn=arn:aws:sns:ap-northeast-1... Please do not reply directly to this email. If you have any questions or comments regarding this email, please contact us at https://aws.amazon.com/support
■バウンスレートと苦情率の監視 少なくとも、SESのバウンスレートと苦情率は監視対象にしておきたい 以下などが参考になりそう AWS SESでハードバウンスのようなメールがソフトバウンス扱いで届いた場合のしくみと対処について - コネヒト開発者ブログ https://tech.connehito.com/entry/2022/09/22/180521 【こんなときどうする?】Amazon SESのバウンスレートが高くて、メールの送信ができない | SunnyCloud https://www.sunnycloud.jp/column/20210923-01/ 以下は実際の設定例 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 対象 名前 条件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SES refirio.net SES Reputation.BounceRate 1時間内の1データポイントのReputation.BounceRate > 4 SES refirio.net SES Reputation.ComplaintRate 1時間内の1データポイントのReputation.ComplaintRate > 0.08 SES refirio.net SES Send 1時間内の1データポイントのReputation.Send > 500 SES refirio.net SES Reject 1時間内の1データポイントのReputation.Reject > 5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ■SPFレコードの確認 SPFレコードは存在しないようだが、これについては以下に解説がある Amazon SES でメールを送る場合、DNS に SPF 設定は不要だという話 #AWS - Qiita https://qiita.com/koseki/items/4f291579cf4ceb9f9e47 今回受信したメールを確認すると、Return-Pathは以下のような値になっていた Amazonのドメインから送信しているので、別途設定しなくても問題無いのだと思われる。なおGmailで確認すると、上に記載したとおりメールヘッダには「SPF: PASS」とある Return-Path: <0106018bdb917059-9eff61c1-675b-43a5-be62-8c6e05824c49-000000@ap-northeast-1.amazonses.com> SPFレコードについては、以下のページではSPFは不要と書かれているが、 Amazon SES でメールを送る場合、DNS に SPF 設定は不要だという話 - Qiita https://qiita.com/koseki/items/4f291579cf4ceb9f9e47 AWS SESで信頼性の高いメール送信(SPF, DKIM, DMARC) with Terraform - 電気ひつじ牧場 https://cha-shu00.hatenablog.com/entry/2022/03/06/175823 以下のページではSPFは必要と書かれている (古い記事なので現状とは異なるかもしれないが) AWS SESでのメール送信時にSPFの設定は必要だよ! - Qiita https://qiita.com/seiketkm/items/a4ddef03b7852353f554 ■DMARCを設定 以下のページを参考に、DMARCを設定してみる Amazon SES にSPF、DKIM、DMARC設定と、サンドボックスを解除してメール送信してみた | DevelopersIO https://dev.classmethod.jp/articles/amazon-ses-set-up-spf-dkim-dmarc-and-unlocked-sandbox/ 解説によると、TXTレコードを1個追加するだけらしい Complying with DMARC authentication protocol in Amazon SES - Amazon Simple Email Service https://docs.aws.amazon.com/ses/latest/dg/send-email-authentication-dmarc.html 上記公式ページによると、以下のレコードを追加すればいいらしい Name: _dmarc.example.com Type: TXT Value: "v=DMARC1;p=quarantine;pct=25;rua=mailto:dmarcreports@example.com" ただしドメイン名は修正する必要があるので、実際は以下のレコードとなる Name: _dmarc.refirio.net Type: TXT Value: "v=DMARC1;p=quarantine;pct=25;rua=mailto:dmarcreports@refirio.net" DNS設定後、少し時間をおいて以下のとおり反映されていることを確認する
$ dig _dmarc.refirio.net any ;; ANSWER SECTION: _dmarc.refirio.net. 300 IN TXT "v=DMARC1;p=quarantine;pct=25;rua=mailto:dmarcreports@refirio.net"
PHPMailerからメールを送信してテスト メールヘッダにDMARCの項目が現れた(反映までは5分ほどかかると思われる) SPF: PASS(IP: 23.251.234.3) DKIM: 'PASS'(ドメイン: refirio.net) DMARC: 'PASS' AmazonSESでのDMARC設定は容易なので、SESの初期設定時についでに対応しておくと良さそう またこの場合、dmarcreports@refirio.net でメールを受信できるようにしておく必要があるので注意 このアドレスを refirio.net 以外のドメインにしたい場合、つまり認証を設けたいドメインと通知先のドメインが異なる場合、追加のDNSレコードが必要となる DMARC 詳細仕様-2 | なりすまし対策ポータル ナリタイ https://www.naritai.jp/guidance_record.html > DMARC レポートの受信を外部に委託する場合、すなわち DMARC レコードを設定したドメインと関係の無いドメインを rua や ruf に指定する場合には、相互の関連性を示す必要があります。具体的には、レポートの委譲先のドメインに、委譲元のドメインの情報を示す必要があります。例えば、example.jp ドメインの DMARC レコードで、rua (集約レポート) の宛先として example.com を指定する場合、委譲先の example.com ドメイン側で以下の TXT 資源レコードの設定が必要になります。 > example.jp._report._dmarc.example.com IN TXT "v=DMARC1" > sp パラメータは、全てのサブドメインに対する DMARC ポリシーを指定します(オプションです)。設定する値は、p パラメータと同じです。 > v パラメータは、バージョン番号を示しますが現状では v=DMARC1 という固定文字列になります。DNS の TXT レコードは、DMARC レコード以外の用途にも利用されますので、他のレコード (SPF レコードなど) と区別するために、このバージョン番号を DMARC レコードの先頭に記述する必要があります。 例えば example.com のドメインで通知を受け取りたい場合、example.com のDNS側で以下のように登録する (これが無いから通知が一切届かない…ということは無いようだが)
refirio.net._report._dmarc.example.com IN TXT "v=DMARC1"
■ChatGPTによるDKIMの解説1 digコマンドを使用してDNSの登録内容を調査した結果を解説します あなたが実行したコマンドは以下の通りです: $ dig 6xtcynuykbn5xmx2o2o2mkxf2fjsblk6._domainkey.refirio.net any このコマンドの実行結果は以下の通りです: ;; ANSWER SECTION: 6xtcynuykbn5xmx2o2o2mkxf2fjsblk6._domainkey.refirio.net. 300 IN CNAME 6xtcynuykbn5xmx2o2o2mkxf2fjsblk6.dkim.amazonses.com. 解説 ・ドメイン名: 6xtcynuykbn5xmx2o2o2mkxf2fjsblk6._domainkey.refirio.net これはDKIM (DomainKeys Identified Mail) のための特定のレコードを表します。 DKIMは、電子メールメッセージが特定のドメインから実際に送信されたことを確認するための方法です。 ・TTL (Time to Live): 300 この数字は、DNSレコードがDNSサーバーのキャッシュに保持される秒数を表します。 この場合、300秒(5分)後にキャッシュが更新されることを意味します。 ・レコードタイプ: IN CNAME INはインターネットを意味し、CNAMEはCanonical Name(別名)レコードを示します。 CNAMEレコードは、一つのドメイン名を別のドメイン名に関連付けるために使用されます。 ・ターゲットドメイン名: 6xtcynuykbn5xmx2o2o2mkxf2fjsblk6.dkim.amazonses.com このCNAMEレコードは、refirio.netドメインのDKIMレコードをAmazon SES(Amazon Simple Email Service)のDKIMレコードに関連付けています。 これにより、refirio.netから送信される電子メールがAmazon SESを介してDKIMで署名されることを示しています。 結論 このDNSの登録内容は、refirio.netドメインの電子メールがAmazon SESを使用してDKIM署名されるように設定されていることを示しています。 これにより、メールの認証と信頼性が向上し、スパムやフィッシングから保護される効果があります。 ■ChatGPTによるDKIMの解説2 digコマンドを使ってDNSの登録内容を調査した結果を解説します。 あなたが実行したコマンドは以下の通りです: $ dig 6xtcynuykbn5xmx2o2o2mkxf2fjsblk6.dkim.amazonses.com any このコマンドの実行結果は以下の通りです: ;; ANSWER SECTION: 6xtcynuykbn5xmx2o2o2mkxf2fjsblk6.dkim.amazonses.com. 300 IN TXT "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxJC52Rh2Ei+2l18sK9ocryAgMob/VnSnYvQhS6tiJ4Ij1MNRHjmdtTjIVwfQkKhA0ahVi5rjaEYpvn1SG8yaOU7yOxchEkfelp2xVKM/Oym/PJC3dEVovDlOT0vJN6XzLH80EVvE2CW96MQn8KJVIb8n8jnCB2sdukguT2rsHR/XGkGMFoj0ZFBxAXKwf3fETDK/TSWNHy/SjvqzR" "gOSr/VCJm3ijQxD0i/VET1r/oufplbDtdgpySvjTWn+7yE9A9Di8c/QP/6lm3PHvWwv4qKrvAZaXyHYU+OZWdRCMUTPkq9LUajS1tZdCSQ9e86ALxtBsOjNVx+Th5L5GxixFwIDAQAB" 解説 ・ドメイン名: 6xtcynuykbn5xmx2o2o2mkxf2fjsblk6.dkim.amazonses.com これはAmazon SES (Amazon Simple Email Service) のDKIM (DomainKeys Identified Mail) 設定の一部です。 DKIMは、電子メールの送信者がメールを署名して、受信者がそのメールが改ざんされていないことを確認できるようにする技術です。 ・TTL (Time to Live): 300 この数字は、DNSレコードがDNSサーバーのキャッシュに保持される秒数を表します。 この場合、300秒(5分)後にキャッシュが更新されることを意味します。 ・レコードタイプ: IN TXT INはインターネットを意味し、TXTはテキストレコードを示します。 TXTレコードは、ドメインに関する任意のテキスト情報を提供するために使用されます。 ・DKIM公開鍵: 表示されている長い文字列(p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...)は、DKIMの公開鍵を表します。 この公開鍵は、送信者がメールに付けたデジタル署名を検証するために使用されます。 署名は、メールの送信者がそのドメインの所有者であること、およびメールが途中で改ざんされていないことを保証します。 結論 このDNSの登録内容は、Amazon SESを使用して電子メールを送信する際にDKIM署名を利用する設定を示しています。 この設定は、メールの認証と信頼性を向上させ、スパムやフィッシングから保護するために重要です。 公開鍵は、受信したメールの署名が有効かどうかを確認するために使われます。 ■ChatGPTによるDKIMの解説3 メールヘッダに含まれるDKIM-Signatureフィールドについて解説します。 DKIM (DomainKeys Identified Mail) は、電子メールの送信者が自分のドメインからメールが送信されたことを確認するための技術です。 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=6xtcynuykbn5xmx2o2o2mkxf2fjsblk6; d=refirio.net; t=1700195823; h=Date:To:From:Subject:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding; bh=41h2rsirndfR9S9Ure3fglQqn/D8jDSeJVCfSP2ctkQ=; b=eta1GRUx9yJJX8ZWMFF0EzmZI4/DKljgOAOiNvnZCu8qMAxRXaHWK8Qf5vMOSLqV dkkKgjmV94cbAg9bk0k7Z0b2EV90PedMNICGYpcARTAYCKGmSZY+iQ0oCS6Hd0oWtZd 2JUF2jctKoAa/Um979Iq3wjAjzQ6wlpa2pScmLNrop4BxHH/jzu3OvLUptDRUbheWRl wdZeJ3JtCqf4eim6Ejdy/fotwLCpIRaILGUsgY9PsvzgInDStRlzqR/Iea1vwqy747X RGsX6z994HpalvlhDY2eHRVvQrcEK0tcI6TV+ZOe61cThf48xlfVs+Ujqx6HEjVUQDN GeZRdcnrzg== DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=zh4gjftm6etwoq6afzugpky45synznly; d=amazonses.com; t=1700195823; h=Date:To:From:Subject:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:Feedback-ID; bh=41h2rsirndfR9S9Ure3fglQqn/D8jDSeJVCfSP2ctkQ=; b=OCOTofp7OCpiwU4PEFrH4cyRewFIaTJOzn0JwVXjpVI7yDN5zF3+bIudfV80Tx3I 8nrORzEU9IJrkzCaZjp2uBriHnVgdAhyAqNbK6FD287yapojW4Y6pspVDU/KpTQqUQ5 3toxL2WodaoX7nTmTnQEZYkw+aIccO7ub7Q5EM2w= このメールには2つのDKIM署名が含まれています。 DKIM署名の構成要素 ・バージョン (v): v=1は、DKIMのバージョンを示します。 ・署名アルゴリズム (a): a=rsa-sha256は、署名の生成にRSA-SHA256アルゴリズムが使用されたことを意味します。 ・クエリメソッド (q): q=dns/txtは、公開鍵をDNSのTXTレコードから取得することを示します。 ・キャノニカライゼーション (c): c=relaxed/simpleは、メッセージのヘッダと本文の処理方法を示します。relaxedは、ヘッダーの余分な空白や改行を無視することを意味し、simpleは本文をそのままの形で使用することを意味します。 ・セレクタ (s): 例えばs=6xtcynuykbn5xmx2o2o2mkxf2fjsblk6は、使用する特定のDKIMキーを識別します。 ・ドメイン名 (d): d=refirio.netやd=amazonses.comは、署名の所有者のドメインを示します。 ・タイムスタンプ (t): t=1700195823は、メールが署名されたUNIXタイムスタンプです。 ・署名されたヘッダフィールド (h): これは、署名の一部として取り込まれるヘッダフィールドを示します。 ・本文ハッシュ (bh): bh=41h2rsirndfR9S9Ure3fglQqn/D8jDSeJVCfSP2ctkQ=などは、メール本文のハッシュ値です。 ・署名 (b): この長いエンコードされた文字列は、上記のすべての要素を含む実際のデジタル署名です。 結論 これらのDKIM署名は、メールがrefirio.netとamazonses.comのドメインから正当に送信され、途中で改ざんされていないことを証明します。 メールが配信されると、受信者のメールサーバーは、これらのドメインのDNSレコードを参照して公開鍵を取得し、署名を検証します。 このプロセスは、メールの真正性と完整性を保証するのに役立ちます。 ■ChatGPTによるDMARCの解説 digコマンドを使ってDMARCの設定内容を調査した結果を解説します。 あなたが実行したコマンドは以下の通りです: $ dig _dmarc.refirio.net any このコマンドの実行結果は以下の通りです: ;; ANSWER SECTION: _dmarc.refirio.net. 300 IN TXT "v=DMARC1;p=quarantine;pct=25;rua=mailto:dmarcreports@refirio.net" 解説 ・ドメイン名: _dmarc.refirio.net これはDMARC(Domain-based Message Authentication, Reporting, and Conformance)ポリシーの設定を示す特別なサブドメインです。 ・TTL (Time to Live): 300 この数字は、DNSレコードがDNSサーバーのキャッシュに保持される秒数を示します。 この場合は、300秒(5分)です。 ・レコードタイプ: IN TXT INはインターネットを意味し、TXTはテキストレコードを示します。 DMARCポリシーはTXTレコードとして設定されます。 ・DMARCポリシー内容: ・v=DMARC1: バージョンを指定します。 DMARC1はDMARCの標準バージョンを示します。 ・p=quarantine: DMARCポリシーの動作を指定します。 quarantineは、DMARCの検証に失敗したメールを隔離(例えばスパムフォルダに移動)することを示します。 ・pct=25: DMARCポリシーが適用されるメールの割合を指定します。 この場合、全メールの25%にポリシーが適用されます。 ・rua=mailto:dmarcreports@refirio.net: DMARC集計レポートを送信するアドレスを指定します。 ここでは、dmarcreports@refirio.netにレポートが送信されることを示しています。 結論 このDNSの登録内容は、refirio.netドメインのDMARCポリシーを設定しています。 このポリシーは、DMARC検証に失敗したメールを隔離し、その適用は全メールの25%に限定されています。 また、DMARCのレポートは特定のメールアドレスに送信されるように設定されています。 これにより、ドメイン所有者は、ドメイン名を使用して送信されるメールの認証状況を追跡し、改善することができます。 ■専用IPアドレスの取得 ※未検証 月額$25でSESに固定IPアドレスを割り当てることができる 共有IPアドレスの場合、他人が同じIPアドレスから大量にメールを送信することで、スパム報告に巻き込まれる可能性がある また、同一IPアドレスからの受信を制限しているところもあるが、固定IPアドレスを複数取得することで対応できる 専用 IP アドレスのリクエストと解放 - Amazon Simple Email Service https://docs.aws.amazon.com/ja_jp/ses/latest/dg/dedicated-ip-case.html Amazon SESでSPFとDKIMを設定してみた|梨_茶|note https://note.com/li_oche1021/n/ne0357eacbabf メール送信で固定IPアドレスを利用すると何がうれしいのか - Qiita https://qiita.com/nakansuke/items/e26f44103e9a1dda366f [アップデート] Amazon SES の専用 IP を標準からマネージドへ移行できるようになったので、標準とマネージドの違いを整理してみた | DevelopersIO https://dev.classmethod.jp/articles/dedicated-ips-managed-feature/ ■メモ キャリアメールに届かないという記事を見かけるが、問題無く送信できるみたい? WordPresでSESを使う方法もあるみたいなので、WordPressで使えないことも無いみたい? 要調査 Amazon SES でメール送信するときのベストプラクティスまとめ(2020年10月) | Developers.IO https://dev.classmethod.jp/articles/ses-send-mail-best-practices-summary/ Amazon SESによるメール送信環境の構築と実践 | DevelopersIO https://dev.classmethod.jp/articles/amazon-ses-build-and-practice/ Amazon SES と SendGrid のバウンスの取り扱いについてまとめてみた | DevelopersIO https://dev.classmethod.jp/articles/amazon-ses-sendgrid-bouce-reaction/ AWSのSESでバウンスメール(bouncemail)対策。3つの方法とメリット・デメリット | ブログ|ベトナムでのオフショア開発とスマートフォンアプリ開発のバイタリフィ https://vitalify.jp/blog/2018/03/aws-ses-bouncemail.html SESのバウンス率 - Amazon SES(AWS)のバウンスされたメールアドレス https://www.usebouncer.com/ja/%E7%B0%A1%E5%8D%98%E3%81%8B%E3%81%A4%E5%8A%B9%E6%9E%9C%E7%9A%84%E3%81%... [AWS]SESを利用したキャリアメール送信について考える | Developers.IO https://dev.classmethod.jp/articles/20170824-ses-send-to-carrier/ 【Amazon SES】SESでメール送信する時に知っておきたい事 - websandbag ブログ https://blog.websandbag.com/entry/2019/07/31/160557 AmazonSESから携帯キャリアメールに届く確率を上げる - Qiita https://qiita.com/shouta-dev/items/a33c55e0df154012c557 wordpress・SES経由でメールを送信できるようにする - Qiita https://qiita.com/gozuqi/items/099d064e8657f51f2b3e バウンスメールと AWS SES - コネヒト開発者ブログ https://tech.connehito.com/entry/2020/09/17/152126 おさえておきたいメールの基礎用語 | SendGridブログ https://sendgrid.kke.co.jp/blog/?p=658 SESが利用停止されたときの内容は以下が参考になる バウンスしすぎて Amazon SES から追放された俺たちは Mailgun と SendGrid に国を作ることにした - ANDPAD Tech Blog https://tech.andpad.co.jp/entry/2021/10/27/100000 以下は上記ページについての気になるはてブコメント https://b.hatena.ne.jp/entry/s/tech.andpad.co.jp/entry/2021/10/27/100000 ・SESはちょっと前にアカウントレベルのサプレッションリストが設定できるようになってて、ハードバウンスは自動で送信停止できるよ 警告来たのはバウンス率じゃなくて苦情率か。何やってるの? ・オプトアウト実装や宛先リストのクリーニング含めバウンス対応をちゃんとやらないと結局同じことになりそうな気はする(共有 IP アドレスみたいだし ・SendGrid は機械学習のスパム検知機能があり、それに引っかかると容赦なくアカウント単位で配信停止される。 問い合わせると誤検知で発動してしまったごめんね。というのが過去2回あって、メインで使うのはやめた。 ・面倒くさいのは同意するけど、SESからSendgrid/Mailgunに逃げても本質的な対応はいずれしないといけないんじゃないのかなという気がする。 うちはSendGrid高くてSESに来たクチだけど何も困ってない。 ・苦情レートが高いのをスルーしてるのはどうなんだろう。自分だったらスパマー扱いされてるのでは?と考えてレートを下げる施策を考えるかも ■昔のメモ 解除後も送信制限は、徐々に緩和されていくみたい 制限が解除されると任意の送信先を指定できるみたいだが、送信元は常にアドレスの認証が必要みたい 以下に同意する必要があるため、仮登録時のメール送信やフォームメールでの自動リプライなどに使うことはできないかもしれない あくまでも、ニュースの一斉配信を用途としているかもしれない (2021年5月追記:AWSのアーキテクチャレビューにて、「仮登録のためにドコモのアドレスにメールを送ったり、という使用例は実際にある」とのこと) その場合でも、常にバウンスや苦情については気にかける必要がある バウンスは5%以下に、苦情は0.1%以下に保ち、悪意あるコンテンツ(ウイルスなど)も送らないようにする ・私は AWS サービス利用規約と AUP に準拠してメールを送信します ・私は明確にリクエストされた受信者にのみメールを送信します ・バウンスや苦情を処理するプロセスがあります 仮登録時のメール送信やフォームメールでの自動リプライなどは、ごく普通にPHPから送信すれば良さそう でもSPFなどを考えるなら、固定IPを持ったバッチサーバから送信する必要がありそう そうなると、SESを使うか否かに関係なく、バッチサーバからのメール送信の仕組みは構築する必要がありそう SESはキャリアメールへの送信問題もある 独自ドメインでのメール受信という用途としては使えそう 仮登録のためにメールを送信してもらって自動返信、バウンスメールの受信、など

Advertisement