メモ > サーバ > 各論: ネットワーク > メールを送信する際、迷惑メール扱いされないための設定(SPF)
■メールを送信する際、迷惑メール扱いされないための設定(SPF)
■SPFの概要
メールを送信するサーバのIPアドレスを、送信したいドメインのDNSレコード内で宣言をしておく
これにより、不正なサーバからのメール送信を禁止する
※SPFレコードは後付で用意されたもの。当初SPFはメモ書き用レコードであるTXTに設定されていた
SPFレコードを解釈できないサーバ向けに、SPFとTXTの両方のレコードに同じ内容を設定しておくのが好ましい
※メール送信サーバをスケーリングさせる場合、SPFレコード反映のタイムラグが問題になる可能性がある
そのため、メール送信サーバはマルチAZで手動スケーリングにするか、SESを使う必要がありそう
SPFとは?SPFの仕組みとSPFレコードの設定方法について解説します│教えて!レンタルサーバーのこと - ロリポップ!レンタルサーバー
https://lolipop.jp/media/what-is-an-spf-record/
SPFレコードとは?正しい書き方を徹底解説 - カゴヤのサーバー研究室
https://www.kagoya.jp/howto/it-glossary/mail/spf/
SPFレコードを Amazon Route 53 に登録する
https://blog.apar.jp/linux/737/
SPFとは
http://e-words.jp/w/SPF.html
hatena は今すぐSPF宣言しましょう。
http://pen2.hateblo.jp/entry/20090614/1244983020
SPF(Sender Policy Framework)
http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/spf/
10. SPFレコードの記述例
「ip4やip6の記法で簡潔に記述することを推奨する」
「RFCでは、連結したあとの1つのレコードが450バイト以下であることが目安とされている」
■SPFレコードの設定
送信元メールアドレスの正当性付与の為、SPFレコードをRoute53へ登録
「Route 53 → Hosted zones → (ドメインを選択) → Create Record Set」から登録する
今回は2台のサーバ(203.0.113.1 と 203.0.113.2 とする)からrefirio.netドメインとしてメール配信を行うため、以下のように登録
----------------------------------------------------------------------
Name Type Value
----------------------------------------------------------------------
refirio.net SPF "v=spf1 ip4:203.0.113.1 ip4:203.0.113.2 -all"
refirio.net TXT "v=spf1 ip4:203.0.113.1 ip4:203.0.113.2 -all"
----------------------------------------------------------------------
IPアドレスではなくAレコードで登録することもできるが、DNSの参照回数は10回が上限となっている
参照回数を減らすために、AレコードではなくIPアドレスで登録する方が無難そう
SPF について知らなかった 3 つのこと | はったりエンジニアの備忘録
https://blog.manabusakai.com/2017/08/spf-misconception/
間違いから学ぶSPFレコードの正しい書き方 : 迷惑メール対策委員会
https://salt.iajapan.org/wpmu/anti_spam/admin/operation/information/spf_i01/
DNS - SPFチェックでエラーが出る|teratail
https://teratail.com/questions/180645
また、以下のサイトからSPFレコードの登録内容を確認できる
SPF Record Check & SPF Lookup - Sender Policy Framework (SPF) - MxToolBox
https://mxtoolbox.com/spf.aspx
末尾の「all」は「-all」と「~all」がある。特に理由がなければ「-all」で良さそう
SPFレコード”~all”と”-all”の違い | SugiBlog
https://k-sugi.sakura.ne.jp/it_synthesis/linux/3632/
SPFレコードではAレコードを指定することもでき、具体的には以下のように設定する
送信元メールアドレスの正当性付与の為、SPFレコードをDNSへ登録
----------------------------------------------------------------------
Name Type Value
----------------------------------------------------------------------
refirio.net SPF "v=spf1 a:web1.refirio.net a:web2.refirio.net -all"
refirio.net TXT "v=spf1 a:web1.refirio.net a:web2.refirio.net -all"
----------------------------------------------------------------------
IPアドレスとAレコードの両方を設定することもできる
ただしAレコードを登録する場合、AレコードでIPを正引きできないとfail扱いになるのであらかじめ設定しておく
管理がややこしいので、IPアドレスかAレコードのどちらかに統一する方がいいかも…と思ったが、DNSの参照回数は10回が上限となっている
参照回数を減らすために、AレコードではなくIPアドレスで登録する方が無難そう
また「include」を使うことにより、外部の設定取り込むことができる
後述の「Gmail用の設定」も参照
以下は複数のincludeとIPアドレスを指定した場合の例
"v=spf1 include:_spf.example.ne.jp include:spf.example.jp ip4:203.0.113.1 ip4:203.0.113.2 ~all"
SPF レコードの例 | なりすまし対策ポータル ナリタイ
https://www.naritai.jp/guidance_spf_example.html
■送信元メールアドレスについて補足
メールを送信するプログラムを書く際、送信元のメールアドレスを指定できる
送信元のメールアドレスは「ヘッダーFrom」とも呼ばれ、送信者が自由に変更できる
例えばPHPの場合はmail関数でメールを送信できるが、第4引数でメールヘッダの内容を指定でき、ここでメールの送信元アドレスを指定できる
具体的には以下のように記述すると、from@example.com がメールの送信元になる
mail('to@example.com', '題名', 'メール本文', 'From: from@example.com');
さらに、PHPの場合はmail関数の第5引数でリターンパス(Return-Path)を指定できる
リターンパスは「エンベロープFrom」とも呼ばれ、メッセージが何らかのトラブルにより届けられなかった場合の、エラーの通知先として利用される
具体的には以下のように記述すると、system@example.com がリターンパスになる
mail('to@example.com', '題名', 'メール本文', 'From: from@example.com', '-f system@example.com');
「エンベロープFrom」は「ヘッダーFrom」を指定しても上書きされない
またリターンパスを指定しなかった場合「実行ユーザ名@ホスト名」となるが、サーバが複数台構成の場合に問題になることがある
具体的には送信元が apache@web1.refirio.net や apache@web2.refirio.net となった場合、
送信元サーバが web1.refirio.net や web2.refirio.net とみなされるため、上で設定した refirio.net のDNS設定内容は参照されない
sendmail コマンドによるメール発信 - Postfix Advent Calendar 2014
https://fumiyas.github.io/2014/12/13/sendmail.postfix-advent-calendar.html
PHP mail関数でenvelope-fromを指定する方法
http://kaworu.jpn.org/kaworu/2008-02-17-2.php
このようなことを避けるため、「-f auto@refirio.net」のようにリターンパスを常に指定しておくのが無難
そうでなければ以下のように、それぞれのホストに対して個別に設定を行う必要がある
-----------------------------------------------------
Name Type Value
-----------------------------------------------------
web1.refirio.net SPF "v=spf1 ip4:203.0.113.1 -all"
web1.refirio.net TXT "v=spf1 ip4:203.0.113.1 -all"
web2.refirio.net SPF "v=spf1 ip4:203.0.113.2 -all"
web2.refirio.net TXT "v=spf1 ip4:203.0.113.2 -all"
-----------------------------------------------------
また「エンベロープFrom」と「ヘッダーFrom」で異なるサーバのメールアドレスを指定している場合、
なりすましメールと判定されて届きづらくなる可能性があるので避ける
(原則、「エンベロープFrom」と「ヘッダーFrom」は同じメールアドレスを指定しておくのが無難だと思われる
また送信専用のメールアドレスを用意し、そのメールアドレスを指定しておくのが無難だと思われる)
2024年2月以降Gmailに送信するための新要件とは? 新しい送信者ガイドラインへの対応策 - ベアメールブログ
https://baremail.jp/blog/2023/12/18/3640/
■設定反映を確認
SPFレコードの設定完了後、設定が反映されているか確認
適当なサーバのコンソールから以下のコマンドを実行
$ dig refirio.net txt
以下の項目が表示されればOK
;; ANSWER SECTION:
refirio.net. 227 IN TXT "v=spf1 ip4:203.0.113.1 ip4:203.0.113.2 -all"
更に以下のコマンドを実行
$ dig refirio.net spf
以下の項目が表示されればOK
;; ANSWER SECTION:
refirio.net. 227 IN SPF "v=spf1 ip4:203.0.113.1 ip4:203.0.113.2 -all"
もしくは、以下のコマンドでもTXTレコードやSPFレコードの設定を確認できる
$ host -t txt refirio.net
$ host -t spf refirio.net
■正当性を確認
上記で問題がなければ、以下の手順で正当性が保たれているか確認
適当なサーバのコンソールから以下のコマンドを実行。xxxxxx@gmail.com は自身のGmailのアドレスにする
admin@refirio.net は送信元メールアドレスを設定する
(もしくはPHPなどでメール送信プログラムを作成し、自身のGmailアドレスに送信してもいい)
echo "Text Mail." | mail -s "test mail" -r admin@refirio.net xxxxxx@gmail.com
Gmailへログインし、受信したメールヘッダを確認
以下のように spf=pass が表示されていれば成功(問題がある場合、spf=fail となる)
Authentication-Results: mx.google.com;
spf=pass (google.com: domain of admin@refirio.net designates 203.0.113.1 as permitted sender) smtp.mailfrom=admin@refirio.net
独自ドメインのメール送信を SPF に対応させる方法
http://webos-goodies.jp/archives/51103006.html
以下のようなツールでも、SPFの反映をチェックできる
SPF Records
http://mxtoolbox.com/spf.aspx
SPF Viewer
https://dmarcian.com/spf-survey/
例えば送信先をロリポップのメールアドレスにして、そのメールアドレスからGmailに転送した場合、spf=fail になる
これは別サーバを経由しているためだが、現状決定的な解決策は無いみたい
運用に関する提案
http://salt.iajapan.org/wpmu/anti_spam/admin/operation/suggestion/
初回の設定は比較的すぐに反映されるようだが、変更した場合は24時間〜72時間程度かかるかも
SPFレコードはDNSの新しい定義方法のため、DNSサーバによっては扱えない場合がある
可能であれば、SPFとTXTの両方に同じ設定をしておくことが望ましい
ただしこの場合、チェッカーによってはduplicateの警告が表示されるみたい
Gmailが大丈夫なら、Yahoo!でも同様にテストしておく(Yahoo!メールに送信し、メールヘッダを確認)
■Gmail用の設定
送信(SMTP)に使われる Google の IP アドレスの範囲 - G Suite 管理者 ヘルプ
https://support.google.com/a/answer/60764?hl=ja
「include:_spf.google.com」を設定するといいみたい
以下は設定例(詳細は要勉強)
----------------------------------------------------------------------
Name Type Value
----------------------------------------------------------------------
test-web1.refirio.net A 203.0.113.1
test-web2.refirio.net A 203.0.113.2
test.refirio.net SPF "v=spf1 a:test-web1.refirio.net a:test-web2.refirio.net include:_spf.google.com -all"
test.refirio.net TXT "v=spf1 a:test-web1.refirio.net a:test-web2.refirio.net include:_spf.google.com -all"
test.refirio.net CNAME test-123456789.ap-northeast-1.elb.amazonaws.com.
----------------------------------------------------------------------