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";
?>
最後に修正したソースをアップしておきます。

