格言を作るのが大好きな、ユゲタです。
「メール設定を理解するものは、インターネットサービスを制す!」
これは、多くのWEBエンジニアが困って苦労している、mail設定に関する格言ですが、聞いた事ありませんか?
メール設定ってとにかくめんどくさいんですよ。
たくさんのモジュールをセットしなければいけなくて、どれか1つでも違っていたらまともに送信されません。
エラーメッセージも原因とかけ離れているものもあれば、受信サーバーやメールアプリにおける独自設定での送信不具合なんかもあり、
とにかくカオスな状態になりがちな作業です。
今回はそんな困っているエンジニアの人の役に立つ情報を提供できると思って、自分で時間を乗り越えた各種方法を備忘録しておこうと思います。
事象
とあるwebサービスでユーザーアカウント登録を行うために、メール送信をしようとpostfixをインストールして、自分の会社のメールボックスには届く事を確認していたんですが、
gmailで届かない(スパムフォルダにも入らない)という報告を受けたので、その事象から解決できるまでの道のりを記載したいと思います。
gmail以外のメールサーバーには送信できる事が確認できていて、
550-5.7.1
550-5.7.26
550-5.7.27
というエラーメッセージがサーバーに残されていました。 (/var/log/mail.log)
原因
これに関して複数の確認ポイントがあります。
・DNSのSPF設定が適切にできているか?
・postfixの設定が適切にできているか?(TLSなど)
・PHPなどメール送信プログラムの記述は正しい状態か?
とにかく上記の設定でどれか1つでもコケてしまうと、メールが届かない上、どこが原因なのかを探すのが非常に時間がかかる状態に陥ってしまうので、
一旦成功パターンを作っておいて、それとの比較設定確認を行う様にしています。
対策方法
まずSPF設定ですが、これは環境に応じて何パターンも設定が必要ですが、Googleのヘルプには、次の設定を促されます。
v=spf1 include:_spf.google.com ~all
でも、これだけでは不足していて、地震のサーバーのIPアドレスを追加してあげる必要があります。
v=spf1 +ip4:***.***.***.*** include:_spf.google.com ~all
とりあえず、IPv4の記述で追加しておけば問題ないんですが、この時に、+ip4:***.***.***.*** という風に記述しないと、正式に登録されませんでした。
あと、この状態ではip4のみが対象になるので、postfixの設定を次の様にする必要がありました。
inet_protocols = all
↓ 次の様に変更
inet_protocols = ipv4
今度はipv4ですよ。間違えないように!!
次にpostfixのTLS設定は、サービス側で取得してあるLet's encryptの証明書をそのまま流用して次の様に記載します。
smtpd_tls_cert_file=/etc/letsencrypt/live/%対象ドメイン%/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/%対象ドメイン%/privkey.pem
smtp_use_tls=yes
smtp_use_tls=yes
のところを
smtpd_use_tls=yes
と書いてはいけません、これのおかげでかなりの時間を費やしてしまいました。
解決
上記設定で、Gmailにも、メールは届く様になったのですが、どうしてもスパムフォルダにエラーメッセージ付きで配信されてしまいます。
これを解消したのは、メールの送信アドレス(from)が、別のドメインになっていたので(これは以前作ったサービスのものがそのままのこっていた)、
それを適切にセットしてあげる事で、無事にメール送信されるようになりました。
ここまでまる2日ぐらい費やして、あらためてメール設定のカオスっぷりを体感してしまったため、
もはやこうしたメールを設定しないサービス作りを模索し始めてしまいましたよ。
Google , twitterのOAuth認証でやれば、本人確認もできて、ユーザーも無駄な手順をふまなくていいので、便利かも。
0 件のコメント:
コメントを投稿