インターネット上でメイルのやり取りをするための規定を SMTP(Simple Mail Transfer Protocol)という。
http://www.puni.net/~mimori/rfc/menu.html
メイルサーバは,MTA(Message Transport Agent)といい, 標準ではTCPの25番ポートでクライアント接続を受け付け, SMTPで決められたやり取りをした上で,クライアントからの メッセージを受け取り,ローカル,あるいは別のメイルサーバへ 配送する。
別のドメイン宛のメイルはSMTPサーバどうしでやりとりをしながら 配送が行なわれる。このときのやりとりの進め方の決まりがSMTPである。 SMTPは単純化すると以下のような順番でのやりとりである。
送信側 | 受信側 | |
---|---|---|
HELO | 自己ホスト名の送出 → | 受理 |
← | OK | |
MAIL FROM | 送信者アドレス → | 受理 |
← | OK | |
RCPT TO | 宛先アドレス → | 受理 |
← | OK | |
DATA | ヘッダを含む本文 → | |
終端記号 | "." だけの行 → | |
← | OK | |
QUIT | → | 受理 |
← | OK |
たとえば,taro@host-A から hanako@host-B に送るときのやりとりの流れ は以下のようになる。
host-Aが送る文字列 | host-Bが送る文字列 |
---|---|
220 host-B SMTP | |
HELO host-A | |
220 host-B SMTP | |
MAIL FROM: taro@host-A | |
250 ok | |
RCPT TO: hanako@host-B | |
250 ok | |
DATA | |
354 go ahead | |
ヘッダと本文 | |
. | |
250 ok | |
QUIT | |
221 host-B |
ヘッダと本文は1行空行を入れて境界とする。
代表的なMTAには以下のものがある。
ここではqmailの
http://qmail.org/netqmail-1.06.tar.gz からソースアーカイブを入手し,コンパイル&インストールする。 このとき,qmail-utmpx.diff が必要になるので同じディレクトリに保存しておく。
cd ~/make fetch -4 http://qmail.org/netqmail-1.06.tar.gz fetch -4 このリンクのURL tar zxpf netqmail-1.06.tar.gz cd netqmail-1.06 cat ../qmail-utmpx.diff | patch ls : :
一般的に README
や INSTALL
というファイルに最初に必要な手順が
書いてあることが多い。
less README less INSTALL See http://lifewithqmail.org/lwq.html
本来はこのページを見て作業を進める。作業手順は
qmailはスーパーユーザ権限で動くプログラムを最小にする というポリシーで設計されている。メイル配送に必要な細かい仕事を 分担する一般ユーザをいくつか作る必要がある。
実際にコンパイルする。
である。このうち1番については「OSによる違いが大きい」, 「面倒だがコピーペーストで終わってしまう」ことから,本講座では 全員分既に完了した状態にしてある。以下では2の作業を行なう。
To create /var/qmail and configure qmail (won't interfere with sendmail): 1. Create the qmail home directory: # mkdir /var/qmail 2. Read INSTALL.ids. You must set up the qmail group and the qmail users before compiling the programs. 3. Compile the programs and create the qmail directory tree: # make setup check 4. Read INSTALL.ctl and FAQ. Minimal survival command: # ./config 5. Read INSTALL.alias. Minimal survival command: # (cd ~alias; touch .qmail-postmaster .qmail-mailer-daemon .qmail-root) # chmod 644 ~alias/.qmail*
この手順に従う。ただし,ここから先はスーパーユーザ権限が要るので ユーザを変更する。
sudo -H -s
スーパユーザでコンパイルとインストールをする。
mkdir /var/qmail make setup check ./config (cd ~alias; touch .qmail-{postmaster,mailer-daemon,root}) chmod 644 ~alias/.qmail-*
最後の ./config
で各種設定ファイルを自動生成している。
すでにこれだけでも動かすのに十分な最低限の設定が終わっている。
これらの設定ファイルを見ていこう。
head /var/qmail/control/*
==> /var/qmail/control/defaultdomain <==
is.koeki-u.ac.jp
==> /var/qmail/control/locals <==
qm200.is.koeki-u.ac.jp
==> /var/qmail/control/me <==
qm200.is.koeki-u.ac.jp
==> /var/qmail/control/plusdomain <==
ac.jp
==> /var/qmail/control/rcpthosts <==
qm200.is.koeki-u.ac.jp
defaultdomain
あまり使われる機会がない。代わりに defaulthost
を
設定する(後述)。
locals
「この」メイルサーバで受け取るべきメイルドメイン。
me
メイルサーバ自身の正式なホスト名を記述しておく。
plusdomain
新規メイルのドメイン部に + があったときに補われるドメイン名。 あまり使われる機会がない。
rcpthosts
外部からSMTP経由でやって来たメッセージの宛先が このファイルに列挙されたものであるときだけそのメッセージを受け取る。 そうでない場合は「不正リレー」として受信を拒否する。
もうひとつ,コマンドラインでメイルを送るときにデフォルトで付ける
メイルドメインを定義する。/var/qmail/control/defaulthost
に
そのホストの名前を書き込む。以下のようにする。
hostname > /var/qmail/control/defaulthost cat !$
これで,defaulhost
ファイルに qmXXX.is.koeki-u.ac.jp
が書き込まれる。
多くのシステムではメイルを配送するコマンドとして
Sendmailを標準的に採用している。FreeBSDも該当し/usr/bin/sendmail
を使うことになっている。sendmailではなくqmailのものを使うように変更する。
/etc/mail/mailer.conf
に「どのような処理にどのコマンドを
使うか」という定義があるのでこのファイルを書き換える。
vi /etc/mail/mailer.conf
1行目を以下のように書き換える。
修正前
sendmail /usr/libexec/sendmail/sendmail send-mail /usr/libexec/sendmail/sendmail
修正後
sendmail /var/qmail/bin/datemail send-mail /var/qmail/bin/datemail
以上で設定ファイルの作成まで完了した。プログラムを起動するための
スクリプトを作成する。/var/qmail/boot
に起動スクリプトの見
本があるので,これをコピーしてから編集する。ファイル名は
/var/qmail/rc
とする。
pushd /var/qmail cp boot/home rc vi rc
/var/qmail/rc
#!/bin/sh Using splogger to send the log through syslog. Using qmail-local to deliver messages to ~/maildir/. exec env - PATH="/var/qmail/bin:$PATH" \ qmail-start ./maildir/ splogger qmail &
変更点は下線で示した部分。
実際に起動してみる。
/var/qmail/rc ps ax PID TT STAT TIME COMMAND 953 ?? SsJ 0:00.25 /usr/sbin/syslogd -s 7206 ?? IsJ 0:00.00 /usr/sbin/sshd 7207 ?? IsJ 0:00.02 sshd: c103000 [priv] (sshd) 7210 ?? SJ 0:00.16 sshd: c103000@ttyp2 (sshd) 7211 p2 SsJ 0:00.07 -zsh (zsh) 17112 p2 SJ 0:00.05 /bin/zsh 18883 p2 IJ 0:00.00 qmail-send 18884 p2 IJ 0:00.00 splogger qmail 18885 p2 IJ 0:00.00 qmail-lspawn ./maildir/ 18886 p2 IJ 0:00.00 qmail-rspawn 18887 p2 IJ 0:00.00 qmail-clean 18893 p2 R+J 0:00.00 ps ax
qmail-send のプロセスがあることを確認する。
自分宛にメイルを送ってみる。配送試験のときにはログファイルを 垂れ流し表示しておくとよい。screen の2つのウィンドウを利用し, 1つにメイルログを表示し,もう片方で送信してみる。
sudo tail -f /var/log/maillog
するmaillog
を表示したウィンドウに戻りログを確認する。たとえば次のようにすると「今月のカレンダー」が自分宛に送れる。
cal | Mail -s calendar c10XXXX
(XXXXは自分の番号)
以下のようなログメッセージが書かれるはずである。
Mar 6 19:33:57 qm200 qmail: 1141641237.791199 new msg 141939
Mar 6 19:33:57 qm200 qmail: 1141641237.791351 info msg 141939: bytes 387 from <root@itl.koeki-u.ac.jp> qp 19139 uid 0
Mar 6 19:33:57 qm200 qmail: 1141641237.794099 starting delivery 1: msg 141939 to local c103000@qm200.is.koeki-u.ac.jp
Mar 6 19:33:57 qm200 qmail: 1141641237.794184 status: local 1/10 remote 0/20
Mar 6 19:33:57 qm200 qmail: 1141641237.840656 delivery 1: success: did_1+0+0/
Mar 6 19:33:57 qm200 qmail: 1141641237.840854 status: local 0/10 remote 0/20
Mar 6 19:33:57 qm200 qmail: 1141641237.841067 end msg 141939
success と出ていれば配送成功だと分かる。実際に配送されるのは
一般ユーザの ~/maildir/new
ディレクトリである。一般ユーザに
戻ってこのディレクトリを確認する。
suspend zsh: suspended sudo -s -H cd (ホームディレクトリに戻る) ls -l maildir/new -rw------- 1 c103000 471 3 6 19:33 1141641237.19142.qm200.is.koeki-u.ac.jp
実際にこのファイルを直接見て,送った内容が正しく届いているか確認する。
less maildir/new/*
個人のメイル配送先を決めるファイルは ~/.qmail
で
その中には ./maildir/
と書かれている。qmailを初めて導入する
ホストのユーザのホームディレクトリには通常 ~/.qmail
も
~/maildir/
も存在しないので,その場合手動で作らなければなら
ない。それには一般ユーザで以下のようにする。
/var/qmail/bin/maildirmake ~/maildir echo ./maildir/ > ~/.qmail
qmail付属のSMTPサーバプログラムqmail-smtpdは,tcpserver経由で 起動する。
smtpdの起動を管理するディレクトリを新規に作成し,そこに移動する。
mkdir /var/qmail/qmail-smtpd cd !$
tcpserver用のアクセス制御ファイルを smtp という名前で作成する。
vi smtp
smtp
127.0.0.1:allow,RELAYCLIENT="" 172.19.5.:allow,RELAYCLIENT="" 172.21.90.10:allow,RELAYCLIENT="" :allow
アクセス制御ファイルをバイナリ形式(smtp.cdb
)に変換する。
PATH=/var/local/bin:$PATH tcprules smtp.cdb tmp < smtp ls -l total 6 -rw-r--r-- 1 root qmail 69 3 7 11:55 smtp -rw-r--r-- 1 root qmail 2166 3 7 11:56 smtp.cdb
qmail-smtpd
起動用シェルスクリプトを作成する。
vi start-smtpd.sh
/var/qmail/qmail-smtpd/start-smtpd.sh
#!/bin/sh PATH=/usr/local/bin:/var/qmail/bin:/bin:/sbin:/usr/bin:/usr/sbin mydir=`dirname $0` uid=`id -u qmaild` gid=`id -g qmaild` cd $mydir exec env - PATH=$PATH \ tcpserver -vR -c40 -p -u $uid -g $gid -x smtp.cdb 0.0.0.0 \ smtp qmail-smtpd 2>&1 | splogger qmail-smtpd &
シェルスクリプトに実行属性を付ける。
chmod +x start-smtpd.sh
このスクリプトを起動するとSMTP(25)ポートで待ち受ける形でsmtpサーバが 上がる。起動前と起動後の待ち受け状態は netstat と telnet で確認できる。
netstat -n -a -p tcp Active Internet connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address (state) tcp4 0 52 172.19.5.200.22 172.21.90.10.57534 ESTABLISHED tcp4 0 0 172.19.5.200.22 *.* LISTEN telnet localhost smtp Trying 127.0.0.1... telnet: connect to address 127.0.0.1: Connection refused telnet: Unable to connect to remote host
./start-smtpd.sh netstat -n -a -p tcp Active Internet connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address (state) tcp4 0 0 172.19.5.200.25 *.* LISTEN tcp4 0 52 172.19.5.200.22 172.21.90.10.57534 ESTABLISHED tcp4 0 0 172.19.5.200.22 *.* LISTEN telnet localhost smtp Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 qm200.is.koeki-u.ac.jp ESMTP quit 221 qm200.is.koeki-u.ac.jp Connection closed by foreign host.
SMTPのプロトコルコマンドについては次回実験する。
実際に外部ホスト(pan)からメイルを送ってみる。 panで起動しているktermのコマンドラインからメッセージを送信する。 Mailコマンドを利用する。
pan% Mail -s test c10XXXX@qm**.is.koeki-u.ac.jp
とどくかな届くかな。
えいやっ。
C-d
最後の行は C-d をタイプする。
リブート後にも起動するよう /etc/rc.local
を
作成する。
vi /etc/rc.local
/etc/rc.local
# # rc.local # # Starting qmail if [ -x /var/qmail/rc ]; then /var/qmail/rc; echo -n ' qmail' fi # Starting qmail-smtpd if [ -x /var/qmail/qmail-smtpd/start-smtpd.sh ]; then /var/qmail/qmail-smtpd/start-smtpd.sh; echo -n ' smtpd' fi