【Ubuntu】4つの方法でPHP配信したメールが迷惑メール行きを防ぐ

メール

配信したメールが迷惑メールに配信されて顧客に届かない。

こんなことにならないために、4つの方法を抑えておけば迷惑メールに行くリスクを下げることができます。

方法[3]についてはUbuntuのやり方に限定していますが、それ以外はUbuntuに限らず利用できる方法です。

※検証環境:Ubuntu22.04 LTS (Ubuntu20でも問題なく動作します)

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);

これによってスパムが解除される場合があります。

2. 正しくspfを設定する

例えば[email protected]から送信した場合、まず受け取ったらなりすましではなく「example.org」から送信されているメールかどうかをspfを使って確認します。

そしてspfを設定していなかったり、正しく設定されていないと、なりすましと判断されて迷惑メールに直行する確率が非常に高くなります。

その為、正しく送信されたことを証明するspfはメール配信に必要不可欠な要素です。

spfの設定方法

※ここではかなり簡単に説明します。分かりにくい!という方は追加で調べていただけれると幸いです。

まず、ドメインを管理している会社(お名前.comやcloudflare、〇〇ドメイン、など)からDNSの追加を行います。

次のように設定してください。

  • タイプ:TXT
  • 名前(ホスト):@
  • コンテンツ:v=spf1 +ip4:<送信するサーバーのIPアドレス> -all

コンテンツの設定方法は、自前のサーバーの場合そのようになりますが、レンタルサーバーの場合はレンタルサーバー会社により異なりますので「〇〇サーバー spfレコード 設定」などと検索してみてください。

spfが正しく設定されているかチェックする

の一番最初の入力欄(Domain name: )にドメイン(例:example.org)を入力。

そしてそのすぐ下のボタン( 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…..
TTL500

DKIM署名が有効でないメールの扱いを設定するためのADSPレコードを登録します。

dkimには

  • all [送信するメールはすべてDKIM署名している]
  • unknown [DKIM署名していないメールも送信している]
  • discardable [DKIM署名されていないメールまたは不正な内容のDKIM署名がされているメールが届いた場合は、すべて破棄してよい]

を設定します。メールが届くことを確認してからallやdiscardableへ引き上げます。

ホスト名[名前]_adsp._domainkey
タイプ[TYPE]TXT
コンテンツ[VALUE]dkim=unknown
TTL500

DMARCを設定

pの値は

  • none [すべて受信する]
  • quarantin [隔離する]
  • reject [受信拒否する]

になります。

ホスト名[名前]_dmarc
タイプ[TYPE]TXT
コンテンツ[VALUE]v=DMARC1; p=none; pct=100; adkim=r; aspf=r
TTL300

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では

を利用することでメールの統計を見ることができるので使用してみるといいかもしれません。

参考