qmail-sendログ整形PHPスクリプト

必要に迫られてqmail-sendのログを整形して出力するPHPスクリプトを作成しました。
プログラミングのセンスが無いので、ソースコードが綺麗ではありませんが…。
※1行目のphp(cli)へのパスは環境に応じて書き換えて下さい。

= PHPスクリプト =

#!/usr/local/bin/php
<?php
  while (($buffer = fgets(STDIN)) !== false) {

    $data = explode(" ", $buffer);
    switch( $data[ 2 ] ) {
      case "new":
           $msgid = trim(trim($data[ 4 ]), ':');
           $msg[ $msgid ] = array();
           break;
      case "info":
           $msgid = trim(trim($data[ 4 ]), ':');
           $email = $data[ 8 ] == '<>' ? $data[ 8 ] : trim($data[ 8 ], '<>');
           $msg[ $msgid ][ "FROM" ] = array("DATE" => $data[ 0 ],
                                            "TIME" => substr($data[ 1 ], 0 ,8),
                                            "MAIL" => $email);
           break;
      case "starting":
           $msgid = trim(trim($data[ 6 ]), ':');
           $did = trim(trim($data[ 4 ]), ':');
           $org_email = trim($data[ 9 ]);
           $did_to_msgid[ $did ] = $msgid;
           switch ( $data[ 8 ] ) {
             case "local":
               $domain = explode("@", $org_email);
               $email = str_replace( $domain[ 1 ]."-", "", $org_email);
               $delivery_flag = 'L';
               break;
             case "remote":
               $email = trim($org_email, "<>");
               $delivery_flag = 'R';
               break;
           }
           $msg[ $msgid ][ "TO" ][ $did ] = array("DATE" => $data[ 0 ],
                                                  "TIME" => substr($data[ 1 ], 0, 8),
                                                  "LR"   => $delivery_flag,
                                                  "MAIL" => $email);
           break;
      case "delivery":
           $did = trim(trim($data[ 3 ]), ':');
           $msgid = $did_to_msgid[ $did ];
           $msg[ $msgid ][ "TO" ][ $did ][ "STATUS" ] = trim(trim($data[ 4 ]), ':');
           $msg[ $msgid ][ "TO" ][ $did ][ "ERROR" ] = trim(trim($data[ 5 ]), ':');
           break;
      case "end":
           $msgid = trim(trim($data[ 4 ]), ':');
           foreach ( $msg as $key1=>$val1)
           {
             if ($key1 == $msgid) {
               printf("MSG: %s\n", $msgid);
               foreach ( $val1 as $key2=>$val2 ) {
                 switch( $key2 ) {
                   case "FROM":
                        printf(" %10s %8s From : %-50s\n", $val2["DATE"], $val2["TIME"], $val2["MAIL"]);
                        break;
                   case "TO":
                        foreach ( $val2 as $key3=>$val3 ) {
                          printf(" %10s %8s To(%s): %-50s", $val3["DATE"], $val3["TIME"], $val3["LR"], $val3["MAIL"]);
                          if ( $val3["STATUS"] == "success" ) {
                            printf("%s\n", $val3["STATUS"]);
                          } else {
                            printf("%s %s\n", $val3["STATUS"], $val3["ERROR"]);
                          }
                        }
                        break;
                 }
               }
             }
           }
           unset($msg[ $msgid ]);
           printf("\n");
           break;
    }

  }
?>

= 使い方 =
qmail-sendのログをローカル日付に変換してから、PHPスクリプトの標準入力へパイプで流し込みます。
“chmod +x”でPHPスクリプトに実行権を付与していないとエラーになりますのでご注意下さい。
内部管理番号同士で紐付けして、リスト形式で表示します。

$ cat /var/log/qmail/send/current | tai64nlocal | path/to/translog.php
MSG: 106103476
 2015-07-29 11:20:08 From : [email protected]
 2015-07-29 11:20:08 To(L): [email protected]                           success
 2015-07-29 11:20:08 To(L): [email protected]                           success
 2015-07-29 11:20:08 To(R): [email protected]                           failure Sorry,_no_mailbox_here_by_that_name.