#!/usr/bin/perl use strict; use vars qw( $queue_dir $optn $l_optn @l_objt %queue_list %number $line1 $queue_id $type $body $sign $line2 $to $from $subject $date $t $q $line3 $o $o2 $f $s $c $type2 $pid $l_quenum $l_dir @l_rmfile @dir_list $d $l_sign $l_line1 $l_line2 $err ); #----------------------------------------------------------# #Copyright(C)2003 Y.Ohkouchi. All rights reserved. # #queue-admin(for qmail) ver030226.1 # #Build :2003/02/24 # #Update:2003/02/26 # #Home :CounterMaterialFactory(CMF) # # http://cmf.ohtanz.com/ # #Mail :cmf@ohtanz.com # #----------------------------------------------------------# #下記は利用される環境に応じて編集して下さい $queue_dir = '/var/qmail/queue'; $ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin:/var/qmail/bin'; $optn = shift(@ARGV); if ($optn eq '--ls') { &command(0,undef); } elsif ($optn eq '--dn') { &command(1,@ARGV); } elsif ($optn eq '--dt') { &command(2,@ARGV); } elsif ($optn eq '--df') { &command(3,@ARGV); } elsif ($optn eq '--ds') { &command(4,@ARGV); } elsif ($optn eq '--da') { &command(5,undef); } elsif ($optn eq '--db') { &command(6,@ARGV); } elsif ($optn eq '--st') { unshift(@ARGV,0); &command(7,@ARGV); } elsif ($optn eq '--sf') { unshift(@ARGV,1); &command(7,@ARGV); } elsif ($optn eq '--ss') { unshift(@ARGV,2); &command(7,@ARGV); } elsif ($optn eq '--sb') { unshift(@ARGV,3); &command(7,@ARGV); } elsif ($optn eq '--cn') { unshift(@ARGV,4); &command(7,@ARGV); } else { print '|--------------------------------------------------------------------------------|' . "\n"; print '|queue-admin(for qmail) ver030226.1 by Y.Ohkouchi |' . "\n"; print '|--------------------------------------------------------------------------------|' . "\n"; print '| * このスクリプトはqmail-qread、nkf、pidofを使用しています。 |' . "\n"; print '| * qmail稼動中に削除をすることはできませんので事前に停止して下さい。 |' . "\n"; print '| * 一応日本語の検索も可能です。 |' . "\n"; print '| * 著作権は放棄しませんが改変、再配布等は自由です。 |' . "\n"; print '| * このスクリプトを使用したことによる損害等は当方では一切責任を負いません。 |' . "\n"; print '| |' . "\n"; print '| Option |' . "\n"; print '| --ls : メールの一覧を表示します。 |' . "\n"; print '| --cn : 指定したキュー番号のメールを表示します。 |' . "\n"; print '| --st : ヘッダー(To)にマッチしたメールを表示します。 |' . "\n"; print '| --sf : ヘッダー(From)にマッチしたメールを表示します。 |' . "\n"; print '| --ss : ヘッダー(Subject)にマッチしたメールを表示します。 |' . "\n"; print '| --sb : 本文にマッチしたメールを表示します。 |' . "\n"; print '| --dn : 指定したキュー番号のメールを削除します。 |' . "\n"; print '| --dt : ヘッダー(To)にマッチしたメールを削除します。 |' . "\n"; print '| --df : ヘッダー(From)にマッチしたメールを削除します。 |' . "\n"; print '| --ds : ヘッダー(Subject)にマッチしたメールを削除します。 |' . "\n"; print '| --db : 本文にマッチしたメールを削除します。 |' . "\n"; print '| --da : キューにあるメールをすべて削除します。 |' . "\n"; print '| |' . "\n"; print '| Example |' . "\n"; print '| 1. queue-admin --ls |' . "\n"; print '| 2. --cn 1111111 2222222 3333333 |' . "\n"; print '| 3. --st aaa@ohtanz.com bbb@ohtanz.com |' . "\n"; print '| 4. --sf aaa@ohtanz.com bbb@ohtanz.com |' . "\n"; print '| 5. --ss aaa bbb ccc |' . "\n"; print '| 6. --sb aaa bbb ccc |' . "\n"; print '| 7. --dn 1111111 2222222 3333333 |' . "\n"; print '| 8. --dt aaa@ohtanz.com bbb@ohtanz.com |' . "\n"; print '| 9. --df aaa@ohtanz.com bbb@ohtanz.com |' . "\n"; print '| 10. --ds aaa bbb ccc |' . "\n"; print '| 11. --db aaa bbb ccc |' . "\n"; print '| 12. --da |' . "\n"; print '|--------------------------------------------------------------------------------|' . "\n"; } exit(0); sub command { local($l_optn,@l_objt) = @_; local(%queue_list); local(%number); if (!open(CMD,"qmail-qread 2>&1 |")) { &error("Can't execution of command.(qmail-qread)"); } while ($line1 = ) { $line1 =~ s/\n$//; $line1 =~ s/\s+/\t/g; if (!$queue_id && $line1 =~ /\t\#([0-9]+)\t/) { $queue_id = $1; next; } if ($queue_id) { if ($line1 =~ /^\t(local|remote)\t(.+)$/i) { $type = $1; if (!open(NKF,"nkf -me $queue_dir/mess/*/$queue_id 2>&1 |")) { &error("Can't execution of command.(nkf)"); } $body = ""; $sign = 0; while ($line2 = ) { if (!$sign) { if ($line2 =~ /^To: (.+)$/) { $to = $1; $to =~ s/\n$//; } elsif ($line2 =~ /^From: (.+)$/) { $from = $1; $from =~ s/\n$//; } elsif ($line2 =~ /^Subject: (.+)$/) { $subject = $1; $subject =~ s/\n$//; } elsif ($line2 =~ /^Date: (.+)$/) { $date = $1; $date =~ s/\n$//; } elsif ($line2 =~ /^\n/) { $sign = 1; next; } } else { $body .= $line2; } } close(NKF); $queue_list{$type}{$queue_id} = "$to\t$from\t$subject\t$date\t$body"; } $queue_id = undef; } } close(CMD); if (!$l_optn) { foreach $t (keys(%queue_list)) { foreach $q (sort { $a <=> $b } keys %{ $queue_list{$t} }) { my($l_to,$l_from,$l_subject,$l_date,$l_body) = split(/\t/,$queue_list{$t}{$q}); print "----------------------------------------\n"; print "Type : $t\n"; print "Number : $q\n"; print "To : $l_to\n"; print "From : $l_from\n"; print "Subject : $l_subject\n"; print "Date : $l_date\n"; $number{$t} += 1; } } $number{'remote'} = 0 if !$number{'remote'}; $number{'local'} = 0 if !$number{'local'}; print "----------------------------------------\n"; print "remote : $number{'remote'}\n"; print "local : $number{'local'}\n"; } elsif ($l_optn == 1) { &error("queue number isn't inputted.") if !$l_objt[0]; &error("qmail isn't shutdown.") if !&pid_check; foreach $q (@l_objt) { my @rm_file = &dir_check($q,undef); foreach $line3 (@rm_file) { if (-e $line3) { unlink($line3); print "delete : $line3\n"; } else { print "$line3\n"; } } } } elsif ($l_optn == 2) { &error("mail address isn't inputted.") if !$l_objt[0]; &error("qmail isn't shutdown.") if !&pid_check; foreach $t (keys(%queue_list)) { foreach $q (sort { $a <=> $b } keys %{ $queue_list{$t} }) { my($l_to,$l_from,$l_subject,$l_date,$l_body) = split(/\t/,$queue_list{$t}{$q}); foreach $o (@l_objt) { if (index($l_to,$o) >= 0) { my @rm_file = &dir_check($q,$t); foreach $line3 (@rm_file) { if (-e $line3) { unlink($line3); print "delete : $line3\n"; } else { print "$line3\n"; } } } } } } } elsif ($l_optn == 3) { &error("mail address isn't inputted.") if !$l_objt[0]; &error("qmail isn't shutdown.") if !&pid_check; foreach $t (keys(%queue_list)) { foreach $q (sort { $a <=> $b } keys %{ $queue_list{$t} }) { my($l_to,$l_from,$l_subject,$l_date,$l_body) = split(/\t/,$queue_list{$t}{$q}); foreach $f (@l_objt) { if (index($l_from,$f) >= 0) { my @rm_file = &dir_check($q,$t); foreach $line3 (@rm_file) { if (-e $line3) { unlink($line3); print "delete : $line3\n"; } else { print "$line3\n"; } } } } } } } elsif ($l_optn == 4) { &error("subject isn't inputted.") if !$l_objt[0]; &error("qmail isn't shutdown.") if !&pid_check; foreach $t (keys(%queue_list)) { foreach $q (sort { $a <=> $b } keys %{ $queue_list{$t} }) { my($l_to,$l_from,$l_subject,$l_date,$l_body) = split(/\t/,$queue_list{$t}{$q}); foreach $s (@l_objt) { if (index($l_subject,$s) >= 0) { my @rm_file = &dir_check($q,$t); foreach $line3 (@rm_file) { if (-e $line3) { unlink($line3); print "delete : $line3\n"; } else { print "$line3\n"; } } } } } } } elsif ($l_optn == 5) { &error("qmail isn't shutdown.") if !&pid_check; foreach $t (keys(%queue_list)) { foreach $q (sort { $a <=> $b } keys %{ $queue_list{$t} }) { my @rm_file = &dir_check($q,$t); foreach $line3 (@rm_file) { if (-e $line3) { unlink($line3); print "delete : $line3\n"; } else { print "$line3\n"; } } } } } elsif ($l_optn == 6) { &error("body isn't inputted.") if !$l_objt[0]; &error("qmail isn't shutdown.") if !&pid_check; foreach $t (keys(%queue_list)) { foreach $q (sort { $a <=> $b } keys %{ $queue_list{$t} }) { my($l_to,$l_from,$l_subject,$l_date,$l_body) = split(/\t/,$queue_list{$t}{$q}); foreach $b (@l_objt) { if (index($l_body,$b) >= 0) { my @rm_file = &dir_check($q,$t); foreach $line3 (@rm_file) { if (-e $line3) { unlink($line3); print "delete : $line3\n"; } else { print "$line3\n"; } } } } } } } elsif ($l_optn == 7) { &error("ARGV[1] isn't inputted.") if !$l_objt[1]; my $optn2 = shift(@l_objt); if ($optn2 != 4) { $c = 0; foreach $t (keys(%queue_list)) { foreach $q (sort { $a <=> $b } keys %{ $queue_list{$t} }) { my($l_to,$l_from,$l_subject,$l_date,$l_body) = split(/\t/,$queue_list{$t}{$q}); foreach $o (@l_objt) { if (!$optn2 && index($l_to,$o) >= 0) { foreach $o2 (@l_objt) { $l_to =~ s/($o2)/\033[1;32m$1\033[0;39m/g; } print "----------------------------------------\n"; print "[$q] $l_to\n"; $c++; last; } elsif ($optn2 == 1 && index($l_from,$o) >= 0) { foreach $o2 (@l_objt) { $l_from =~ s/($o2)/\033[1;32m$1\033[0;39m/g; } print "----------------------------------------\n"; print "[$q] $l_from\n"; $c++; last; } elsif ($optn2 == 2 && index($l_subject,$o) >= 0) { foreach $o2 (@l_objt) { $l_subject =~ s/($o2)/\033[1;32m$1\033[0;39m/g; } print "----------------------------------------\n"; print "[$q] $l_subject\n"; $c++; last; } elsif ($optn2 == 3 && index($l_body,$o) >= 0) { foreach $o2 (@l_objt) { $l_body =~ s/($o2)/\033[1;32m$1\033[0;39m/g; } print "----------------------------------------\n"; print "[$q]\n"; print "----------------------------------------\n"; print "$l_body\n\n"; print "----------------------------------------\n"; print "please push enter key."; while (1) { my $stdin = ; last if $stdin; } $c++; last; } } } } print "----------------------------------------\n"; print "total : $c\n"; } else { foreach $o (@l_objt) { if ($queue_list{'remote'}{$o}) { $type2 = 'remote'; } elsif ($queue_list{'local'}{$o}) { $type2 = 'local'; } if ($queue_list{$type2}{$o}) { my($l_to,$l_from,$l_subject,$l_date,$l_body) = split(/\t/,$queue_list{$type2}{$o}); print "----------------------------------------\n"; print "Type : $type2\n"; print "Number : $o\n"; print "To : $l_to\n"; print "From : $l_from\n"; print "Subject : $l_subject\n"; print "Date : $l_date\n"; print "----------------------------------------\n"; print "$l_body\n"; print "----------------------------------------\n"; print "please push enter key."; while (1) { my $stdin = ; last if $stdin; } } } } } return; } sub pid_check { if (!open(CMD,"pidof qmail-send 2>&1 |")) { &error("Can't execution of command.(pidof)"); } $pid = ; $pid =~ s/\s+//g; close(CMD); if ($pid) { return(0); } return(1); } sub dir_check { local($l_quenum,$l_dir) = @_; local(@l_rmfile); local(@dir_list); if ($l_dir) { @dir_list = ("info","mess",$l_dir); } else { @dir_list = ("info","mess","remote","local"); } foreach $d (@dir_list) { $l_sign = 0; if (!opendir(DIR1,"$queue_dir/$d")) { return(undef); } while ($l_line1 = readdir(DIR1)) { if ($l_line1 ne '.' && $l_line1 ne '..') { if (!opendir(DIR2,"$queue_dir/$d/$l_line1")) { closedir(DIR1); return(undef); } while ($l_line2 = readdir(DIR2)) { if ($l_line2 ne '.' && $l_line2 ne '..') { if ($l_line2 eq $l_quenum) { push(@l_rmfile,"$queue_dir/$d/$l_line1/$l_line2"); $l_sign = 1; last; } } } closedir(DIR2); } last if $l_sign; } closedir(DIR1); } return(@l_rmfile); } sub error { local($err) = shift; print "$err\n"; exit(0); }