uzullaがブログ

uzullaがブログです。

誰得なQdmail+eximで発生する問題について

PHPで一番マトモにメールを送信できるであろうQdmailライブラリと、実際の所誰が使ってるのかさっぱりしらないeximというMTAをつかうと、問題が発生する件。

最初は空メール動作プログラムで発生しました。

DAEMONから、

------ pipe to |/path/to/import.php
generated by import@example.co.jp ------

exim: malformed debug_selector setting: + or - expected but found "0.1"

というエラーメールが返る。


eximのログには

201x-xx-xx xx:xx:xx xxxxxx-xxxxxx-xx ** |/path/to/import.php R=system_aliases T=address_pipe: return message generated

とかでてる。


あんだこりゃー?eximつかったことねえけど、なんか変な設定されてんのかな?
eximとかよくわかんないし、Postfixとかにしたい…。っていうかこのサーバーがよくわからない東南アジアの業者で、日本語が通じる業者にして欲しい…

などとグチいいつつ、迷うこと30分

よく考えたら、このエラーはPHPからはき出されていることに気付く。
ああ、もしかして俺のPHPコードが悪いのですかね?テスト環境ではうごいたのですけれど(典型的ないいのがれ)


しかし、素直にPHPのエラーログをチェックしても、なにもでてない。なんだこれ。
プログラムがエラーをはき出してるって事か?

しかたないのでprintfデバッグ

おっかけてったら

$mail = new Qdmail();

ここでエラーがでとる。


そう、

$mail->send();

ここではない、sendの前に?送信してないのに?

アッ

そうだ、Qdmailはとっても現実的な実装になっていて、sendmailが「本物か」をチェックしているのだ。
(具体的には、qmailsendmailがクソだともいう)

function isQmail(){
	if(!is_null($this->is_qmail)){
	        return $this->is_qmail;
	}
	$this->is_qmail = false;
	$ret = ini_get ( 'sendmail_path' );
	if(false !== strpos($ret,'qmail')){
	        $this->is_qmail = true;
	}
	$sendmail_path = ini_get('sendmail_path');
	if(false !== @system($sendmail_path.' -d0.1 < /dev/null > /dev/null',$ret)){
	       if(is_array($ret)){
	               $ret = reset($ret);
	       }
	       $code = (int) substr($ret,0,3);
	       if( 100 === $code || 111 === $code){
	               $this->is_qmail = true;
	       }
	}
	
	return $this->is_qmail ;
}

if(false !== @system($sendmail_path.' -d0.1 < /dev/null > /dev/null',$ret)){

わあ、「+ or - expected but found "0.1"」これの0.1は、これだ!

eximの為の実装をしない

eximなんて どレアなMTAの為にどうこうする気もないので、

function isQmail(){
	if(!is_null($this->is_qmail)){
	        return $this->is_qmail;
	}
	$this->is_qmail = false;
	return $this->is_qmail ;
}

うごいた!!

よ!


ごめんなさい

Qdmailは勿論悪くないし、eximもまあそんなよく分からん方法でチェックされてもこまるよね、わるかった。
eximが悪く無いのだから、東南アジアのサーバー業者もわるくない(他でずいぶん悩んでいる最中ではあるが)


ってことで、qmailが悪いし、つまりはdjbが悪い!!