Postfix mail tools in bash

Инструменти за анализ и статистика на Postfix мейл сървъра в bash среда

Postfix е вече може би най изпозлвания пощенски сървър в Интернет. Създаден да бъде алтернатива на Sendmail той отнавна мина опонента си. За Postfix има всякаква документация от рода на как да го инсталираме (ако вече не е инсталиран), как да го конфигурираме ако това също не е направено. Но търсенето на проблеми и въобще наблюдението на сървъра на по ниско ниво е слабо документирано. С времето събрах набор от команди, трикчета и скриптове които да улесняват процеса по търсене на определен проблем в пощенския сървър и по специално в ISPconfig платформата.

Send message

Изпращане на мейл директно от терминал

echo "Message Body" | mail -s "Message Subject" support@itservice-bg.net

Mail log

Следене на лога в реално време

sudo tail -f /var/log/mail.log

Mail log color

Преглеждайки в реално време логовете на мейл сървъра postfix редовете вървят много бързо и често са еднообразни, а малко да са ми уморени очите и не мога да проследя информацията която ме интересува. Затова сглобих малко скриптче което оцветява най важните параметри които ми подзказват къде да гледам с което става доста по интуитуитивен самият процес.

#!/bin/bash
 
shopt -s expand_aliases
alias grey-grep="GREP_COLOR='1;30' grep -E --color=always --line-buffered"
alias red-grep="GREP_COLOR='1;31' grep -E --color=always --line-buffered"
alias green-grep="GREP_COLOR='1;32' grep -E --color=always --line-buffered"
alias yellow-grep="GREP_COLOR='1;33' grep -E --color=always --line-buffered"
alias cyan-grep="GREP_COLOR='1;36' grep -E --color=always --line-buffered"
 
tail -f -n 100 /var/log/mail.log | \
grey-grep -w "postfix|dovecot|$" | \
red-grep -w "unknown|lost|Aborted|disconnect|Disconnected|reject|denied|rejected|timeout|NOQUEUE|discarded|spam|failed|error|RCPT|$" | \
green-grep -w "done|Ok|sent|relay|delay|queued|queue|active|delays|dsn|$" | \
yellow-grep -w "Login:|connect|user|from|to|$" | \
cyan-grep -w "imap-login|pop3-login|smtpd|smtp|qmgr|cleanup$"

Оцветяването на ключови думи в един цвят обаче може да се осъществи и с командата egrep.

egrep '(reject|warning|error|fatal|panic):' /var/log/mail.log

Mail queue

Показва опашката с неизпратени писма

sudo mailq

На горната картинка подчертаното с червено е уникален идентификатор на писмото. С програмата postcat може да се прегледа съдържанието на писмото. В много случаи да не кажа в повечето съдържанието е криптирано но за един системен администратор часта “header” е по важна от часта “body”. В “хедъра” се съдържа информация от кой, за кой е писмото, сървъра от който пристига и много други неща.

postcat -vq 336B22E045C6

Изтрива опашката с неизпратени писма

sudo postsuper -d ALL

Mail statistic

Показва всички пощенски кутии от които са пристигнали писма и броя им

sudo grep 'from=<' /var/log/mail.log | grep 'qmgr' | awk '{print $7}' | sed -r 's/^.*=<(.*?)>.*$/\1/' | sort | uniq -c | sort -n

Показва всички изпращачи от лога и броя писма

grep "status=sent" /var/log/mail.log |cut -d "=" -f 2 |cut -d ">" -f 1 |cut -d "<" -f 2 | sort | uniq -c | sort -n

Показва дните в лога

sudo cat /var/log/mail.log | awk '{print $1,$2}' | uniq

Този адрес изпращал ли е писмо

sudo grep 'from=<support@itservice-bg.net>' /var/log/mail.log

Този адрес изпращал ли е писмо на другия адрес

sudo grep 'from=<support@itservice-bg.net>' /var/log/mail.log | grep 'to=<office@itservice-bg.net>' /var/log/mail.log

pflogsumm

pflogsumm е написан, за да предостави анализ на пощенския сървър postfix, с подробната си статистика той показва пълна картина на системния администратор за мейл трафика в съвръра. pflogsumm е един от инструментите които показват зараждането на потенциални проблеми.

Инсталиране на pflogsumm

sudo apt-get install pflogsumm

Детайлна статистика с програмата pflogsumm на postfix сървъра

sudo pflogsumm /var/log/mail.log

Подробна статистика за изпращачи и получатели на писма

sudo pflogsumm -e /var/log/mail.log

Изпраща статистиска чрез cron на всеки 24 часа от мейл сървъра
Отваряме конфигурациония файл sudo nano /etc/crontab и добавяме в него:

59 23  * * *   root pflogsumm -d today /var/log/mail.log | mail -s "pflogsumm itservice" robot@telehost.bg

След което рестартираме cron демона

sudo systemctl restart cron.service

delete Trash, Junk, Spam, Low

Малък скрипт за изтриване принудително на съдържанието в директориите Trash, Junk, Spam и Low на всички потребители в postfix сървъра.

#!/bin/bash
 
MAILDIRS=$(find /var/vmail/*/*/Maildir/ -maxdepth 0 -type d)
for basedir in $MAILDIRS; do
  for dir in .Trash .Junk .Spam .Low\ Priority; do
    for dir2 in cur new; do
      [ -e "$basedir/$dir/$dir2" ] && (
        echo "Processing $basedir/$dir/$dir2..."
        find "$basedir/$dir/$dir2/" -type f -mtime +30 -delete
      )
    done
  done
done
}

pflogrep — Postfix log grep complete activity

Когато за определена пощенска кутия ми трябва подробен анализ и статистика, използвам един малък скрипт на Пърл с име pflogrep

#!/usr/bin/perl
 
use Getopt::Long;
 
($me = $0) =~ s%.*/%%;
 
$Usage = "
$me [-i] [-s] [-v] PATTERN [FILE]....
  -i  -- ignore case distinctions when matching
  -s  -- add separator between messages
  -v  -- selected lines are those not matching
Examples:
  $me info\@example.com mail.log | pflogsumm
  $me example.com mail.log | grep -e from= -e to= | grep --color -P \\<.*\\>\\|status
";
 
die $Usage unless &GetOptions( 'i', 's', 'v' ) && (@ARGV >= 1 );
 
my $ptn = shift;
my $regex = ( $opt_i ) ?  qr/$ptn/io : qr/$ptn/o;
my %P;
my $found = 0;
 
$exstat = 1;
$|++;
 
sub checkMatch() {
    my $q = shift;
    my $matches = $P{$q} =~ $regex;
    if ( ($matches && !$opt_v) || (!$matches && $opt_v)) {
        print $P{$q};
        print '-' x 50, "\n" if $opt_s;
        $found++;
    }
    undef $P{$q};
}
 
sub handleStream() {
    my $fh = shift;
 
    while (<$fh>) {
        next unless /: (([0-9A-Zb-z]{10,15})|NOQUEUE)/;
        $q = $1;
        $P{$q} .= $_;
        if (/: (removed$|milter-reject:)/ || $q eq 'NOQUEUE') {
            &checkMatch($q);
        }
    }
    foreach my $q (keys %P) {
        &checkMatch($q);
    }
    return $found;
}
 
if (@ARGV==0) {
    $exstat = 0 if &handleStream(\*STDIN);
    exit( $exstat );
}
 
for $f ( @ARGV ) {
    unless ( open( INP, '<', $f )) {
        warn "Unable to open input file $f: $!\n";
        next;
    }
    $exstat = 0 if &handleStream(\*INP);
    close INP;
}
exit( $exstat );

Филтрира определена пощенска кутия и в комбинация с pflogsumm прави анализ и статистика само за нея

sudo ./pflogrep.pl support@itservice-bg.net /var/log/mail.log | pflogsumm

Оцветява определени низове в случая “from=”, “to=” и “status”

sudo ./pflogrep.pl support@itservice-bg.net /var/log/mail.log | grep -e from= -e to= | grep --color -P \<.*\>\|status

Maillog perl script

Също много добър помощник ми е друг скрипт на perl:
https://github.com/SokoloffA/maillog/blob/master/maillog.pl

sudo chmod 755 maillog.pl

Получени писма от този ден към тази пощенска кутия

sudo ./maillog.pl -d 08/10/2017 -t support@itservice-bg.net

Изпратени писма от този ден от тази пощенска кутия

sudo ./maillog.pl -d 09/10/2017 -f support@itservice-bg.net

Read mailbox with Mutt

Четене на пощенска кутия с mutt

sudo apt-get install mutt

Създаваме конфигурационен файл с nano .muttrc

set mbox_type=Maildir
set folder="/var/vmail/itservice-bg.net/support/Maildir"
set mask="!^\\.[^.]"
set mbox="/var/vmail/itservice-bg.net/support/Maildir"
set record="+.Sent"
set postponed="+.Drafts"
set spoolfile="//var/vmail/itservice-bg.net/support/Maildir"

Стартираме mutt

Sudo mutt

Roundcube

Неуспешни опити за логване

sudo cat /var/log/roundcube/errors | grep failed | awk '{print $1,$2,$6,$7,$9,$11}'

Изпратени през Roundcube

cat /var/log/roundcube/sendmail | awk '{print $1,$2,$5,$6,$7,$8,$9}'

Регистрирани посещения на браузъри през лога на Apache

cat /var/log/apache2/other_vhosts_access.log | grep roundcube

Leave a Reply

Your email address will not be published. Required fields are marked *