Monday, July 7, 2014

Перлюстрация почты. Заметка 2.

Итак, вся почта, отправляемая сотрудниками, складывается в каталог /var/mail/mailarchive, о чем мы написали в файле /etc/exim4/systemfilter.txt.
Почта раскладывается по каталогам, имена которых равны электронному адресу. 
Чтобы прочесть накопленное можно переименовать собранные файлы в файлы с расширением eml и скормить их ОС Windows.
Но мне больше нравится следующий способ:
Нужные файлы я копирую в специально выделенную папочку, при этом переименовывая их в файлы с цифровым названием:
let j=1; for i in `ls | grep -v make`; do mv $i $j; let j=$j+1; done; chmod a+r *
Затем либо на сервере либо удаленно запускаем почтовый клиент claws-mail который настраиваем таким образом, чтобы "специально выделенная папочка" являлась одним из каталогов, где хранится почта. У меня это сделано с сервера сбора почты на локальную машину через sshfs. Наслаждаемся интерфейсом.
А есть еще способ, который позволяет вам не прикасаться к собранным данным.
В /etc/crontab добавляем строку:
50 23   * * *   root    /mailmonitor_copy
Сам скрипт mailmonitor_copy наполняем следующими строчками:
#!/bin/bash
UserName="VICTIM_WITHOUT_DOMAIN"
Recipient="READER_WITHOUT_DOMAIN"

let j=1;

for i in `find  /var/mail/mailarchive/$UserName@DOMAIN/new -name *.`hostname`* -mtime -1`; do
    cp $i /tmp/$j.eml;

    PATH/mail -f $Recipient@DOMAIN -t $Recipient@DOMAIN -s "message $j of user $UserName" -a /tmp/$j.eml
    rm /tmp/$j.eml;
    let j=$j+1;
done

if [[ $j == 1 ]]; then
   
/mail -f  $Recipient@DOMAIN -t $Recipient@DOMAIN -s "No mail from $UserName at `date +%F`"
fi


И под завязку скрипт, который отправляет почту (он в предыдущем скрипте отмечен как PATH/mail и взят откуда-то с просторов интернета и доработан много лет назад. Силен он тем, что позволяет отправлять почту с приложениями.

#!/usr/bin/perl

use Net::SMTP;
use Getopt::Std;

$boundary="Message-Boundary-20030214";

getopt('ftsba', \%args);

if (!($args{f} and $args{t} and $args{s} )) {
    usage();
    exit;
}

if ($args{f}) {
    $from = $args{f};
}
if ($args{t}) {
    $to = $args{t};
}
if ($args{s}) {
    $subject = $args{s};
}
if ($args{b}) {
    $plain_text_message = $args{b};
}
if ($args{a}) {
    $attachment = $args{a};
    @_array = split("/", $attachment);
    $attachment_name = $_array[scalar(@_array)-1];
}

# Constructors
$smtp = Net::SMTP->new('localhost');

$smtp->mail($from);
$smtp->to($to);

push(@message, "Date: ".`date --rfc-822`);
push(@message, "To: $to\n");
push(@message, "From: $from\n");
push(@message, "Subject: $subject\n");
push(@message, "MIME-Version: 1.0\n");

#push(@message, "Content-Type: text/plain;");
#push(@message, "        charset=\"koi8-r\"");
#push(@message, "Content-Transfer-Encoding: 8bit");

push(@message, "Content-type: Multipart/mixed;\n");
push(@message, "\tboundary=\"$boundary\"\n");
push(@message, "\n");
push(@message, "This is a multi-part message in MIME format.\n");
push(@message, "\n");
push(@message, "--$boundary\n");

##  Print out any text message sent with the email
if ($plain_text_message){
    push(@message,"Content-type: text/plain; charset=koi8-r\n");
    push(@message,"Content-transfer-encoding: 7bit\n");
    push(@message,"\n");
    push(@message,$plain_text_message);
    push(@message, "\n");
}


if ($attachment) {
    push(@message,"--$boundary\n");
    ##  Print the header for that attachment.
    push(@message, "Content-type: application/octet-stream;\n name=\"$attachment_name\"\n");
    push(@message, "Content-Disposition: attachment;\n filename=\"$attachment_name\"\n");
    push(@message,"Content-transfer-encoding: BASE64\n");
    push(@message,"\n");

    ##  Send out the contents!!
    ## Store the new line character
    $_nl=$/;
    undef $/;
    open(FL,$attachment) || die $!;
    binmode (FL);
    $some_text=; ## Read the entire file contents into the variable

    close(FL);
    $/=$_nl; ## Restore the new line character.

    $some_text=encode_base64($some_text);
    push(@message,$some_text);
}

push(@message,"\n");
push(@message,"--$boundary--\n");

##     Indicte Start of the DATA header & send the message
$smtp->data(@message);


##     Close the connection
$smtp->quit;



sub encode_base64 ($;$){
 my $res = "";
 my $eol = $_[1];
 $eol = "\n" unless defined $eol;
 pos($_[0]) = 0;                          # ensure start at the beginning
 while ($_[0] =~ /(.{1,45})/gs) {
   $res .= substr(pack('u', $1), 1);
   chop($res);
 }
 $res =~ tr|` -_|AA-Za-z0-9+/|;               # `# help emacs
 # fix padding at the end
 my $padding = (3 - length($_[0]) % 3) % 3;
 $res =~ s/.{$padding}$/'=' x $padding/e if $padding;
 # break encoded string into lines of no more than 76 characters each
 if (length $eol) {
   $res =~ s/(.{1,76})/$1$eol/g;
 }
 $res;
}

sub usage () {
    print "Usage: mail [-f from] [-t to] [-s subject] <-b body=""> <-a attachment_file="">\n";
}

No comments: