Net_POP3とapache james v2.4との相性が悪い件

職場でメンテしているphpアプリの修正に絡んで、POP3サーバから定期的にメールを受信して処理を行うという機能をテストするために apache james を使ったらドはまりしたのでメモ。

apache jamesはjava製メールサーバです。色々と細かい部分までいじれて便利なので、アプリとメールサーバとの連携機能をテストするための仮メールサーバとして使っていました。現在、stable版の最新バージョンは2.3.2です。

jamesの機能や設定方法については下記参照。
James君!〜目次

この使い勝手のいいJamesですが、phppearモジュールにあるNet_POP3と非常に相性が良くないことが判明・・・というか、ログイン出来ない。
クライアント側からtelnetコマンドを使って、サーバの110番ポートからjames POP3サーバへアクセスすると問題なく認証が通りますが、Net_POP3::login()メソッド経由で認証しようとすると成功しません。

原因

Net_POP3は認証処理を行う際に

  1. 内部的にCAPAコマンドを実行して利用可能な認証方法リストを取得する
  2. loginメソッドの第三引数で認証方法を指定されている場合、指定された認証方法が1で取得した方法に含まれていれば、その認証方法を使用してログイン。指定されていない場合、1で取得した認証方法でログイン。

という手順で認証を行います(手元環境のNet_POP3 v1.3.8のソースを確認)。

ところが、James v2.3.2はCAPAコマンドをサポートしていないために、loginメソッドで認証方法を指定しようがしまいが1の段階で認証方法を取得できず、結果としてエラーと成るようです。

一応、James v3.0-M1 でCAPAコマンドがサポートされるように成っていますが、v2台とは設定ファイルの構成も大きく異なり、これまでカスタマイズした部分を簡単に移行できないのが悩みどころ。