QdsmtpをAUTH LOGINに対応させる

Qdsmtpを使用して以下のようなエラーがでることがあります。

QdSmtp error: HOST:sysmail.ipsism.co.jp doesnot suppoted MY Abalable SMTP AUTH Protocol PLAIN line -&gt; 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 -&gt; 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";
?>

最後に修正したソースをアップしておきます。

ダウンロード

タイトルとURLをコピーしました