必要に駆られましたorz
経緯としては以下の通り
・Lightsailにてsendmailから発信する、GSuiteでアカウント作ったメールの配信が遅延する
・maillogを漁っていると、以下のメッセージ
Deferred: Connection timed out with aspmx.l.google.com.
・他のサーバでは発生していない
↓
・そのくせメールの遅配が命取りになり兼ねないオーダーなので、仕方ないからAmazon SESを使う旨提案
https://aws.amazon.com/jp/ses/
珍しく提案が通ったよ。
Amazon SESとは
Amazon SESがどの様なものかは以下に詳しいです。
https://dev.classmethod.jp/articles/amazon-ses-build-and-practice/
超ざっくり言うと、今までEC2が散々スパムの踏み台にされて来たので、今度はAmazon様が公式にメールの発信元の裏どりをしてくれる次第になった模様です。
設定
まずAWSのコンソールに入り、Amazon SESを探し出し画面を展開
2019/12/19現在、東京リージョンで展開されていない
ムンバイ、シドニー、フランクフルト、アイルランド、バージニア、オレゴン…さあどこにしよう、という次第でバージニアに
ここで認証して欲しい送信元のドメイン、もしくはメルアドを指定します。今回はドメインの認証をもらいます。
https://qiita.com/OMOIKANESAN/items/1b8941258fb7ebbdb057
手順はこちらに詳しいです。
ドメインを認証する為にDNSレコードに入れる設定値をもらえます。認証が通るとVerifiedになります。
認証が通ったので送信実験を行うも、外部ドメインに発信しようとすると
Email address is not verified. The following identities failed the check in region ほにゃらら
と叱られます。さっきVerified言ったじゃんorz
ここからハマったポイント
ハマりポイント1
「違う、そうじゃない」話でした。
デフォルトはSandboxモードなので外部への発信を行うにはAWS様にお断りを入れろ、的な話なんです。
その旨まっすぐ言ってくれればいいのにorz
そこでサポートへお断りを入れます。
入力項目が煩雑でわかりにくいですが手順はこちらが詳しいです。
んで実作業を行うのは多分バージニア、人力なので一晩待機。Resolvedになったら、コマンドラインでメールが送れるかを検証します。
コマンドラインでの作業含めSESからメールを発信するにはSMTP情報が必要になります。
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/smtp-credentials.html
SMTP情報はIAMユーザーに付与されるので、以下の画面の「Create My SMTP Credentials」からIAMの画面を展開して登録します。
自分で忘れさえしなければデフォルト値でOK。
ハマりポイント2
そして、IAMのアクセスキー等々とSMTP情報は別物なので、この画面から取得できる情報またはCredential.csvを保持して使わないとなりません。
やっと以下の通りに、サーバのコマンドラインでコマンドを流してみて送信確認をとります。
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-email-smtp-client-command-line.html
ハマりポイント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
調べると
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/receiving-email-action-bounce.html
Mailbox Does Not Exist
要するにいつも悩んでるんですが独自ドメインのサーバから同一のドメイン先にメールを送信しようとするとメールがサーバの外に出てくれない現象なので
今回は幸いGSuite。
ドメイン名の後ろに hoge@foo.com.test-google-x.com とかつく予備メルアドが有るので、これを使わせていただくことにしましたw
しかし
独自ドメインのサーバから同一のドメイン先にメールを送信しようとするとメールがサーバの外に出てくれない
以前解決した様な気がしたんだけどなー、これ。
すごく時間がある時に調べよう。なんか勘違いしてるかもしれないし。