Ads 468x60px

пятница, 15 июня 2012 г.

Раскладываем почтовые вложения по папкам.

Задача: автоматически получать почту, выдирать из нее вложения и раскладывать их по папкам с темой письма.
Используемые средства: система Debian squeeze, получение почты perl, разбор письма на вложения ripmime, перенос файлов на windows ресурс smbclient.
Общий принцип работы perl скрипт последовательно читает почту, каждое очередное сообщение передается ripmime, после чего файлы копируются на общий ресурс windows.
Предварительные настройки.
Установка ripmime.
Так как в пакетах Debian мне обнаружить данную программу не удалось, то ставил из исходников с сайта самой программы:
$ wget http://www.pldaniels.com/ripmime/ripmime-1.4.0.10.tar.gz
$ tar -zxf ripmime-1.4.0.10.tar.gz
$ cd ripmime-1.4.0.10/
$ make && sudo make install clean
Установка модулей perl.
Нам потребуются два модуля Net::IMAP::Simple и Mail::Header. В моей системе достаточно было установить два пакета вместе с зависимостями:
$ sudo aptitude install libnet-imap-simple-ssl-perl
$ sudo aptitude install libmailtools-perl
Проверяем корректность установленных библиотек:
$ perl -e "use Mail::Header; use Net::IMAP::Simple;"
Подготовка системы.
Клиент для работы с общими ресурсами windows:
$ sudo aptitude install smbclient
Создаем папку для предварительного сохранения писем:
$ mkdir res
Файл параметров подключения к общему ресурсу windows :
$ cat public
username = winDomainUser
password = secret
domain = you.win.domain
Perl скрипт.
Описание работы скрипта по максимуму дано в комментариях:
#!/usr/bin/perl
# mailattach.pl

  use strict;
  use warnings;
  use Net::IMAP::Simple;
  use Mail::Header;
# для крона - переходим в директорию локации скрипта
$0=~/^(.+[\\\/])[^\\\/]+[\\\/]*$/;
my $cgidir= $1 || "./";
chdir $cgidir;
# параметры windows ресурса 
    my $SMBSERVER="//wynserver";  # имя сервера
    my $SMBSHARE="/Public";     # имя общего ресурса на сервере
    my $SMBDIR="jpg";        # папка, в которую будем выкладывать вложения
# параметры почтового ящика
    my $mailhost = "imap.server.name";
    my $mailuser = "user";
    my $mailpass = 'secret';
    my $mailfolder = "INBOX"; # папка, в которой проверяем почту
    my $mailNewFolder = "read"; # папка, в которую перекладываем прочтенные письма
# создаем подключение к серверу
my $imap = Net::IMAP::Simple->new(
    $mailhost,
    port    => 993,
    use_ssl => 1,
    debug => 0,
    ) || die "Unable to connect to IMAP: $Net::IMAP::Simple::errstr\n";

if(!$imap->login($mailuser,$mailpass)){
   print STDERR "Login failed: " . $imap->errstr . "\n";
   exit(64);
}
# Читаем входящие сообщения
my $nm = $imap->select($mailfolder);
# Последователь проходим по списку сообщений
for(my $i = 1; $i <= $nm; $i++){
    # Получаем список служебных заголовков письма
    my $header = $imap->top($i);
    # Разбиваем заголовки на отдельные состовляющие
    my $head_obj = Mail::Header->new($header);
    # по теме письма формируем имя директории для сохранения вложений
    my $dir = $head_obj->get('Subject');
    # удаляем все не словарные символы,
    # для исключения проблем с созданием папок в windows
    $dir =~ s/\W+//g;
    # Сохраняем текущее собщение в файл
    open MSGFILE,"> res/msg" or die "Couldn't open file: \n";
    print MSGFILE @{ $imap->get($i) };
    close MSGFILE;
    # перемещаем сообщение в папу обработанных
    # если папка для перемещения не создана письмо будет только удалено
    $imap->copy($i,$mailNewFolder);
    $imap->delete($i);
    # разбираем письмо на вложения
    system ("/usr/local/bin/ripmime","-ires/msg","-dres/$dir");
    # копируем файлы на ресурс windows
    # переходим в папку с вложениями 
    chdir "res/".$dir or die "Can't cd $!\n";
    # prompt - необходим, что бы не подтверждать копирование каждого файла в команде mput
    # в моем случае копируются только картинки
    my $SMBCMD="prompt;cd $SMBDIR;mkdir $dir;cd $dir;rm *;mput *.png;exit";
    system ("/usr/bin/smbclient","$SMBSERVER$SMBSHARE","-A../../public","-c$SMBCMD");
    chdir "../../";
}
# Закрываем подключение к imap серверу
$imap->quit;
# чистим директорию с временными файлами
system ("/bin/rm -rf res/*");
exit 0;
Создание регламентного задания.
Так как файлы содержат пароли ограничиваем права доступа на них
$ chmod 600 public
$ chmod 700 mailattach.pl
файл задания для cron
$ echo "* * * * * /you/path/to/script/mailattach.pl" > cron
добавляем задание в cron
$ sudo crontab -u user cron
Все теперь поминутно будет проверяться ящик.

Комментариев нет: