POP Before SMTP

非常に簡略した表現ですが「メールの受信はPOPプロトコル、 メールの送信にはSMTPプロトコル」が使用されます. 自分宛てのメールが届いているかどうかを調べるには POPサーバプログラムが稼動しているマシン(メール受信サーバ、 またはPOPサーバ)に接続して問い合わせをします。 このとき、ユーザ名とパスワードを入力しないとメール受信サーバ に接続できません.

メールを送信するにはメール送信サーバ (SMTPサーバ)に接続してメール送信(配信)を依頼します. ただし、メール送信サーバはユーザ名やパスワード無しでメール送信 を引き受けてしまいます.何も対策しないと、 見知らぬ人のメールでも送ってしまいます.いわゆるSPAMと呼ばれる ゴミメールはこの弱点を悪用しています.大量の宣伝などを他人の メール送信サーバを踏み台にして送る迷惑な存在です.このような 迷惑メールを防ぐために、本メールサーバ(TinyForest.gr.jp)は 「POP Before SMTP」という機能を実装しています.

POP Before SMTPの実装

「POP Before SMTP」とは、自分宛てのメールが届いているか調べないと メールを送信することができない機能です. 「POP Before SMTP」を実現 するにはいくつか方法がありますが、私はDRAC( 詳細)を採用しました。

DRACのコンパイル

DRACはDynamic Relay Authorization Controlの略です. DRACのインストールについては「Software Design」誌の 1999年5月号に説明があります. 動作原理等の詳細は http://mail.cc.umanitoba.ca/drac/を参照してください.

コンパイルする前にMakefileをREADMEの内容に従って変更する 必要があります.Linuxの場合の変更例が書いてありますので 例に従って変更します.変更したら、
# make
# make install
# make install-man

さらに、/etc/mail/dracd.allowに
 255.255.255.255 127.0.0.1
 255.255.255.255 111.222.333.444
のようにPOP3/IMAPサーバが稼動しているマシンのネットマスクと IPアドレスを書きこみます.これはDRACD(rpc.dracd)とPOP3/IMAP サーバが通信できるようにするためです.標準では、rpc.dracdは POP3/IMAPサーバから受け取ったIPアドレスを30分間保持します. つまり、POP3/IMAPサーバにログインしてから30分以内ならメール を送信できます.

POP3/IMAPプログラムの修正

POP3/IMAPサーバとDRACD(rpc.dracd)は通信をする必要があります. rpc.dracdがPOP3/IMAPサーバとsendmailの間でログイン情報を共有させる ために、dracauth()というライブラリ関数をPOP3/IMAPサーバプログラムの 適切な位置に挿入する必要があります.
POP3/IMAP <-(rpc)-> rpc.dracd <-(DBファイル)-> sendmail
私の場合はPOP3/IMAPサーバとして qpopper(「qpopperのインストールとShadow password(PAM)」参照)を使用していますので qpop253.txt等の指示に従って修正してから再コンパイルしました. このときlibdrac.aがリンクされるように適切な場所に予めコピーしておきます.

sendmail.cfの修正

rpc.dracdの出力をsendmailが利用できるように/etc/sendmail.cfを以下の ように修正しました.
# level 8 config file format
V8/Berkeley
#### DRAC modification by S.K.
Kdrac btree /etc/mail/dracd
...................
SLocal_check_rcpt
Scheck_rcpt
R$* $: $1 $| $>"Local_check_rcpt" $1
...................
# check IP address
R$* $: $&{client_addr}
R$@ $@ OK originated locally
R0 $@ OK originated locally
R$=R $* $@ OK relayable IP address
#### Insertion for DRAC(From Software design 1999/5)
R$* $: $1 $| $(drac $1 $: $)
R$* $| $: $1
R$* $| $+ $@ OK
#### end of insertion
注意:挿入する3行の最初の2行の'$:'と、最後の行の'$@'の前には タブをいれること。

DRACD(rpc.dracd)の起動

dracd-setup.linuxというスクリプトを /etc/rc.d/init.d/dracdにコピーします. 次に
ln -s /etc/rc.d/init.d/dracd /etc/rc.d/rc.3/S99dracd
としてリンクを繋ぎます.後はサーバをリブートすればOKです.