戻る
■メールを送信する際、迷惑メール扱いされないための設定
※PHPからメールを送信する際にFromを任意のアドレスに設定できるが、 ドメインを変えると「送信元アドレスの詐称」とみなされる可能性が高くなるので注意 そのサーバのドメインのアドレスを指定し、そのアドレスは「送信専用アドレス」とするなどを検討する ※メール送信サーバはオートスケーリングでない前提 ※SPFレコードは後付で用意されたもの。当初SPFはメモ書き用レコードであるTXTに設定されていた SPFレコードを解釈できないサーバ向けに、SPFとTXTの両方のレコードに同じ内容を設定しておくのが好ましい ※メール送信サーバをスケーリングさせる場合、SPFレコード反映のタイムラグが問題になる可能性がある そのため、メール送信サーバはマルチAZで手動スケーリングにするか、SESを使う必要がありそう ※以下の内容はAWSで2台のWebサーバからメールを送信する前提 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バイト以下であることが目安とされている」 メールヘッダに X-Authentication-Warning が含まれている場合、以下の対応も行う メールヘッダに X-Authentication-Warning: が付かないようにする http://www.omakase.org/mail/_x-authentication-warning.html phpからメールを送るとX-Authentication-Warningヘッダがご丁寧に http://www.orenante.com/?p=743 AWSでの対応は以下にまとめられているが、2013年の記事 Amazon EC2 Eメール送信ベストプラクティス | Developers.IO https://dev.classmethod.jp/cloud/aws/ec2-send-email-best-practice/ 以下、AWSでRoute53を使った場合の設定例 ■正引きの設定 メール送信サーバにて正引きが行えるよう、Route53にAレコードを登録しておく (http://web1.refirio.net/ http://web2.refirio.net/ で直接サーバにアクセスできるようになる) ----------------------------------- Name Type Value ----------------------------------- web1.refirio.net A 203.0.113.1 web2.refirio.net A 203.0.113.2 ----------------------------------- ■SPFレコードの設定 メールを送信するサーバのIPアドレスを、送信したいドメインのDNSレコード内で宣言をしておく これにより、不正なサーバからのメール送信を禁止する 送信元メールアドレスの正当性付与の為、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アドレスで登録する方が無難そう ■送信元メールアドレスについて補足 メール送信時の引数(PHPの場合はmail関数の第5引数)で「-f auto@refirio.net」と指定すると、送信元サーバが refirio.net とみなされる 指定しなかった場合「実行ユーザ名@ホスト名」となるが、サーバが複数台構成の場合に問題になることがある 具体的には送信元が apache@web1.refirio.net や apache@web2.refirio.net となった場合、 送信元サーバが web1.refirio.net や web2.refirio.net とみなされるため、上で設定した refirio.net の設定内容は参照されない この値は、メールヘッダでFromやSenderを設定しても上書きできない 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" ----------------------------------------------------- ■設定反映を確認 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 以下は設定例(詳細は要勉強) ---------------------------------------------------------------------- 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. ---------------------------------------------------------------------- ■メールを送らないドメイン用の設定 メールを受け取らないドメイン名に"Null MX"のリソースレコードを登録してみる - インフラエンジニアway - Powered by HEARTBEATS https://heartbeats.jp/hbblog/2016/12/null-mx.html 以下は設定例(詳細は要勉強) ---------------------------------------------------------------------- Name Type Value ---------------------------------------------------------------------- test.refirio.net MX 0 . ---------------------------------------------------------------------- ■Postmasterツール 自分の送ったメールがGmailでどれぐらい迷惑メール判定されているかがわかるツール (登録しても内容が表示されない場合、日を置いて確認する。メールトラフィックが少なすぎる場合も表示されないらしい) Postmaster Tools https://gmail.com/postmaster/ にアクセスし、「Get Started」から開始する 「メールの認証に使用するドメイン」を登録すると
refirio.net の所有権の確認 1. refirio.net の DNS 設定に TXT レコードを追加します。 TXT レコード: google-site-verification=XXXXX
のように表示されるので、DNSに登録する 「ダブルクォートで囲う必要がある」「すでにTXTレコードがあれば、既存のものに改行して追加する」という点に注意 Route53で、refirio.net のTXTレコードを以下のように変更
"v=spf1 a:web1.refirio.net a:web2.refirio.net -all"
"v=spf1 a:web1.refirio.net a:web2.refirio.net -all" "google-site-verification=XXXXX"
$ dig refirio.net any で反映を確認 Postmaster Tools で「確認」ボタンを押して完了する ドメインが「確認済み」になった Postmaster Tools で refirio.net のドメインをクリックして診断を表示する 自社のメールがGmailでどれだけスパム判定されてるか、グーグルのPostmaster Toolsで調べてみた | 編集長ブログ―安田英久 | Web担当者Forum https://webtan.impress.co.jp/e/2015/08/25/20863 AWS Route 53でTXTレコードを追加できない場合の対処法 - Qiita https://qiita.com/s_osa/items/1e4bf69f3c77dab91275 amazon web services - Tried to create 2 record set type=TXT in Route53 - Server Fault https://serverfault.com/questions/616407/tried-to-create-2-record-set-type-txt-in-route53 ■逆引きの設定 サーバによっては、はじめから設定済みになっていることもある DNSの上位管理者が設定するため自分では設定できないことが多いが、専用画面から設定できることもある AWSの場合、具体的な操作内容は AWS.txt の「メールの制限緩和」を参照 逆引きとは何ですか?どういった用途で利用しますか? https://faq.interlink.or.jp/faq2/View/wcDisplayContent.aspx?id=94 逆引きの設定方法とは:DNS Tips - @IT https://www.atmarkit.co.jp/ait/articles/1501/05/news014.html DNS逆引きレコードの設定 | さくらのクラウド ドキュメント https://manual.sakura.ad.jp/cloud/server/reverse-hostname.html EC2インスタンスからメール送信のための準備 https://cloudpack.media/11249 ■IPv6 さくらの専用サーバなど、送信元IPがIPv6のアドレスのものになることがある この場合、IPv4のアドレスをSPFに登録しても効果がない可能性がある IPv4からIPv6への移行が推奨されているので、サーバの設定でIPv6の設定を無効にするのではなくSPFにIPv6の設定を追加する方が良さそう $ ifconfig eth0 Link encap:Ethernet HWaddr 44:8A:5B:3B:96:30 inet addr:203.0.113.1 Bcast:203.0.113.255 Mask:255.255.255.0 inet6 addr: 2001:DB8203:a:153:120:12:84/64 Scope:Global inet6 addr: fe81::469b:5bff:fe3b:9630/64 Scope:Link この場合、以下のようにIPv6のアドレスをSPFに登録するといい(未検証) ip6:2001:DB8203:a:153:120:12:84/64 ■バウンスメールを解析 Command.txt の同項目を参照 ■DKIMの設定 電子書面により、メールの改ざんを検知できる 一例だが、おおまかに 1. OpenDKIMをインストールし、専用コマンドでキーペアを作成する 2. Postfixの設定を調整し、メール送信時にOpenDKIMで署名されるようにする(秘密鍵が使われる) 3. DNSを調整し、誰でも署名の検証ができるようにする(公開鍵を登録する) 4. 送信したメールが受信者のメールサーバに到達したとき、受信サーバはDKIM署名の検証を行う この検証プロセスにおいて、受信サーバはメールヘッダのDKIM署名から送信ドメインを特定し、そのドメインのDNSレコードを問い合わせて公開鍵を取得する 取得した公開鍵を用いて、署名されたメールの正当性(つまり、メールが途中で改ざんされていないこと)を検証する という流れになる 上記のとおり送信サーバ側でソフトウェアのインストールや設定が伴うので、SPFに比べると導入の敷居は高い 実際にメールサーバで設定したときのメモが「Mail.txt」の「DKIMの設定」にある 実際にSESでDKIMを設定したときのメモが「AWS.txt」の「SES メール送信」にある DKIMとは?認証の仕組み、SPFやDMARCとの違い|メール配信システム・メルマガ配信サービスならCuenote FC https://www.cuenote.jp/fc/security/dkim.html SPFとDKIMの設定で迷惑メール扱いを回避する | LINUXの勉強ブログ https://www.jdbc.tokyo/2016/06/spf-dkim-setting/ DKIM (Domainkeys Identified Mail) : 迷惑メール対策委員会 http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/dkim/ Postfix + OpenDKIMで送信元ドメイン認証を実装するメモ - Qiita https://qiita.com/taku1201/items/3b2dffd950340b9726d0 ■DMARCの設定 SPFやDKIMの仕組みを用いて検証した結果、送信元メールアドレスが詐称されている場合の処理をポリシーとして定義しておく 具体的には、「何もせずに受信」「本来のメールとは別の場所に隔離」「破棄」といったアクションを事前に定義しておき、 送信元メールアドレスが詐称されていた場合はポリシーに沿って対応する またDMARCを設定しておくと、受信者から認証結果のレポートを受け取れるようになる 実際にSESでDMARCを設定したときのメモが「AWS.txt」の「SES メール送信」にある DMARCとは?送信ドメイン認証の仕組みを理解して、なりすまし対策をしよう! | メルラボ https://mailmarketinglab.jp/about-dmarc/ 送信ドメイン認証技術(SPF、DKIM )やDMARCとはどのような仕組みか?|メールマーケティングのCuenote https://www.cuenote.jp/library/marketing/dmarc.html なりすましを撲滅する?「DMARC」の概要をざっくり理解しよう | メルラボ https://mailmarketinglab.jp/about-dmarc/ Amazon Linux 2でDKIMの設定 (ついでにSPF/DMARCも) - Qiita https://qiita.com/biatunky/items/9009c95754da4b2e5571 ■Gmailのメール認証規制強化 Gmailは2024年2月から迷惑メール対策を強化するとのこと Gmailのメール認証規制強化への対応って終わってますか? - エムスリーテックブログ https://www.m3tech.blog/entry/2023/10/24/110000 GoogleとYahooの新Eメール認証要件への短い対応タイムライン | Proofpoint JP https://www.proofpoint.com/jp/blog/email-and-cloud-threats/google-and-yahoo-set-new-email-authentica... Gmailが2024年2月から(大量)送信者に求めてることが分からない闇への防衛術(前編) #Security - Qiita https://qiita.com/nfujita55a/items/37b05801209f6058808e Gmailの新スパム規制対応全部書く https://zenn.dev/ken_yoshi/articles/gmail-new-requirements-2024 ■その他の参考ページ Gmailを利用してメール送信ドメイン認証(SPF/DKIM/DMARC)の判定結果を簡単に確認する:Tech TIPS - @IT http://www.atmarkit.co.jp/ait/articles/1701/11/news029.html GmailやYahooメールで、迷惑メールと判定されないように、GoogleApps+独自サーバ(GMOクラウド)+PHPでメールを送る場合にやること http://rough-and-ready-co-jp.blogspot.jp/2013/02/gmailyahoogoogleappsgmophp.html Gmailスパムフィルタと壮絶に闘ってみた http://tatete.blogspot.jp/2012/07/gmail.html 評判のさくらのVPSでSMTP(Sendmail)を公開する時にやっておきたいこと http://server-setting.info/blog/smtp-sakuravps-presetting.html Amazon EC2のサーバからメール送信をするまでにやるべきこと (スパムメール扱いを回避する!) http://d.hatena.ne.jp/rx7/20100319/p1 Yahoo!メール迷惑メールに振り分けられる http://taka-mori.hateblo.jp/entry/20090805/1249441550 Gmailでスパム扱いされるときの対処方法(迷惑メールフィルタ) - Qiita https://qiita.com/miwato/items/7316e55ebd2ce5a0261c 知ってた?Gmailが迷惑メール判定する7つの理由と解除方法 | フォームズのブログ https://blog.formzu.com/reason_for_being_treated_as_spam また、Trouble.txt の「メールを送信しても届かない / 迷惑メールとして処理される」も確認する ブラックリストに登録されている場合、リストからの削除依頼を行う必要がある。などの作業もある ブラックリストに登録されているか確認できるツール The Spamhaus Block List https://www.spamhaus.org/sbl/ APEWS http://www.apews.org/ ■PHPでのメール送信例 メールを送信する際、mb_send_mailの第5引数でバウンスメールの受け取りアドレスを設定できる ここにSPFなどで設定したメールアドレスを指定しておく。原則としてFromのアドレスと同じになるはず DNS側でSPFを設定しても、PHP側でこの指定をしていないとSPFがpassにならない可能性がある PHPの場合、mb_send_mail() の第5引数で指定できる
<?php mb_language('Japanese'); mb_internal_encoding('UTF-8'); // メールを送信 if (mb_send_mail( 'example@example.com', 'テストメール', 'バウンスメールのテスト。' . "\n" . 'これはテストです。', 'From: auto@refirio.net', '-f auto@refirio.net' // バウンスメールの受け取りアドレス(Return-Path) )) { echo 'OK'; } else { echo 'NG'; }