誰得な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が「本物か」をチェックしているのだ。
(具体的には、qmailのsendmailがクソだともいう)
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 ; }
うごいた!!
よ!