明日から夏休み・・・じゃなかった GW の代休を2日分取って4連休なので、Libretto L1
のメール環境整備。POP と mutt の設定はしてたけどSMTP の設定をしてなかった。
# 夏休みは別に取るぞ。秋になるか、冬になるか分からんが。
最初、ネットワークにさえつながっていればローカルの sendmail
(/usr/sbin/sendmail) コマンドで送信できるだろ、と、.muttrc に
set sendmail="/usr/sbin/nomail"
と書いてみたのだが、相手ホストによっては送れない場合がある。
エラーメールによれば、ホスト名が localhost.localdomain になってたから拒否されてたと(^^;
sendmail の設定をちゃんとすればいいのかもしれんが、ダイアルアップで毎回
IP が変わるし、ホストによっては正引きと逆引きが一致しないと受け取ってくれないところもあるらしい。
そこらへんをちゃんとやるのは大変そうだな・・・てことで、会社で管理してる某メールサーバを
POP before SMTP 対応にしてみた。
Google で「postfix pop before smtp」で検索して「Postfixとpop-before-smtp関連メモ」にあった、
todd-pop-before-smtp-1.2.tar.gz というのでやってみる。
インストールに先立って、Perl のモジュールを二つほど追加。
todd-pop-before-smtp-1.2.tar.gzを展開して、pop-before-smtp を /usr/local/bin にコピー。popbsmtp.init を /etc/rc.d/init.d にコピー。
popbsmtp.init は、
< pgm=/usr/local/bin/$progname
> pgm=/usr/sbin/$progname
と変更。 chkconfig --add popbsmtp.init で起動時に起きるように設定。
Postfix 側の設定は、main.cf に
smtpd_recipient_restrictions = permit_mynetworks,
check_client_access hash:/etc/postfix/pop-before-smtp,
check_relay_domains
を追加。
pop-before-smtp が /var/log/maillog を監視して DB に保存。
Postfix は DB を参照して、POP 認証を通ったIPアドレスからは一定期間
SMTP リレーを受け付ける、という流れ。
と、やってみるが・・・だめ。というか、POP認証を通っても DB が
更新されていないようで。ソースを見てみると
my $pat = '^(... .. ..:..:..) \S+ (?:ipop3d|imapd)\[\d+\]: ' .
'Login user=\S+ host=(?:\S+ )?\[(\d+\.\d+\.\d+\.\d+)\]';
という行がある。これが maillog にマッチしたら DB に登録するようだが、そのサーバで使ってる
POP サーバは ipop3d でも imapd でもなくて、qpopper だった。ログの形式が違うので、マッチしなかった、というオチ。
qpopper のログは
Aug 8 19:28:21 xxxxxx in.qpopper[24576]: Stats: username 0 0 0 0 ****.****.mal.jp.rim.or.jp 202.247.***.***
(一部伏せ字)
のような形式なので、それにマッチするように正規表現を書き換え。具体的には
my $pat = '^(... .. ..:..:..) \S+ (?:in.qpopper)\[\d+\]: ' .
'Stats: \S+ \d+ \d+ \d+ \d+ (?:\S+ )?(\d+\.\d+\.\d+\.\d+)';
こんな風に。