自宅に置いてあるウェブサーバ(FreeBSD)に wordpress を入れて blog サービスを運営している。
メールサーバは間に合っているのでこのサーバでメールを受け取る必要はないが、blog にコメントが付いたときにメールで通知するサービスなどは欲しいからメールが送れるようにはしたい。
しかし、プロバイダの OP25B によってこのサーバ自身が直接メールを送ることはできない。
そこで、OP25B の影響がない別のメールサーバにメールを中継してもらうことにする。
MTA では Postfix が設定もわかりやすくてよいと思うが、FreeBSD のベースシステムに組み込まれている MTA はSendmail で、メールを1箇所に中継以来するだけでメールサーバを入れ替えるのも仰々しいので今回は Sendmail で設定してみることにした。
sendmail.cfを作る
Sendmail システムの振る舞いは /etc/mail/sendmail.cf に記述するが、m4 マクロによってこれを生成する仕組みが用意されているのでそれを使うことにする。
/etc/mail に移動すると freebsd.mc というファイルがあってこれがデフォルトの sendmail.cf を生成する m4 マクロ。
/etc/mail には Makefile があって make コマンドで sendmail.cf が作れるようになっている。
とりあえず
#su #make
としてみる。
初回の make では
cp freebsd.mc your.host.name.submit.mc /usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/ /usr/share/sendmail/cf/m4/cf.m4 your.host.name.mc > your.host.name.cf
のように出て、ホスト名.mc というファイルができるので以後これを編集、make して ホスト名.cf を得る。
今回のように特定のメールサーバに中継を依頼するにはSMART_HOSTマクロを設定すればいいよう。
nullclientではメールアドレスの @ 以下が中継を依頼したホスト名に書き換わってしまう。
your.host.name.mc に以下を追記。
dnl your.host.name.mc define(`SMART_HOST', `relay.smtp.server')dnl define(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl FEATURE(`authinfo', `hash /etc/mail/relay-auth') TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN') define(`confAUTH_MECHANISMS', 'EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
m4ではdnl以下はコメント。
行末にdnlをつけているのは、マクロ置換した後 define 文が空行として残らないようにするためで、必要というわけではない。
define(`SMART_HOST’, `relay.smtp.server’)dnl
SMART_HOSTの設定。relay.smtp.server は中継を依頼するサーバ。
cf ファイルでは DSrelay.smtp.server という行になる。
define(`ESMTP_MAILER_ARGS’, `TCP $h 587′)dnl
メールを送るプログラムの引数を指定。
TCPはsendmailに内蔵されているSMTPでメールを送るプログラム。
$hは相手のホスト名で通常はメールアドレスの@以下だけどSMART_HOSTを設定した場合は中継依頼するサーバ。
SMTPの25番で送ったのではOP25Bに引っかかってしまうので配送ポートで送っている。
FEATURE(`authinfo’, `hash /etc/mail/relay-auth’)
SMTP-Authによる認証を使用するのでその設定を呼び出す。
/etc/mail/relay-auth は後で作成。
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN’)
define(`confAUTH_MECHANISMS’, ‘EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN’)dnl
使用する認証システムを指定。
あとは make してできた your.host.name.cf を
# cp your.host.name.cf sendmail.cf # /etc/rc.d/sendmail restart
として sendmail.cf にコピーして、sendmail をリスタートすれば設定が反映される。
ただ、ベースシステムの sendmail をそのまま使っているので SMTP-Auth のモジュールが組み込まれていないと Warning が出る。sendmail を SASL が使えるように設定してリビルドする必要がある。
Sendmail をリビルド
とりあえず SASL が使えるように ports から security/cyrus-sasl2 を入れる。
コンフィグはデフォルトのままでよかった。
次に /etc/make.conf に以下を追記。
# /etc/make.conf SENDMAIL_CFLAGS=-I/usr/local/include -DSASL=2 SENDMAIL_LDFLAGS=-L/usr/local/lib SENDMAIL_LDADD=-lsasl2
sendmail をリビルド。ソースを展開してない場合は csup などで取得、展開しておくこと。
# cd /usr/src/lib/libsmutil # make obj && make depend && make # cd /usr/src/lib/libsm # make obj && make depend && make # cd /usr/src/usr.sbin/sendmail # make obj && make depend && make && make install
再び sendmail をリスタートすると Warning は消えた。
認証データベースを作る
先ほど sendmail.cf に設定した /etc/mail/relay-auth を作る。
/etc/mail/relay-auth に
AuthInfo:your.host.name "U:name" "I:name@your.host.name" "P:password"
のように記述する。I には認証IDを書く。普通はPOPの認証IDと同じなのでドメインまで入れる必要があるかは要確認(eonet.ne.jp では@の代わりに%)。
その後、
# cd /etc/mail # makemap hash relay-auth < relay-auth # chmod 600 relay-auth.db relay-auth
とすると、relay-auth.db ができて認証データベースの作成は完了。パスワードが書かれたファイルなのでパーミッションを 600 にしておく。
中継するサーバを設定
プロバイダが中継を受け入れてくれる場合は以上でメールが送信できるようになるが、そうでない場合は中継を受け入れるサーバを用意しておく必要がある。
自分の環境の場合、こちらも FreeBSD だが MTA は Postfix なので Postfix の場合について書く。
とりあえず ports から security/cyrus-sasl2 を入れる。コンフィグはそのままでよかった。
Postfix を SASL 付きでビルドしていない場合にはコンフィグで SASL を有効にしてリビルドしておく。
/usr/local/etc/postfix/main.cf を修正。
smtpd_sasl_auth_enable=yes smtpd_sasl_security_options=noanonymous smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_recipient_restrictions はSMTPで送信先のアドレスを受け取ったときに許可するかどうかの設定なので、要は中継を許可するかどうかの設定。
おそらく元からある設定なので、 permit_sasl_authenticated を追記した形になる。
あとは、
# saslpasswd2 -c -u mydomainname myaccount # postfix reload
として relay-auth で設定したのと同じパスワードを設定してやればよい。