スタッフブログ
なおとです。
メールをPOP3で受信するプログラムを書いていて気づいたことをメモしておきます。 今回はPEARライブラリのNet_POP3を使いました。
loginメソッドはマニュアルの記述が古くて、 誤りがあるようでした。
boolean Net_POP3::login (string $user string $pass boolean $apop)
このようなシグネチャとともに、
string $user - 使用するユーザ名。 string $pass - 使用するパスワード。 boolean $apop - APOP を試みるかどうか。
という説明が見えます。
私はこれを見て、APOPを使わないという意図で3番目のパラメータにはfalseを指定しました。 しかしこのとき予想に反して、「サポートしていない認証方式」という意味のエラーとなってしまいました。
そこでソース(Net/POP3.php)を確認しました。
/** * Performs the login procedure. If there is a timestamp * stored, APOP will be tried first, then basic USER/PASS. * * @param string $user Username to use * @param string $pass Password to use * @param mixed $apop Whether to try APOP first, if used as string you can select the auth methd to use ( $pop3->login('validlogin', 'validpass', "CRAM-MD5"); * Valid methods are: 'DIGEST-MD5','CRAM-MD5','LOGIN','PLAIN','APOP','USER' * @return mixed true on Success/ PEAR_ERROR on error */ function login($user, $pass, $apop = true)
どうやら3番目のパラメータは用法が違っているようです。 実際には、認証方式を文字列で与えるか、もしくtrueを受け取ります。 falseあるいはnullでは上記のエラーになります。 なお、3番目のパラメータを省略することはできて、その場合はtrueもしくは'USER'を指定したときと同じ動作になります。
私はここまでで問題解決できたのですが、他に気になる部分がありました。
//Disabling DIGEST-MD5 for now
検証していないのですが、どうもDIGEST-MD5は使用不可の状態になっている模様です。 APOP認証したいときは、チャレンジ・レスポンス方式のCRAM-MD5を選択することになりそうです。
またついでにエラーハンドリングのための豆知識をひとつ書いておきます。
Net_POP3のメソッドは、loginを除いて、失敗したときに返り値falseを返します。 そしてloginだけはPEAR_Errorオブジェクトを返します。
実際のコーディングでは、loginの返り値だけPEAR::isErrorでチェックして、他は
$ret = $pop3->getSize(); if ($ret === false) { throw new Exception('POP3: cannot get mailbox size.'); }
といったように、返り値をチェックして例外をthrowしなおすという繰り返しにしました。
エラーハンドリングのやり方には種々あると思いますが、もうすこしうまい書き方ができないものかとおもいつつ、こんな形で妥協しています。