【Ubuntu】4つの方法でPHP配信したメールが迷惑メール行きを防ぐ
配信したメールが迷惑メールに配信されて顧客に届かない。
こんなことにならないために、4つの方法を抑えておけば迷惑メールに行くリスクを下げることができます。
方法[3]についてはUbuntuのやり方に限定していますが、それ以外はUbuntuに限らず利用できる方法です。
※検証環境:Ubuntu22.04 LTS (Ubuntu20でも問題なく動作します)
目次
- 1 1.return_pathを設定する
- 2 2. 正しくspfを設定する
- 3 3. DKIM/DMARCの設定
- 3.1 OpenDKIMをインストール
- 3.2 postfixをopendkimグループに追加
- 3.3 opendkim 鍵の作成
- 3.4 DNSサーバーへ公開鍵、DMARCを設定
- 3.5 DNSが設定されたか確認
- 3.6 公開鍵の確認
- 3.7 DKIMポリシーレコードの確認
- 3.8 OpenDKIMの設定ファイルを編集
- 3.9 Socketファイル用のディレクトリを作成
- 3.10 /etc/default/opendkimを修正
- 3.11 3つファイルを作成
- 3.12 opendkim起動
- 3.13 Postfixの設定を変更
- 3.14 サービスを再起動
- 3.15 DKIM/DMARC(+SPF)が設定されているか確認する
- 4 4. DNS逆引きの設定
- 5 あれ?4つやってみたけど送信してもスパム解除されないよ?って場合
- 6 参考
1.return_pathを設定する
mail()関数を使う際、5番目の引数にreturn_pathを追加します。
<?php
mb_language("Japanese");mb_internal_encoding("UTF-8");
$mail = "Test Website <[email protected]>";
$header_info = "From: " . $mail . " \r\nReturn-Path: [email protected] \r\nX-Priority: 1 \r\nContent-Type: text/html;charset=UTF-8\r\nX-Sender: " . $mail . "\r\nOrganization: Test Website\r\n";
$body = <<< EOM
コンテンツ
EOM;
$body = mb_convert_encoding($body, "UTF-8", "auto");
$return_path="-f [email protected]";
mail("[email protected]", 'メールのタイトル', $body, $header_info ,$return_path);
これによってスパムが解除される場合があります。
return_pathはその名の通り「返信アドレス」です。
送信するアドレスと同じか、もしくは返信専用のアドレスを設定してください。
2. 正しくspfを設定する
例えば[email protected]から送信した場合、まず受け取ったらなりすましではなく「example.com」から送信されているメールかどうかをspfを使って確認します。
そしてspfを設定していなかったり、正しく設定されていないと、なりすましと判断されて迷惑メールに直行する確率が非常に高くなります。
その為、正しく送信されたことを証明するspfはメール配信に必要不可欠な要素です。
spfの設定方法
※ここではかなり簡単に説明します。分かりにくい!という方は追加で調べていただけれると幸いです。
まず、ドメインを管理している会社(お名前.comやcloudflare、〇〇ドメイン、など)からDNSの追加を行います。
次のように設定してください。
- タイプ:TXT
- 名前(ホスト):@
- コンテンツ:v=spf1 +ip4:<送信するサーバーのIPアドレス> -all
コンテンツの設定方法は、自前のサーバーの場合そのようになりますが、レンタルサーバーの場合はレンタルサーバー会社により異なりますので「〇〇サーバー spfレコード 設定」などと検索してみてください。
spfが正しく設定されているかチェックする
の一番最初の入力欄(Domain name: )にドメイン(例:example.com)を入力。
そしてそのすぐ下のボタン( Get SPF Record (if any) )を押します。
evaluating…
SPF record passed validation test with pySPF (Python SPF library)!
とボタンの下あたりに出てくれば正しく設定されています。
出てこなかった場合しばらく待って試してみるか、設定を確認してみてください。
3. DKIM/DMARCの設定
これはspfより少し複雑な作業になりますが、効果は高いです。
OpenDKIMをインストール
$ sudo apt install opendkim opendkim-tools
postfixをopendkimグループに追加
$ sudo gpasswd -a postfix opendkim
opendkim 鍵の作成
ここからexample.comはすべて自分のドメインに置き換えてください。
例:example.com → tamralblog.com
$ sudo mkdir -p /etc/opendkim/keys/example.com
$ sudo opendkim-genkey -b 2048 -d example.com -D /etc/opendkim/keys/example.com -s default
下記のコマンドでdefault.privateとdefault.txtが生成されているか確認してください。
$ ls -al /etc/opendkim/keys/example.com/
確認できたらファイルの所有者を変更します。
$ sudo chown -R opendkim:opendkim /etc/opendkim/keys/example.com/
公開鍵を確認します。
$ sudo cat /etc/opendkim/keys/example.com/default.txt
このように出力されるので、コピーしてください。
※下記の鍵は偽物です。
default._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; "
"p=MIIBIjANBgkqhkiG9weBAQEFAAOnAQ8AMIIBCgKCAQEAqyF+zfH6QLnfu//nQ38k6vVG+6S0EksIDXjipNshbd25BJL7GvTtSaAv6ce98bfCWQvjIqJPtSTvjPc19wj2XbUaQ1n1b36wPaZfc05WjC34Jjq3m5XYLnLzzq7D7ctCy3mdzvy2V6puT3UuJPMIeaOaZ4VPWid4eNMMb+YqkDplasMO246/D5nux9HNS6XrpKWhLL/n0j2tty"
"ilYgJUEpGX2bZkA+mGhMQ/3yH5J7OkyO2EpCy1e9SP6MPiUOaNq7Z6OwgljYWRxinYKhO2p69l/M44b77CMU3T6LbB8wmT46E7OlRh7ZkJRQVeJb6O0EtEYEgCHSwVPUilY18o6wIDAQAB" ) ; ----- DKIM key default for example.com
[p=…]が分割されてしまっているので、”で区切られているところを消して統合します。
p=MIIBIjANBgkqhkiG9weBAQEFAAOnAQ8AMIIBCgKCAQEAqyF+zfH6QLnfu//nQ38k6vVG+6S0EksIDXjipNshbd25BJL7GvTtSaAv6ce98bfCWQvjIqJPtSTvjPc19wj2XbUaQ1n1b36wPaZfc05WjC34Jjq3m5XYLnLzzq7D7ctCy3mdzvy2V6puT3UuJPMIeaOaZ4VPWid4eNMMb+YqkDplasMO246/D5nux9HNS6XrpKWhLL/n0j2ttyilYgJUEpGX2bZkA+mGhMQ/3yH5J7OkyO2EpCy1e9SP6MPiUOaNq7Z6OwgljYWRxinYKhO2p69l/M44b77CMU3T6LbB8wmT46E7OlRh7ZkJRQVeJb6O0EtEYEgCHSwVPUilY18o6wIDAQAB
DNSサーバーへ公開鍵、DMARCを設定
DNS(Cloudflareやonamae.com)でDNSを追加します。
TTLはそれ通りでなくてもよいです。
コンテンツは先ほど取得した公開鍵を利用してください。
ホスト名[名前] | default._domainkey |
タイプ[TYPE] | TXT |
コンテンツ[VALUE] | v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9weBAQEFAAOnAQ8AMIIBC….. |
TTL | 500 |
DKIM署名が有効でないメールの扱いを設定するためのADSPレコードを登録します。
dkimには
- all [送信するメールはすべてDKIM署名している]
- unknown [DKIM署名していないメールも送信している]
- discardable [DKIM署名されていないメールまたは不正な内容のDKIM署名がされているメールが届いた場合は、すべて破棄してよい]
を設定します。メールが届くことを確認してからallやdiscardableへ引き上げます。
ホスト名[名前] | _adsp._domainkey |
タイプ[TYPE] | TXT |
コンテンツ[VALUE] | dkim=unknown |
TTL | 500 |
DMARCを設定
pの値は
- none [すべて受信する]
- quarantin [隔離する]
- reject [受信拒否する]
になります。
ホスト名[名前] | _dmarc |
タイプ[TYPE] | TXT |
コンテンツ[VALUE] | v=DMARC1; p=none; pct=100; adkim=r; aspf=r |
TTL | 300 |
DNSが設定されたか確認
$ sudo opendkim-testkey -d example.com -s default -vvv
最後にopendkim-testkey: key OK
と出力されればOKです。
公開鍵の確認
$ dig default._domainkey.example.com txt
こんな応答があれば問題なしです。
; <<>> DiG 9.16.1-Ubuntu <<>> default._domainkey.example.com txt
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22532
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;default._domainkey.example.com. IN TXT
;; ANSWER SECTION:
default._domainkey.example.com. 500 IN TXT "v=DKIM1; k=rsa; p=MIIBIj........
;; Query time: 164 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sat Apr 09 02:39:15 JST 2022
;; MSG SIZE rcvd: 347
DKIMポリシーレコードの確認
$ dig _adsp._domainkey.example.com txt
こちらも先ほどのような応答があればOKです。
OpenDKIMの設定ファイルを編集
$ sudo mkdir /var/spool/postfix/opendkim
$ sudo chown opendkim:postfix /var/spool/postfix/opendkim
Socketファイル用のディレクトリを作成
$ sudo vim /etc/opendkim.conf
下記の4行を見つけ出し、下3行のコメントを外して次のように置き換えます。
※最新版のデフォルトの記載が下記4行と異なっています。コメントが既に外れていたり、relaxed/simpleがデフォルトだったりしていますが、下3行の状態にさえしてもらえれば問題ありません。
# Commonly-used options; the commented-out versions show the defaults.
#Canonicalization simple
#Mode sv
#SubDomains no
↓
Canonicalization relaxed/simple
Mode sv
SubDomains no
Socketの箇所もコメントアウトを変更します。
デフォルトをコメントアウトしてlocal:/var/spool/…で始まるものをコメント解除します。
#Socket local:/run/opendkim/opendkim.sock
Socket local:/var/spool/postfix/opendkim/opendkim.sock
そして下記内容をファイルの末尾に追加します。
KeyTable refile:/etc/opendkim/key.table
SigningTable refile:/etc/opendkim/signing.table
ExternalIgnoreList /etc/opendkim/trusted.hosts
InternalHosts /etc/opendkim/trusted.hosts
/etc/default/opendkimを修正
$ sudo vim /etc/default/opendkim
Socketの値を変更します。
#SOCKET=local:$RUNDIR/opendkim.sock
SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"
3つファイルを作成
$ sudo vim /etc/opendkim/signing.table
次の内容を書き込んで保存します。
*@example.com default._domainkey.example.com
$ sudo vim /etc/opendkim/key.table
次の内容を書き込んで保存します。
default._domainkey.example.com example.com:default:/etc/opendkim/keys/example.com/default.private
$ sudo vim /etc/opendkim/trusted.hosts
次の内容を書き込んで保存します。
127.0.0.1
locahost
*.example.com
opendkim起動
$ sudo systemctl start opendkim
エラーが出力されなければ、opendkimは起動成功です。
サービスの状態を確認します。
systemctl status opendkim
Activeと表示されていればOKです。
自動起動するよう設定します。
$ sudo systemctl enable opendkim
Postfixの設定を変更
$ sudo vim /etc/postfix/main.cf
最下部に以下の内容を追記します。
### DKIM Settings
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
サービスを再起動
$ sudo systemctl restart postfix opendkim
DKIM/DMARC(+SPF)が設定されているか確認する
gmailにメールを送信してみてください。
受信したメールのソースを見ると、
PASSと表示されていればすべて正常に設定できています。
4. DNS逆引きの設定
DNSは通常、「ドメインからIPアドレス」で検索を行いますが、逆引きでは「IPアドレスからドメイン」の検索が行われます。
メールがIPアドレスとFromのメールアドレスが正規のものであるかを確認することができるようになります。
この設定方法は利用しているサービスによって異なるため、各自で検索して方法を見つけてください。
また、ドメインのDNSではなくIPアドレス側に設定するので、その点注意してください。
あれ?4つやってみたけど送信してもスパム解除されないよ?って場合
ドメインがブロックリストに登録されていたり、メールのコンテンツが煽り文句ぽかったりすると迷惑メールに行きやすくなります。
Googleに正常に扱われているかどうかは、
からリンクを入力して確認できます。
またGmailでは
を利用することでメールの統計を見ることができるので使用してみるといいかもしれません。