Qdsmtpを使用して以下のようなエラーがでることがあります。
QdSmtp error: HOST:sysmail.ipsism.co.jp doesnot suppoted MY Abalable SMTP AUTH Protocol PLAIN line -> 407<br> Qdmail error: Qdmail Version 1.2.6b ,PHP Version 5.1.6<br> <br>il error: OS Linux ; PHP Version 5.1.6 ; Qdmail version 1.2.6b <br>ini status: mb_language = Japanese ; mb_internal_encoding = UTF-8 ; mb_detect_order = ASCII,JIS,UTF-8,EUC-JP,SJIS Qdmail Status debug: 0, log: 0, errorlog: 0<br> Qdmail error: No send . Because SMTP mail method replied error line -> 2190<br>
これはQdsmtpがSMTP認証のなかのAUTH PLAINにか対応していないが、
接続しようとしているSMTPサーバーの認証がAUTH PLAINに対応していないことが考えられます。
SMTPサーバーの認証方式を確認する
SMTPサーバーの認証方式を確認するにはtelnetで問い合わせて確認するのが簡単です。
telnetで接続して EHLO locahost と入力しましょう。
telnet xxx.xxx.xxx.xxx 587 として接続できたら EHLO localhost と入力します。 ・・・・ 250-AUTH CRAM-MD5 DIGEST-MD5 LOGIN PLAIN 250-AUTH=LOGIN ・・・
ここでAUTH の後に対応している認証方式が表示されます。
PLAINがなければ個々に実装してあげなくてはいけません。
AUTH LOGINの認証の流れを確認する
今回はAUTH LOGINへの対応方法です。
参考までに、AUTH LOGINの流れをTELNETでも確認します。
★が入力箇所です
//telnetで接続 telnet xxx.xxx.xxx.xxx 587★ //可能な認証方法の確認 EHLO localhost ・・・ 250-AUTH LOGIN 250-SIZE 5120000 250-HELP 250 AUTH=LOGIN ・・・ //auth loginで認証する auth login★ 334 VXNlcm5hbWU6 //Username:をbase64でエンコードした値が返る [ユーザー名をbase64で入力]★ 334 UGFzc3dvcmQ6 //Password:をbase64でエンコードした値が返る [パスワードをbase64で入力]★ 235 Authenticated
AUTH LOGIN対応
以下qdsmtp.phpの修正。
・・・ //UPD-START // var $smtp_auth_kind = array('PLAIN'); var $smtp_auth_kind = array('CRAM-MD5','DIGEST-MD5','LOGIN','PLAIN'); //UPD-END ・・・ //ここを修正しないとエラーがでてしまいます。 switch($s){ case 0: // Error //UPD-START //return array( $this->errorGather('Unkown Error :status'.$st.' message:'.htmlspecialchars($_message).' on '.htmlspecialchars($put_message),__LINE__) , $message , $st ); if ($st=="334" or $st=="235"){ $contine=false; }else{ return array( $this->errorGather('Unkown Error :status'.$st.' message:'.htmlspecialchars($_message).' on '.htmlspecialchars($put_message),__LINE__) , $message , $st ); } //UPD-END break; case 3: //22X,220 $contine = true ; break; ・・・ //ATUH LOGINの実装です。 //ADD-START function LOGIN(){ $items = array( array( 'auth login' , null ), ); list( $st , $mes , $com ) = $this->communicate($items); if(!$st){ return 0; } $items = array( array( base64_encode($this->smtp_param['USER']) , null ), ); list( $st , $mes , $com ) = $this->communicate($items); if(!$st){ return 0; } $items = array( array( base64_encode($this->smtp_param['PASS']) , null ), ); list( $st , $mes , $com ) = $this->communicate($items); if(!$st){ return 0; } return 1; } //ADD-END
実装方法はお任せしますが、これでとりあえずAUTH LOGINにも対応できます。
CRAM-MD5やDIGEST-MD5への対応も紹介されているサイトがあるようです。
以下は呼び出しかたのサンプルです。
smtp(true); $param = array( 'host'=>'xxx.co.jp',//メールサーバー。IPでもOK 'port'=> 587 , //これはSMTPAuthの例。 'from'=>return@co.jp', //Return-path 'protocol'=>'SMTP_AUTH',// 認証方式 'user'=>'username', //SMTPサーバーのユーザーID 'pass' => 'passwd', //SMTPサーバーの認証パスワード ); $mail -> smtpServer($param); $message="mesage body"; //メールの本文 $mail ->to('xxxx@xxx.co.jp'); //メールの送信先 $mail ->subject('TEST'); //メールの件名 $mail ->from('xxx@xxx.co.jp'); //メールの送信元 $mail ->text($message); $return_flag = $mail ->send(); echo $return_flag."\n"; ?>
最後に修正したソースをアップしておきます。