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
うちも Debian だが、上記の手順通りやると、「~/work/qmail-smtpd-auth-0.31/auth.patch」でエラーになってしまったので、以下の様に直しコンパイルした。
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 を直して、再度コンパイルしてインストールすると、無事に送信できるようなった。
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