Рубрики
mail \ почта

Парсер почты \ mail parser \ perl

Описание работы скрипта:

Подключаемся к почтовому серверу(IMAP).
Проверяем входящие и все прочтённые письма складываем в папку read.
Все вложения из писем оправляем на шару

Настройка:
0) ставим apt-get install libnet-imap-simple-ssl-perl  libmailtools-perl ripmime smbclient
1) создаем пользователя
adduser parse

2) входим под юзакаом
su parse

3) переходим в домашний каталог 
cd ~

4) создаем файлы и каталог res
touch mailattach.pl public
mkdir res

5) nano /home/parse/mailattach.pl
---------------------------------
много букв, смотрим содержимое внизу 
Скрипт mailattach.pl
---------------------------------

6) nano /home/parse/public
--------------------------
username = parse
password = Password_User
domain = Name_server
--------------------------

7) расписание 
Каждые 5 минут запускать скрипт
crontab -e 
*/5 * * * * /home/parse/mailattach.pl

Скрипт mailattach.pl:


#!/usr/bin/perl
# mailattach.pl
  use strict;
  use warnings;
  use Net::IMAP::Simple;
  use Mail::Header;
# для крона - переходим в директорию локации скрипта
$0=~/^(.+[\\\/])[^\\\/]+[\\\/]*$/;
my $cgidir= $1 || "./";
chdir $cgidir;

# Чистим res
system ("/bin/rm -rf res/*");

# параметры windows ресурса
    my $SMBSERVER="//server_name";  # имя сервера
    my $SMBSHARE="/folder_share";     # имя общего ресурса на сервере
#my $SMBDIR="xml";        # папка, в которую будем выкладывать вложения
## параметры почтового ящика
    my $mailhost = "mail.server.ru";
    my $mailuser = 'parse@server.ru';
    my $mailpass = 'SUperPassWORD';
    my $mailfolder = "INBOX"; # папка, в которой проверяем почту
    my $mailNewFolder = "read"; # папка, в которую перекладываем прочтенные письма
# создаем подключение к серверу
my $imap = Net::IMAP::Simple->new(
    $mailhost,
    port    => 143,
    use_ssl => 0,
    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; с длинными именами в заголовке будут проблемы. 
    #будем генерировать рандомные имена папок 
    $dir = rand;
    # Сохраняем текущее сообщение в файл
    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/bin/ripmime","-ires/msg","-dres/$dir");
    # копируем файлы на ресурс windows
    # переходим в папку с вложениями
    chdir "res/".$dir or die "Can't cd $!\n";
    # prompt - необходим, что бы не подтверждать копирование каждого файла в команде mput
    # в моем случае копируются все вложения
    my $SMBCMD="prompt;mput *;exit";
    system ("/usr/bin/smbclient","$SMBSERVER$SMBSHARE","-A../../public","-c$SMBCMD");
    chdir "../../";
}
# Закрываем подключение к imap серверу
$imap->quit;
# чистим директорию с временными файлами
system ("/bin/rm -rf res/*");
exit 0;