スポンサーサイト

スポンサー広告
-- /-- --
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PHPからメールを送って迷惑メールにならないようにする

サーバ運用
12 /03 2014
PHPから mb_send_mail や Qdmail を使ってメールを送り、Gmailで受信すると、迷惑メールになってしまう事が増えてきた。
できるだけ迷惑メールにならないように、サーバ側の設定を行う。

1. 前提
・www.example1.jp というサーバから、PHPでメールを送る。
・From は abc@example1.jp
・送り先は xyz@gmail.com
・開発者は www.example1.jp にSSHでログインでき、rootになる事もできる。
・www.example1.jp のIPアドレスは 222.222.222.222 。
・PHPの実効ユーザは apache。

2. SPFの設定
www.example1.jp にSPFの設定がない場合、受信したメールのソースを読むと(gmailなら「メッセージのソースを表示」)、
Received-SPF: none (google.com: apache@www.example1.jp does not designate permitted sender hosts) client-ip=222.222.222.222;
という行がある事がわかる。
SPFについての詳しい説明は割愛するが、none は「SPFレコードが存在しないか公開されていないため、認証できなかった」という意味。
これがpass(「合格」)になるようにしたい。

●SSHでの設定
・サーバにSSHでログインし、rootになる。
・viでゾーンファイルを編集する。
ゾーンファイルは、/etc/named/example1.jp.zone(サーバによっては /var/named/example1.jp.zone かもしれないしもっと他の場所・名前かもしれない)。
末尾に以下を追加する。
example1.jp. IN TXT "v=spf1 ip4:222.222.222.222 ~all"
example1.jp の部分は自サーバのドメイン名。末尾に . を付ける。
222.222.222.222 の部分は自サーバのIPアドレス。
・同ファイルの上の方にあるシリアル値に1を足す。
@ IN SOA www.example1.jp. root.example1.jp. (
2014112701
→この場合なら 2014112702 にする。
・上記の設定内容を反映させるため、namedを再起動する。
/etc/init.d/named restart

● Webminが使える場合
・Webminを開く。
・[サーバ]-[BIND DNS サーバ]をクリック。
・[既存の DNS ゾーン]-[example1.jp]をクリック。
・[レコード ファイルの編集]。→ ゾーンファイルの編集画面が開く。
・末尾に以下を追加する。
example1.jp. IN TXT "v=spf1 ip4:222.222.222.222 ~all"
example1.jp の部分は自サーバのドメイン名。末尾に . を付ける。
222.222.222.222 の部分は自サーバのIPアドレス。
・[レ]Increase serial number automatically にチェックを入れる。
・[保存]。
・[変更を適用](または[Apply Configration])を押す。

これにより、SPFの設定ができた。
再度メールを送受信してみる。
Received-SPF: pass (google.com: domain of apache@www.example1.jp designates 222.222.222.222 as permitted sender) client-ip=222.222.222.222;
になるはず。

3. エンベロープFromの設定
上の Received-SPF を見ると、apache@www.example1.jp と書いてある。
これは、メールヘッダのFromではなく、エンベロープ(封筒)のFromが apache@www.example1.jp になっていた事を意味する。
さらに Return-Path: を見ると、これも apache@www.example1.jp になっている。
これが原因で迷惑メールになる恐れがあるだけでく、相手にメールが届かなかった場合、abc@example1.jp にメールが返らず、apache@www.example1.jp に変更されてしまう。
これを回避するには、PHP側で、FromだけでなくエンベロープFromもセットしてやる。

● mb_send_mail の場合
mb_send_mail($to, $subject, $body, "From: $from", "-f$from" );

● qdmail(関数型)の場合
$option = array(
'type' => 'text',
'option' => array(
'mtaOption' => "-f $from"
)
);
qd_send_mail($option, $to, $subject, $body, $from);

これで、期待通り、以下のようになる。
Received-SPF: pass (google.com: domain of abc@www.example1.jp designates 222.222.222.222 as permitted sender) client-ip=222.222.222.222;

4. 信任ユーザの設定
SPFはpassになり、メールアドレスも正しくなったが、今度は
X-Authentication-Warning: www.example1.jp: apache set sender to abc@www.example1.jp using -f
という行が出力されてしまった。
これは「apacheが -f オプションを使って送信者を書き換えた」という警告。
回避するには、apacheが -f オプションを使って良いユーザ(=信任ユーザ)だと設定してやる。

● SSHでの設定
・サーバにSSHでログインし、rootになる。
・viで /etc/mail/trusted-users を編集する。
・末尾に apache を追加する。

● Webminが使える場合
・Webminを開く。
・[サーバ]-[Sendmail の設定]をクリック。
・[信任ユーザ (T)]。 → 信任ユーザの編集画面が開く。
・末尾に apache を追加して[保存]。

これで、X-Authentication-Warning が出力されなくなる。

5. それでも迷惑メールになる場合
・DKIM やら DMARC やらの設定をしてやると良いようだが、これはまだ試していない。
・いかがわしい内容のメールだったりすれば、迷惑メールと判断されても仕方がない。
・多くのユーザが迷惑メールと判定したら、Gmailが迷惑メールとみなすらしい。

コメント

非公開コメント

Paq

忘れっぽい中年プログラマが、日々の開発作業の中で、忘れると困ることを書き留めています。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。