#!/usr/bin/perl # # Prints mails to standard output # #### #### Standard inits and get options #### use DBI; use Getopt::Long; $VER="1.5"; @fldnms= ("mail_from","mail_to","cc","date","time_zone","file","sbj","txt"); $fields=8; @mail= (@from,@to,@cc,@date,@time_zone,@file,@sbj,@txt); $opt_user= $opt_password= ""; $opt_socket= "/tmp/mysql.sock"; $opt_port= 3306; $opt_db="mail"; $opt_table="mails"; $opt_help=$opt_count=0; GetOptions("help","count","port=i","db=s","table=s","host=s","password=s", "user=s","socket=s") || usage(); if ($opt_host eq '') { $opt_host = "localhost"; } if ($opt_help || !$ARGV[0]) { usage(); } #### #### Connect and parsing the query to MySQL #### $dbh= DBI->connect("DBI:mysql:$opt_db:$opt_host:port=$opt_port:mysql_socket=$opt_mysql_socket", $opt_user,$opt_password, { PrintError => 0}) || die $DBI::errstr; if ($opt_count) { count_mails(); } $fields=0; $query = "select "; foreach $val (@fldnms) { if (!$fields) { $query.= "$val"; } else { $query.= ",$val"; } $fields++; } $query.= " from $opt_table where $ARGV[0] order by date desc"; #### #### Send query and save result #### $sth= $dbh->prepare($query); if (!$sth->execute) { print "$DBI::errstr\n"; $sth->finish; die; } for ($i=0; ($row= $sth->fetchrow_arrayref); $i++) { for ($j=0; $j < $fields; $j++) { $mail[$j][$i]= $row->[$j]; } } #### #### Print to stderr #### for ($i=0; $mail[0][$i]; $i++) { print "#" x 33; print " " . ($i+1) . ". Mail "; print "#" x 33; print "\nFrom: $mail[0][$i]\n"; print "To: $mail[1][$i]\n"; print "Cc: $mail[2][$i]\n"; print "Date: $mail[3][$i]\n"; print "Timezone: $mail[4][$i]\n"; print "File: $mail[5][$i]\n"; print "Subject: $mail[6][$i]\n"; print "Message:\n$mail[7][$i]\n"; } print "#" x 20; print " Summary: "; if ($i == 1) { print "$i Mail "; print "matches the query "; } else { print "$i Mails "; print "match the query "; } print "#" x 20; print "\n"; #### #### Count mails that matches the query, but don't show them #### sub count_mails { $sth= $dbh->prepare("select count(*) from $opt_table where $ARGV[0]"); if (!$sth->execute) { print "$DBI::errstr\n"; $sth->finish; die; } while (($row= $sth->fetchrow_arrayref)) { $mail_count= $row->[0]; } if ($mail_count == 1) { print "$mail_count Mail matches the query.\n"; } else { print "$mail_count Mails match the query.\n"; } exit; } #### #### Usage #### sub usage { print <