sendmailですべてのメールを中継サーバーのSubmission portに送る

BIGLOBEがOutbound Port 25
Blockingをはじめてくれたおかげで、野良サーバーのsendmailがメールの配送ができなくなってしまった。これを回避するためにSubmission
Port(587)にメールを送る様に設定する必要があるが、困ったことにSubmission
Portは一般にSMTP
AUTHで認証される上に、BIGLOBEのSMTPサーバーはFromアドレスがBIGLOBEユーザーでないと中継を拒否しやがる。
前者はsendmail.cfをSMTP AUTH…

BIGLOBEがOutbound Port 25 Blockingをはじめてくれたおかげで、野良サーバーのsendmailがメールの配送ができなくなってしまった。これを回避するためにSubmission Port(587)にメールを送る様に設定する必要があるが、困ったことにSubmission Portは一般にSMTP AUTHで認証される上に、BIGLOBEのSMTPサーバーはFromアドレスがBIGLOBEユーザーでないと中継を拒否しやがる。

前者はsendmail.cfをSMTP AUTHを利用するように設定すれば回避できる。後者は、差出人書き換えはしたくないので、外部でSMTP AUTHで認証すればFromアドレスを問わずに中継してくれるプロバイダーを探したところ、asahi-netが使えることがわかったので、asahi-netを契約した。

で、sendmail.cfの改造。

sendmail.mcに以下の記述を追加する。

define(`SMART_HOST’, `esmtp:[mail.asahi-net.or.jp]’)
define(`RELAY_MAILER_ARGS’, `TCP $h 587′)
define(`ESMTP_MAILER_ARGS’, `TCP $h 587′)

FEATURE(`authinfo’)

SMART_HOSTの設定で、すべてのメールをasahi-netのメールサーバーに転送する様に設定する。そのままではPort 25に接続しようとしてBIGLOBEのフィルタに引っかかってしまうので、次の二行でSubmission Portに接続するようにする。多分、下の一行で十分だと思うが、esmtpでなくsmtpでリレーしないといけない場合に備えて両方書いておく。こう書いてしまうと、外部には587でしか接続しなくなってしまうと思われる。ということは、mailtertableで特定のアドレスだけ転送先を変えるとその先にも587で接続するしかなくなるので、全体のオプションでなく、接続先ごとに接続ポートを書ける様にしてほしいと思うが、まあ、どうせBIGLOBEからは587でしか出れないのであきらめよう。SMTPを25で、ESMTPを587で接続するようにして、BIGLOBE向け配送だけSMTPでBIGLOBEのサーバーに送ってもいいが、ちゃんと動くか確かめるのも面倒なので、全部asahi-netに頼ることにする。

最後の行がSMTP AUTHの認証を利用する設定。この設定を有効にすると、/etc/mail/authmap.dbにある認証情報のハッシュを元に接続先とSMTP AUTHで認証をしてくれる。

さて、このauthinfoを設定する。

まず、touch /etc/mail/authinfoして空ファイルを作成してから、chmod 600 /etc/mail/authinfoしてroot以外読み書き不可にする。セキュリティ上、先にこれをやってから編集すること。

このファイルに認証情報を書く。

AuthInfo:mail.asahi-net.or.jp “U:username” “P:password” “M:CRAM-MD5”

の様に、サーバーのFQDN、username、passwordを平文で記述しておく。最後のCRAM-MD5は暗証化方法だが、これは

telnet mail.asahi-net.or.jp 587

して、EHLO bam-system.ddo.jpとするとどの様な暗証化方法が可能か表示される。それを見るとDIGEST-MD5とCRAM-MD5が使えるみたいなので、ここではCRAM-MD5に設定しておく。

最後に、面倒なので自動化するために、/etc/mail/Makefileにauthinfoのハッシュ化もするように変更を加える。

SENDMAIL_MAP_SRC+= mailertable domaintable bitdomain uucpdomain
genericstable virtusertable access authinfo

最後のauthinfoを書き加えておくと、このファイルに変更があればmakemapでハッシュ化してauthinfo.dbを作成してくれる。

後は、/etc/mailに移動して、make all;make install;make restartで新しい設定でsendmailを有効化する。

うまくいったかどうか、外部からメールを投げてみて、/var/log/maillogで確認する。

FreeBSDのportsでsendmail入れ替えする時

FreeBSDのportsからsendmailを入れると、基本的には/etc/mail/mailer.confのsendmailのパスを/usr/local/sbin/sendmailにしてくれるので、何も変更の必要がないと思っていたら、少しだけ手動で変更する必要があることに気がついた。
/etc/mail/Makefile .if exists(/usr/share/sendmail/cf) SENDMAIL_CF_DIR?=
/usr/share/sendmail/cf SENDMAIL?…

FreeBSDのportsからsendmailを入れると、基本的には/etc/mail/mailer.confのsendmailのパスを/usr/local/sbin/sendmailにしてくれるので、何も変更の必要がないと思っていたら、少しだけ手動で変更する必要があることに気がついた。

/etc/mail/Makefile

.if exists(/usr/share/sendmail/cf)
SENDMAIL_CF_DIR?= /usr/share/sendmail/cf

SENDMAIL?= /usr/sbin/sendmail
MAKEMAP?= /usr/sbin/makemap

Makefile内のsendmail/cfのテンプレートのパスとsendmailおよびmakemapのパスだけは変更されていないので、portsから入れたsendmailのパスに変更する必要がある。

前者は/usr/local/share/sendmail/cfに、後者は/usr/local/sbin/sendmail,makemapに変更する。

後者はともかく、前者は変えておかないともしかするとm4でcfを作るときに最新のcfテンプレートじゃないと新機能が反映しない可能性がある。

ついでに、portsで入れるsendmailのcf周りのドキュメントのパスは以下の通り。

/usr/local/share/sendmail/cf/