真夜中の色彩

真夜中の雰囲気が好きなプログラマのブログ

ブログの画像問題を解決する 2024年版 - Amazon SES設定編

 ブログの画像をブログサービス上ではなく、Amazon S3上に置くことでブログサービスのお引っ越しをしやすいようにしたのが2019年頃の話。このとき、画像をS3上に置いたことをトリガーに画像URLをメールで送信してくれるようにしていた。

blog.midnightblue.jp

 2024年2月にGmailの迷惑メール対策が強化されたことで、雑なAmazon SES(メール送信してくれるサービス)の設定だとべらぼうな遅延が発生するようになった。正直、あまり使ってなかったから気づいてなかった。

 さ~すがにあまりのストレスになったので、真面目にAmazon SESの設定をしましょうと思い至ったわけです。そんな設定の話をします。

 設定諸々忘れてそうな未来の自分のためにも、エンジニアっぽい豆知識の記事を書くです。

キャッチアップ

 まずはここのサイトに迷惑メール対策強化の内容とやらなきゃならないことがざっくりまとまっている。

note.shiftinc.jp

 先人の知識ありがとう、ありがとう。

 私のケースでは、Fromヘッダーのなりすましをしている状態になっている。

 Toも自分のアドレスだが、Fromも自分のアドレスであった。これは、「本当はamazonses.comから送っているのに、なりすましている」ことになる。迷惑メール疑惑されていたのは知っている。知っているが困ってなかったのでお行儀が悪い振る舞いをしていた。てへぺろ。というわけで、振る舞いを正してお行儀良くいきたい。

 AWSもちゃんと対策方法をまとめてくれているので一読しておく。

aws.amazon.com

 

自分の要件

まずは自分の状況と要件をまとめる。

  • 独自ドメインは持っており、DNS設定の変更は可能である
  • 自分でメールサーバを持ってはなく、持つ気もない
    • だからAmazon SES使いたいんだYO
  • 自分のメールアドレスにだけ送りたい
    • 自分以外が管理するメールアドレスに送付する気はない
  • 送信頻度はムラがあるが、ラッシュは発生しない
    • 人間の手でS3にファイルを置いたことによるトリガー処理なので

 Amazon SESを使った上でなりすまさずにメールを送るとなると、ドメイン認証が必須になってくる。自分は独自ドメインがあるのでこの点に関して問題なし。

 DKIMとSPFによるドメイン認証は、指定された値をDNSに設定することで「私がこのドメインを管理していますよ」と所有を明らかにするものだとザックリと理解している。(厳密に言うとメール送信時に参照されてチェックされていると思うが、まぁザックリと理解ネ。そのへんは詳細に解説している諸ページを参照のこと)

 

 また、Amazon SESの状態として「サンドボックスにいる状態」か「本稼働状態」かがある。

  • サンドボックスにいる状態
    • 日時送信クオータと最大送信レートが低い
      • 日時送信クオータ 24時間で200メールまで
      • 最大送信レート 1秒に1メール
    • この状態だとAmazon SESで「Eメールアドレス認証」が出来たメールアドレスにしか送信出来ない
  • 本稼働状態
    • 日時送信クオータと最大送信レートがある一定数になる
    • 「Eメールアドレス認証」が出来たメールアドレス以外にも送信可能となる

「登録があったユーザに対して大量にメールを送信する」ような用途でAmazon SESを使うのであれば「本稼働アクセスリクエスト」をしないといけない

 しかし私の要件では本稼働状態である必要はない。送信先アドレスをEメールアドレス認証した上で、それを送信先にすればよい。やったね

 

Amazon SESの設定など

持ってるドメインでドメイン認証を実施する

Amazon SES の ID の作成と検証 - Amazon Simple Email Service

 上記を見ながら、ドメインIDを作成する。

  • デフォルト設定セット:なし
  • カスタムMAIL FROMドメイン:あり
    • MAIL FROM ドメイン:bounceとかmailとか
      • 自分が使ってないサブドメインが良いんじゃないかと
    • MX 障害時の動作:お好み
    • DNS レコードの Route53 への発行:別サービスのDNS使ってるのでなし
  • DKIM ベースのドメイン検証
    • IDタイプ:Easy DKIM
    • DKIM 署名キーの長さ:推奨されてるやつ(RSA_2048_BIT)
    • DNS レコードの Route53 への発行:別サービスのDNS使ってるのでなし
    • DKIM 署名:有効化ON

 これでドメインIDが作成されるが、検証するために自分が使ってるDNSで設定をする必要がある。

 設定すべきCNAMEやMXやTXTはドメインIDのページにあるので要チェック。

 コピーが出来るボタンがついているので、それを使ってコピペをするのが間違いがなくていい。

 ただし、使っているサービスのDNS設定変更UIによっては、サブドメインだけを入力する形式のものがある。

 いつまでも検証が保留中だな~?どうしてかな~?ってなった場合は、設定確認する場合にUIの見直しをするのがよい。ちなみに、ムームードメインだとサブドメインだけを入力する形式なので注意してほしい。私は踏みました。

 このあたりの資料も参考にしてdigするのがオススメ。

Amazon SES でステータスが「verification pending (検証保留中)」または「unverified (未検証)」のドメインのトラブルシューティング | AWS re:Post

メール送信テスト

 検証が完了したら、ドメインIDページの右上に「テストEメールの送信」ボタンがあるので、そこからメール送信をテストするとよい。

  • From-address:no-reply @<設定したドメイン>
  • シナリオ:カスタム
    • カスタム受信者:Eメールアドレス認証で登録したメールアドレスID
  • それ以外はよしなに

 これでちゃんとメールが届いたら安心です。

プログラムの修正

 ここまで設定できたら、送信してるプログラム側の修正をします。

 修正ポイントはザックリ下記の通り

  • SESのAWSリージョンを設定したところと合わせる
  • 送信元メールアドレス:no-reply@<設定したサブドメイン>.<設定したドメイン>
    • 例えば no-reply@bounce.example.comとか
  • 送信先メールアドレス:メールアドレス認証したアドレス

 

 これで一度実際に動かしてみてエラーが出ないか確認すれば大体オッケー。

 

おわりに

 この対応をしたらちゃんとメールが即座に届き、迷惑メール疑惑もされなくなりました!! それはそう。

 やはりお行儀良くすべきですね。反省しました。ごめんなさい。

 というわけで、遅延に悩まされることがなくなってめでたしめでたし。

 俺専用アプリだしまぁいっか~とついついなりすまして楽しちゃってる人の助けになったら幸いです。(でも時期的に今更感があるね)

 

追記:

ちなみに私がハマったポイントは下記でした。

  • DKIMでサブドメインだけなのにドメインも設定しちゃって検証が保留される
  • メールアドレス認証されてないメールアドレスに送ろうとしてrejectされる
  • よくわからないまま本稼働リクエストする(が気づいてケースを閉じる)