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.