qmail の SMTP-AUTH 対応

うちで契約しているプロバイダが SMTP を遮断していたので、自宅鯖のメールサーバから送るメールは smptroutes ですべてプロバイダのMTAを経由して送るようにしていた。
ところがプロバイダのメールサーバが SMTP-Auth 必須になったため、自宅鯖からメール送信できなくなった。

調べてみると、qmail にパッチを当てて SMTP-Auth 対応にした qmail-remote で送信する必要があるとのこと。
下記手順でパッチを当てリビルドした qmail-remote をインストールした。

$ apt-get install qmail-src
$ build-qmail

ソースを展開したところで、別のターミナルを開く。
ソースにパッチを適用する。

$ cd; mkdir work; cd work
$ wget http://tomclegg.net/qmail/qmail-smtpd-auth-0.31.tar.gz
$ wget http://tomclegg.net/qmail/qmail-smtpd-auth-close3.patch
$ wget http://tomclegg.net/qmail/qmail-remote-auth.patch
$ tar xzf ../archives/qmail-smtpd-auth-0.31.tar.gz
$ cd /tmp/qmail/qmail-1.03/
$ cp -i ~/work/qmail-smtpd-auth-0.31/base64.? .
$ patch < ~/work/qmail-smtpd-auth-0.31/auth.patch
$ patch < ~/work/qmail-smtpd-auth-close3.patch
$ patch < ~/work/qmail-remote-auth.patch

元のターミナルに戻って、コンパイル実行。
debパッケージができるので、インストールする。

ファイル /var/qmail/control/smtproutes が無ければ新規に作成し、下記の二行を追加する。
パスワードを直書きするので、ファイルのパーミッションには注意すること。

#【プロバイダMTAホスト名】:【ポート】 【ユーザ名】 【パスワード】

smtp.example.jp
587 myuser secretpass

さるさる日記 - 2010/11/08 (月) qmail with remote SMTP-Auth patch

うちも Debian だが、上記の手順通りやると、「~/work/qmail-smtpd-auth-0.31/auth.patch」でエラーになってしまったので、以下の様に直しコンパイルした。

Makefile

open.a sig.a case.a env.a stralloc.a alloc.a strerr.a substdio.a error.a str.a \
fs.a auto_qmail.o base64.o socket.lib
./load qmail-smtpd qregex.o rcpthosts.o commands.o timeoutread.o \
timeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o \
received.o date822fmt.o now.o qmail.o cdb.a fd.a wait.a \
datetime.a getln.a open.a sig.a case.a env.a stralloc.a \
alloc.a strerr.a substdio.a error.a str.a fs.a auto_qmail.o base64.o `cat \
socket.lib`

コンパイル→インストールし、動作確認をしてみたがうまく行かない。以下のようなエラーメールが返ってくる。

Hi. This is the qmail-send program at test.com.
I'm afraid I wasn't able to deliver your message to the following addresses.
This is a permanent error; I've given up. Sorry it didn't work out.

:
Connected to 123.123.123.123 but sender was rejected.
Remote host said: 530 5.7.0 Authentication required

      • Below this line is a copy of the message.

   :

パケットキャプチャし、メール送信時のやりとりを見ると、どうも SMTP-Auth 判定のところがうまく行ってないようだった。
パッチ当てしたソースコードを見ると、うちのプロバイダから返ってくる AUTHメカニズムの文字列が想定していないものだったのが原因だった。
以下の様に qmail-smtp.c を直して、再度コンパイルしてインストールすると、無事に送信できるようなった。

qmail-smtp.c

while*1;

ちなみに、自宅鯖のメールサーバが SMTP-Auth対応の必要がなければ、qmail-remote のみの置き換えでOK。

*1:i += str_chr(smtptext.s+i,'\n') + 1) && (i+14 < smtptext.len) && str_diffn(smtptext.s+i+4,"AUTH LOGIN\n",11) && str_diffn(smtptext.s+i+4,"AUTH LOGIN ",11) && str_diffn(smtptext.s+i+4,"AUTH PLAIN LOGIN\n",17) && str_diffn(smtptext.s+i+4,"AUTH PLAIN LOGIN ",17) && str_diffn(smtptext.s+i+4,"AUTH CRAM-MD5 PLAIN LOGIN ",17) && str_diffn(smtptext.s+i+4,"AUTH=LOGIN\n",11) && str_diffn(smtptext.s+i+4,"AUTH=LOGIN ",11