NetBSD で作るメールサーバ

デフォルトの状態

NetBSD/i386 2.0.2 にはデフォルトで Sendmail 8.12.11 が入っており、ネットワークの設定がなされていれば、mail コマンド等でメールを外部に送信することが出来る。この時、送信元のメールアドレスは「ユーザ名@ホスト名.ドメイン名」となる。

mail info@example.co.jp

外部からのメール受信

自分のドメインを管理する DNS サーバに MX レコードで自分のホスト名を登録しても、外部からメールの受信はできない。これはデフォルトの sendmail.cf の元である /usr/share/sendmail/cf/netbsd-proto.mc の末尾にある以下の行の「127.0.0.1」を「0.0.0.0」に、「::1」を「::」に修正する。

DAEMON_OPTIONS(`Family=inet, address=127.0.0.1, Name=MTA, Modifiers=O')dnl
DAEMON_OPTIONS(`Family=inet6, address=::1, Name=MTA6, Modifiers=O')dnl

修正したら、sendmail.cf を再作成して、sendmail を再起動する。

cd /usr/share/sendmail/cf
m4 netbsd-proto.mc > /etc/mail/sendmail.cf
/etc/rc.d/sendmail restart

以後、「ユーザ名@ホスト名.ドメイン名」のメールアドレスでメールを受信することが出来るようになる。

ホスト名を含まないメールアドレス

mail コマンド等で送信する際の送信元メールアドレスを「ユーザ名@ドメイン名」とするには、/usr/share/sendmail/cf/netbsd-proto.mc の MAILER 行の手前に以下の内容を追記する。これらを指定することで、FROM や TO、CC などからホスト名を省いたドメイン名だけに置き換えてくれる。

MASQUERADE_AS(`$m')dnl
FEATURE(`masquerade_envelope')dnl
FEATURE(`allmasquerade')dnl

さらに「ユーザ名@ドメイン名」のメールアドレスでメールを受け取ることが出来るようにするには受信可能なドメインを /etc/mail/local-host-names に追記する。

vi /etc/mail/local-host-names

最後に sendmail.cf を再作成して、sendmail を再起動すれば、これが有効となる。

メールクライアントでのメール受信

POP3/IMAP4 サーバとして、imap-uw をインストールする。pkg_add コマンドで ftp://ftp.jp.netbsd.org/pub/NetBSD/packages/pkgsrc/mail/imap-uw/README.html から、CPU と OS のバージョンに合ったものをダウンロードして指定するか、その URL を控えて指定する。

pkg_add imap-uw-2004c1nb2.tgz

POP3/IMAP4 サーバとして呼び出せるように、/etc/inetd.conf に以下の行を追加する。

imap            stream  tcp     nowait  root    /usr/pkg/libexec/imapd imapd
imaps           stream  tcp     nowait  root    /usr/pkg/libexec/imapd imapd
pop2            stream  tcp     nowait  root    /usr/pkg/libexec/ipop2d ipop2d
pop3            stream  tcp     nowait  root    /usr/pkg/libexec/ipop3d ipop3d
pop3s           stream  tcp     nowait  root    /usr/pkg/libexec/ipop3d ipop3d

inetd を再起動したら、POP3/IMAP4 を使ったメールクライアントでメール受信が出来るようになる。

/etc/rc.d/inetd restart

メールクライアントからメール送信

デフォルトでは外部からメール送信を受け付けないので、メール受信をした後、しばらくメール送信が可能となる「POP before SMTP」方式を使えるようにする。
Poprelay は POP before SMTP を実現する Perl スクリプト。メール受信をした時のログからアドレスを専用のデータベースに加えて指定した時間の間、Sendmail でこのアドレスからのメール送信を受け付けるようにする簡単な常駐プログラム。

Perl のインストール

PerlApache 2.x をインストールすると一緒に導入されるが、単体でインストールする場合は pkg_add コマンドで ftp://ftp.jp.netbsd.org/pub/NetBSD/packages/pkgsrc/lang/perl5/README.html から、CPU と OS のバージョンに合ったものをダウンロードして指定するか、その URL を控えて指定する。

pkg_add perl-5.6.1nb11.tgz
poprelay のダウンロード

poprelay は http://poprelay.sourceforge.net/ からダウンロード出来るが、NetBSD/i386 2.0.2 にはデフォルトでダウンロードする手段が無いので、lynxw3m 等の Web ブラウザをインストールするか、wget などのダウンロードコマンドをインストールして、これでダウンロードする。例えば、wget で行う場合は pkg_add コマンドで ftp://ftp.jp.netbsd.org/pub/NetBSD/packages/pkgsrc/net/wget/README.html から、CPU と OS のバージョンに合ったものをダウンロードして指定するか、その URL を控えて指定し、予め調べておいた poprelay のダウンロード URL を指定してダウンロードを行う。

pkg_add wget-1.9.1nb5.tgz
wget http://keihanna.dl.sourceforge.net/sourceforge/poprelay/poprelay1.5.tar.gz
poprelay のインストール

poprelay の tar.gz ファイルを解凍後、パッケージで導入した Perl のパスに合わせるため、Perl スクリプト poprelayd の先頭にある /usr/bin/perl を /usr/pkg/bin/perl に書き換える。

tar zxvf poprelay1.5.tar.gz
cd poprelay1.5
vi poprelayd

続いて、設定ファイル poprelay.conf を /etc/mail にコピーする。デフォルトではメール受信後、50 時間(3000 分)もメール送信可能になるので、必要に応じて「$timeout_minutes = 3000;」を適切な値に書き変える。

cp poprelay.conf /etc/mail

さらに sendmail 用の設定ファイル poprelay.m4 を /usr/share/sendmail/hack にコピーする。

cp poprelay.m4 /usr/share/sendmail/hack
自動起動の設定

/etc/rc.local に以下の記述を追加し、poprelay が自動的に起動するように設定する。

if [ -f /usr/sbin/poprelayd ]; then
        /usr/sbin/poprelayd -d
fi
Sendmail への追加設定

/usr/share/sendmail/cf/netbsd-proto.mc に poprelay 対応のための記述を追加する。

HACK(`poprelay')dnl

さらに自分自身からのメール送信を受け付けるように /etc/mail/access を以下の内容で作成する。

localhost       RELAY
127.0.0.1       RELAY

poprelay を起動し、sendmail.cf を再作成して、sendmail を再起動すれば、メールクライアントでメール受信をした後はメール送信が可能となる。
尚、poprelay 起動時、メール受信に来たアドレスを記録する /etc/mail/popip.db が自動的に作成され、sendmail 再起動時、/etc/mail/access を元に /etc/mail/access.db が自動的に作成される。

/usr/sbin/poprelay -d
cd /usr/share/sendmail/cf
m4 netbsd-proto.mc > /etc/mail/sendmail.cf
/etc/rc.d/sendmail restart

バーチャルドメイン

自分のドメインを管理する DNS サーバにサブドメインの MX レコードで自分のホスト名を登録すると、そのサブドメインのメールアドレスが使えるようになる。
以下は正引きゾーンファイルの追加例。hogehoge.com のドメインに sub という名前のサブドメインのメールサーバとして bar.hogehoge.com を定義している。

sub     IN      MX 0    bar.hogehoge.com.

このサブドメイン宛てのメールも受け取れるように /etc/mail/local-host-names に以下のように追記する。

sub.hogehoge.com

さらにサブドメインの仮想ユーザが、実在するどのユーザなのかを /etc/mail/virtusertable を作成して定義する。

info@sub.hogehoge.com        foo@hogehoge.com

最後に /usr/share/sendmail/cf/netbsd-proto.mc に、このサブドメインで出したメールの FROM や TO、CC を書き換えないように下記の行を追記する。

MASQUERADE_EXCEPTION(`sub.hogehoge.com')dnl

修正したら、sendmail.cf を再作成して、sendmail を再起動する。
これで info@sub.hogehoge.com でメールを受け取ることが出来、そのメールは実際には foo@hogehoge.com に届くようになる。
メールの送信は foo@hogehoge.com から出す際に、FROM を info@sub.hogehoge.com にするだけでいい。