postfixはメールを受信しようとした。しかしパッケージが足りない!

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
偉大な発見は、いつでもささいな偶然から生まれるものだ。

そう、今の私のように……。



まあ、別に偉大でも何でもないですが、ここ最近、てゆーか、サーバーをレンタルサーバーからクラウドサーバーに移して以降、うちで運営しているウェブサービスで、クレジット決済会社から決済完了のメールが飛んで来なくなったんですね。

まあ、メールが飛んで来なくても決済が完了したかどうかは管理画面でも確認できるし、運用上は問題ないってことで、まあいいかとか思ってたんですが……。

つい先日、たまたまメールの送受信ログを見ておりまして……そしたら、決済会社からのメールが受信エラーになっているのを発見したんですよ。

そんで初めて気づいたんですわ。これか!とね。

偶然って恐ろしいね。ってか、何で決済会社からメールが飛んで来ないことに対して、ログをちゃんと確かめようって思わなかったんだろうね……自分。



cyrusってやつが足りてなかったようだ

実際、どんなエラーが出ていてメールの受信ができていなかったのかと申しますと、こんなん。

no SASL authentication mechanisms

SASLっていうのは、何かセキュリティに関するあれやこれで……僕も詳しいことはよく分かりません。僕に分かるのは、サーバーでメールの設定をする際に、このSASL認証ってやつを有効にしておくと良いよってことだけです。

とにかく、このSASL関連で何やらエラーが出ているってことが判明しました。

んでまあ、いろいろと調べてみたところ、SASL関連のパッケージでインストールし忘れているとこんなエラーが出ることがあるよっていう情報が手に入りまして、それをやむってしまえば問題は解決ってことらしいんです。

これまたいろいろ調べたところ、「cyrus-imapdなんちゃら」だの「cyrus-saslなんちゃら」だの、必要なパッケージってのは一つじゃないみたい。現時点でサーバーにどれくらいインストールされているかにもよるけど、僕の場合は、10個くらい足りないものがあった。

なんで、ここはまとめて入れてKA・I・KE・TSUだ!

#yum -y install cyrus*

これでオッケー。

実際にテストでクレジット決済してみたんですが、無事に決済されましたよーっていうメールが届きました。

cyrus何たらってやつが何なのかは例によってよう分からんちんなのですが、SASL関連ってことは、セキュリティに関するあれこれだったりするんでしょう。cyrus-imapdってのは、IMAPサーバーに関する何かだと思うけど、やっぱり今度はIMAPサーバーってのが僕には分からないので、何なのかってことはガン無視で行きましょう。うんそれが良い。






ついでにもう一つ

うちのサーバーのメールログには、こんなメッセージが大量に残っている。

fatal: usage: sendmail

もうハンパじゃないくらい残っている。おびただしいほどに残っている。狂おしいほどに残っている。数秒に一回くらいのペースでログが吐き出されてる。

これは前々から気づいてはいたものの、メールの送受信は普通に行なえているから、放っといても問題はないだろうって思って、無視していたんですよ。

でも、そういえばこれが何のエラーだか調べたことなかったなぁと思って、ついでに一応ググってみたんですわ。

そしたらQdmailの問題だったらしく、しかも簡単に修正できるもんだってことが分かりました。



postfixとQdmailを組み合わせて使う場合

sendmailを使っている場合は特に問題ないらしいんですけど、postfixを使ってメールの送受信を行なっている場合、さらにPHPでメールの送信を行なう場合にQdmailを使って送信している場合に、このエラーがログに出るようです。

詳しいことはよく分かんないんですが、Qdmailの中に「isQmail()」っていうメソッドがあって、そこにunixのコマンドを直接叩く処理があるんですね。処理自体は@(エラー制御演算子)がつけてあるんで、別にエラーが起きても気にせず処理を続行してしまうんですが、こっそりログに吐き出されていたと、そういうわけなんです。

なので、このisQmail()の中を書き換えれば、メッセージは出なくなる。

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 ;
}

こんな感じですね。isQmail自体は、だいたい1180行目くらいにあります。

あ、Qdmailのバージョンは1.2.6です。

コメントアウトの箇所を見てみると、「$sendmail_path」っていうのが出て来ているから、きっとsendmailに関する何かを実行しようとしているんじゃないでしょうか。

postfixにはsendmail互換プログラムってやつが用意されているらしいんで互換性は高いみたいなんですけど、でも高いとは言えパーペキに互換しているってわけでもないらしいです。だから何か、その辺で不具合が生じるんでしょう。






postfixを使ってて、メールの送受信が上手くいってないなーって思った時には、この辺の設定を見直してみると良いですよ。

それでも直らなかった場合は……今の僕には解決できないです。すまんです。

まあ、どうせ僕のことだから、またそのうち何かしらの不具合は出て来るでしょうし、そしたらそんときまた記事に興しますわね。
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください