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が迷惑メールとみなすらしい。
スポンサーサイト

logrotate

サーバ運用
07 /27 2009

サーバは、ホームページのアクセスやメール送受信などの際にログを作成してくれる。
ログは放っておくと肥大化するので、ローテートをする設定になっている。
ローテーションには、logrotate が使われている。
logrotate は、設定ファイル /etc/logrotate.conf を参照している。
rootで logrotate.conf に追記すれば、独自のログをローテートする事ができる。

rootでなくユーザ権限で
$ /usr/sbin/logrotate ~/my-logrotate.conf
を実行してみたが、
error: error creating state file /var/lib/logrotate.status: Permission denied
と怒られてしまった。
logrotate.status は所有者がrootになっているので、やはりroot権限が必要らしい。
(何かオプションを指定すれば良いのかもしれないが、分からなかった)
root権限でしか logrotate ができないのは不便な面もあるが、
ローテートするログファイルを一元管理できるというメリットもある。

さて、logrotate.conf の実際の書き方である。
既にこのファイルは存在し、何らかの設定が書いてあるはずなので、それを変える必要はない。
最下行に以下のように書いてあるので、
# system-specific logs may be also be configured here.
その下に、以下のように書けばよい。

/home/user1/procmail/rc.log /home/user2/procmail/rc.log /home/user3/procmail/rc.log {
        postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        endscript
        sharedscripts
}
/home/user1/my-dir/pm2.log {
}

上の例で、rc.log は .procmailrc が生成するログファイルである。
ローテートをした後に HUP を送るような指定にしてある。
これは不要かもしれないが、他のサイトでこれを書いている所があったので、一応つけてみた。

また、pm2.log は、特定のメールを携帯に転送する自作プログラムのログである。
こちらはすべてデフォルトのままで良いので(たぶん)、内容が空となる。

Webminがある環境なら、logrotate.conf の記述を vi などのエディタで行う必要はない。

  1. Webminにrootでログイン。
  2. システム→Log File Rotation を選ぶ。
  3. Add a new log file to rotate. を実行する。
  4. Log file paths にログファイル名をフルパスで書く。(複数指定可能、各行に1つずつ書く)
  5. 必要であれば、Commands to run after rotation 欄に
    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    と書き、Only run scripts once for all files? に「はい」を選ぶ。
  6. [保存]を押す。

以上の操作により、ログローテーションの記述が完了する。
上述の例は、Webminを使って生成した。

続きを読む

Paq

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

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