Итак, вся почта, отправляемая сотрудниками, складывается в каталог /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";
}-a>-b>
UserName="
Recipient="
let j=1;
for i in `find /var/mail/mailarchive/$UserName@DOMAIN
cp $i /tmp/$j.eml;
let j=$j+1;
done
if [[ $j == 1 ]]; then
fi
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");
}
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=
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";
}-a>-b>
No comments:
Post a Comment