Feb 07, 2005

SMTP 認証が必要なプロバイダーにメールをリレー
たぶん最近になってのことだと思うんだが、自宅サーバーの smtp サーバー経由でメールを出すと配送できない。以前から AOL など配送できないサイトがあったけど、今日改めて確認したところ全くできてない。
telnet でよその smtp にコネクション張ろうとしてもタイムアウトする。恐らくプロバイダー側で 25ポートをつぶしてるんだと思う。
もちろんプロバイダーが用意している smtp 経由であれば問題なく出せる。なので自宅サーバーからローカル配送以外はすべてプロバイダー指定の smtp に転送するようにしてみた。
が、smtp に認証が必要なので、単に転送しただけでは駄目。
しかもうちのメールサーバーは qmail なので、標準ではそんな気のきいたことはしてくれない。

いろいろ探してみたんだが、それらしきパッチも見当たらないので、ちょっくら改造してみた。いじったファイルは qmail-remote.c ファイル。

改造内容の紹介の前に、ちょっと smtp 認証についておさらい。
通常 smtp コネクションを張ったあと、
HELO というメッセージを送って、250 という返事が帰ってきたら、
MAIL FROM:
ってなメッセージに続きその他のメールヘッダをいくつか送って、さらにメール本文を送る。最後に QUIT メッセージを送ってコネクションを切る。これが一連の流れ。

smtp 認証が必要な場合、HELO メッセージのあと、AUTH LOGIN メッセージを送り、base64 でエンコードされたユーザーアカウントやパスワード情報を送って MAIL FROM... と続いていく。

なので、qmail-remote.c の該当箇所で上記のように追加のメッセージを送るようにしてやればうまくいく。

今回ローカル配送以外はすべてプロバイダーの smtp サーバーに送ることにしたので、ソースコードにハードコーディングしてしまったが、smtproutes ファイルを拡張するなどしてやるといいかもしれない。

で、追加したコードは以下の通り。
 substdio_puts(&smtpto,"HELO ");
  substdio_put(&smtpto,helohost.s,helohost.len);
  substdio_puts(&smtpto,"\r\n");
  substdio_flush(&smtpto);
  if (smtpcode() != 250) quit("ZConnected to "," but my name was rejected");

  //-----< ここから >-----//
  substdio_puts(&smtpto,"AUTH LOGIN\r\n");
  substdio_flush(&smtpto);
  if (smtpcode() != 334) quit("ZConnected to "," but unimplemented");
 
 substdio_puts(&smtpto,"aalkdBDawEshDbsEha2V\r\n" );  <--(1)
  substdio_flush(&smtpto);
  if (smtpcode() != 334) quit("ZConnected to "," but auth login failed");

  substdio_puts(&smtpto,"kabADwoekbs\r\n" );  <--(2)
  substdio_flush(&smtpto);
  if (smtpcode() != 235) quit("ZConnected to "," but authorization failed");
  //-----< ここまで >-----//

  substdio_puts(&smtpto,"MAIL FROM:<");
  substdio_put(&smtpto,sender.s,sender.len);
 
AUTH LOGIN メッセージのあと、2度エンコードした文字列を送っているが((1)と(2)のところ。上のエンコードされた文字列はデタラメです。念のため ^^;)、最初の方がユーザーアカウントとパスワードから作成したもので、2つ目は不明。

この文字列は毎度同じなので、一旦 smtp-auth に対応したメールソフトで認証してみて、そのパケットをモニタしてそこから抜き出した。

と、ずいぶんいんちき?かつ手抜きな改造だが、これでうまくメール配送ができるようになった。まぁプロバイダー変更したりするときに、また書き換えてコンパイルしなきゃいけないけど、そうしょっちゅうあるわけじゃないし ^^;

あ、それから smtproutes ファイルを以下のように書き換える。
:smtp.dokoka.dokoka
全部の配送を上記 smtp に送る、という意味。別途 locals ファイルに指定したドメイン・アドレスへのメールには適用されない。

【追記】
上のエンコード文字列の内容をデコードして中身確認できた。
(1)の方がアカウント名。ただし自分の場合、アカウント名は @ 込みのメールアドレスと同じもので、エンコードするとき途中の @ の前に \ を入れる必要があるようだ。まぁよくあることだ ^^;
(2)の方はパスワード。
ちなみに自分の利用しているプロバイダーは EHLO メッセージを送ると以下のような返事をよこす。
250-AUTH LOGIN PLAIN
ということで、AUTH コマンドに LOGIN を指定してる。この場合、パスワードは単に base64 でエンコードしてるだけなので、デコードして簡単に元に戻せる。

認証方法として他に DIGEST-MD5 なんかをサポートしてるところもあって、その場合は別の方法でエンコード文字列を生成するのでパスワードだだ漏れってことはなくなるらしい。

ってか自分の使ってるプロバイダーってメール受信も単なる pop のみと、もうセキュリティーなんてまるで頭にないって感じ(大手なのに...)。


Related Info.

Comments

ほそかわ wrote:

qmailでsmtp認証方法を探していてここにたどり着きました。
おかげでうまくいきました!ありがとうございます。
Posted on Apr 07, 2007 06:05:20

Add Comments

※下記の単語・フレーズはコメントで使用できません。大文字・小文字は同一視します。
poker, backgammon, tramadol, casino, insurance, loans
JavaScript is required when you submit comment %20%20%3c%61%20%69%64%3d%22%6e%75%63%6c%65%75%73%5f%63%66%22%3e%3c%2f%61%3e %3c%66%6f%72%6d%20%6d%65%74%68%6f%64%3d%22%70%6f%73%74%22%20%61%63%74%69%6f%6e%3d%22%23%6e%75%63%6c%65%75%73%5f%63%66%22%3e %09%3c%64%69%76%20%63%6c%61%73%73%3d%22%63%6f%6d%6d%65%6e%74%66%6f%72%6d%22%3e %3c%69%6e%70%75%74%20%74%79%70%65%3d%22%68%69%64%64%65%6e%22%20%6e%61%6d%65%3d%22%61%63%74%69%6f%6e%22%20%76%61%6c%75%65%3d%22%61%64%64%63%6f%6d%6d%65%6e%74%22%20%2f%3e %3c%69%6e%70%75%74%20%74%79%70%65%3d%22%68%69%64%64%65%6e%22%20%6e%61%6d%65%3d%22%75%72%6c%22%20%76%61%6c%75%65%3d%22%68%74%74%70%3a%2f%2f%6b%69%6d%69%74%61%6b%65%62%6c%6f%67%2e%6e%65%74%2f%69%74%65%6d%2f%36%35%22%20%2f%3e %3c%69%6e%70%75%74%20%74%79%70%65%3d%22%68%69%64%64%65%6e%22%20%6e%61%6d%65%3d%22%69%74%65%6d%69%64%22%20%76%61%6c%75%65%3d%22%36%35%22%20%2f%3e %09%09 %09%09%3c%6c%61%62%65%6c%20%66%6f%72%3d%22%6e%75%63%6c%65%75%73%5f%63%66%5f%62%6f%64%79%22%3eコメント%3a%3c%2f%6c%61%62%65%6c%3e %09%09%3c%74%65%78%74%61%72%65%61%20%6e%61%6d%65%3d%22%62%6f%64%79%22%20%63%6c%61%73%73%3d%22%66%6f%72%6d%66%69%65%6c%64%22%20%63%6f%6c%73%3d%22%34%30%22%20%72%6f%77%73%3d%22%31%30%22%20%69%64%3d%22%6e%75%63%6c%65%75%73%5f%63%66%5f%62%6f%64%79%22%3e%3c%2f%74%65%78%74%61%72%65%61%3e %09%09%3c%6c%61%62%65%6c%20%66%6f%72%3d%22%6e%75%63%6c%65%75%73%5f%63%66%5f%6e%61%6d%65%22%3eお名前%3a%3c%2f%6c%61%62%65%6c%3e %09%09%3c%69%6e%70%75%74%20%6e%61%6d%65%3d%22%75%73%65%72%22%20%73%69%7a%65%3d%22%34%30%22%20%6d%61%78%6c%65%6e%67%74%68%3d%22%34%30%22%20%76%61%6c%75%65%3d%22%22%20%63%6c%61%73%73%3d%22%66%6f%72%6d%66%69%65%6c%64%22%20%69%64%3d%22%6e%75%63%6c%65%75%73%5f%63%66%5f%6e%61%6d%65%22%20%2f%3e %09%09%3c%6c%61%62%65%6c%20%66%6f%72%3d%22%6e%75%63%6c%65%75%73%5f%63%66%5f%6d%61%69%6c%22%3eウェブサイト%3a%3c%2f%6c%61%62%65%6c%3e %09%09%3c%69%6e%70%75%74%20%6e%61%6d%65%3d%22%75%73%65%72%69%64%22%20%73%69%7a%65%3d%22%34%30%22%20%6d%61%78%6c%65%6e%67%74%68%3d%22%36%30%22%20%76%61%6c%75%65%3d%22%22%20%63%6c%61%73%73%3d%22%66%6f%72%6d%66%69%65%6c%64%22%20%69%64%3d%22%6e%75%63%6c%65%75%73%5f%63%66%5f%6d%61%69%6c%22%20%2f%3e %09%09%3c%6c%61%62%65%6c%20%66%6f%72%3d%22%6e%75%63%6c%65%75%73%5f%63%66%5f%65%6d%61%69%6c%22%3eメール%3a%3c%2f%6c%61%62%65%6c%3e %09%09%3c%69%6e%70%75%74%20%6e%61%6d%65%3d%22%65%6d%61%69%6c%22%20%73%69%7a%65%3d%22%34%30%22%20%6d%61%78%6c%65%6e%67%74%68%3d%22%31%30%30%22%20%76%61%6c%75%65%3d%22%22%20%63%6c%61%73%73%3d%22%66%6f%72%6d%66%69%65%6c%64%22%20%69%64%3d%22%6e%75%63%6c%65%75%73%5f%63%66%5f%65%6d%61%69%6c%22%20%2f%3e %09%09 %09%09%3c%69%6e%70%75%74%20%74%79%70%65%3d%22%63%68%65%63%6b%62%6f%78%22%20%76%61%6c%75%65%3d%22%31%22%20%6e%61%6d%65%3d%22%72%65%6d%65%6d%62%65%72%22%20%69%64%3d%22%6e%75%63%6c%65%75%73%5f%63%66%5f%72%65%6d%65%6d%62%65%72%22%20%20%2f%3e %09%09%3c%6c%61%62%65%6c%20%66%6f%72%3d%22%6e%75%63%6c%65%75%73%5f%63%66%5f%72%65%6d%65%6d%62%65%72%22%3e情報を記憶しておく%3c%2f%6c%61%62%65%6c%3e %09%09%3c%69%6e%70%75%74%20%74%79%70%65%3d%22%73%75%62%6d%69%74%22%20%61%6c%74%3d%22コメントを追加%22%20%76%61%6c%75%65%3d%22コメントを追加%22%20%63%6c%61%73%73%3d%22%66%6f%72%6d%62%75%74%74%6f%6e%22%20%2f%3e %09%3c%2f%64%69%76%3e %3c%69%6e%70%75%74%20%74%79%70%65%3d%22%68%69%64%64%65%6e%22%20%6e%61%6d%65%3d%22%6e%70%5f%70%72%6f%74%65%63%74%62%79%6d%64%35%22%20%76%61%6c%75%65%3d%22%64%63%30%38%30%65%33%62%39%64%65%39%38%63%62%61%38%37%33%34%33%61%37%37%39%62%31%36%63%34%31%66%22%3e %3c%69%6e%70%75%74%20%74%79%70%65%3d%22%68%69%64%64%65%6e%22%20%6e%61%6d%65%3d%22%6e%70%5f%70%72%6f%74%65%63%74%62%79%6d%64%35%5f%68%61%73%68%22%20%76%61%6c%75%65%3d%22%39%39%64%33%62%38%61%32%39%64%34%37%64%36%31%61%66%63%30%38%62%39%31%30%34%30%66%37%63%64%61%37%22%3e %3c%2f%66%6f%72%6d%3e %20%20

OpenID を使ってログインすることができます。

Identity URL:

Trackbacks

トラックバック
このエントリにトラックバックはありません
このトラックバックURLを使ってこの記事にトラックバックを送ることができます。 もしあなたのブログがトラックバック送信に対応していない場合にはこちらのフォームからトラックバックを送信することができます。.
visitor stats