FreeBSDマシンでsendmailを使ってメールサーバとし、Windowsなパソコンで、メール送信サーバとしてそのFreeBSDマシンを指定していると、メール送信時に、「サーバに接続中」みたいなメッセージを表示したまま、5秒間くらい待たされる、という奇妙な症状が見られていました。
Windowsパソコン
メールソフト
↓
↓
↓
↓
FreeBSD
sendmail
- メールを書き、送信ボタンを押す
- 接続中・・・となったまま、5秒くらい待たされる
- 送信処理がはじまる(すぐ終わる)
Mozilla Thunderbirdでも、Outlook Expressでも同じように5秒待たされるので、Windows側の問題ではなさそう?
これまで、「気のせい、気のせい」(笑)って言ってごまかして、見なかったことにしていたのですが・・・
「気のせいじゃないよ」、と突っ込まれてしまったので、ちゃんと調べてみました。
・・・で、tcpdumpしたら、すぐわかりました。
- Windowsから、sendmailにSMTPでconnectした直後、sendmailが、identでWindowsに問い合わせを行う。
- ところが、Windowsはidentには応答しない。
- sendmailは、identの結果を、5秒間のタイムアウトをするまで、待ちつづける。
というわけで、謎の5秒の原因が、あっさりとわかりました。もしかすると、Windows XP SP2で、Windowsファイアウォールを使っていると、identになんにも返事をしないので、タイムアウトまで待たされるのかもしれません。ああ!なので、自宅では、まったく気がつかなかったのかもしれません(???)。
で、ど う し よ う か な と考えて・・・
identなんて、たいして役に立たないから、使うのやめちゃえ
ってことにしました。
sendmail.cfを作る元となる「*.mc」ファイルに、
define(`confTO_IDENT',`0s')
と書いて、identのタイムアウト時間に0秒を指定する(=identを使わない)といいらしいです。
ちなみに、sendmail.cfでは
O Timeout.ident=0s
と指定するようです。*.mcファイルのほうが、*.cfよりも、書き方がハナモゲラなのは、なんだかなぁ~って感じがします。
FreeBSDの場合、*.mcファイルは、「/etc/mail/」ディレクトリの中に、「ホスト名.mc」というファイル名で作ることになっています。なければ、「freebsd.mc」を「ホスト名.mc」という名前でコピーして使います。
cd /etc/mail
(「ホスト名.mc」ファイルを書き換える)
make
make install
/etc/rc.d/sendmail restart
ってやればOKです。具体的には、以下のようなかんじになります。
# make
/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/ /usr/share/sendmail/cf/m4/cf.m4
ホスト名.mc > ホスト名.cf
# make install
install -m 444 ホスト名.cf /etc/mail/sendmail.cf
install -m 444 ホスト名.submit.cf /etc/mail/submit.cf
# /etc/rc.d/sendmail restart
Stopping sendmail.
Waiting for PIDS: 22504.
Stopping sendmail_clientmqueue.
Starting sendmail.