#!/usr/bin/perl -w ################################################ # Shpatserman Maria # # Пакет реализующий отправку и получение писем # ################################################ package MailClient; ### Модуль для отправки писем через SMTP сервер use Net::SMTP::SSL; ### Модуль для создания сокета с IMAP сервером use IO::Socket::SSL; ### Модуль для работы с IMAP сервером - для получения почты use Mail::IMAPClient; ### Модуль для определения внешнего интерфейса нашего модуля use Exporter; ### Наш пакет is a пакет Exporter ( у него есть функция import) @ISA = ('Exporter'); ### Создание синонимов для функций пакета ( не надо писать MailClient::send_mail ) @EXPORT = qw(send_mail imap_email); ### Функция по рассылке почты через smtp.gmail.com sub send_mail { ### Входные переменные функции my $to = $_[0]; my $subject = $_[1]; my $body = $_[2]; my $from = $_[3]; my $password = $_[4]; my $smtp; ### Конструктор для объекта клиента соединяющегося по протоколу SMTP ### Использовать Debug => 1 для отладки ### Используем SSL протокол для установки безопасного соединения if (not $smtp = Net::SMTP::SSL->new('smtp.gmail.com', Port => 465, Debug => 0)) { die "Could not connect to server\n"; } ### Проверка смог ли клиент аутентифицироваться с указанными параметрами $smtp->auth($from, $password) || die "Authentication failed!\n"; ### Начало почтовой транзакции $smtp->mail($from . "\n"); my @recepients = split(/,/, $to); foreach my $recp (@recepients) { $smtp->to($recp . "\n"); } ### Начало передачи данных $smtp->data(); ### Отправка данных удаленному серверу $smtp->datasend("From: " . $from . "\n"); $smtp->datasend("To: " . $to . "\n"); $smtp->datasend("Subject: " . $subject . "\n"); $smtp->datasend("\n"); $smtp->datasend($body . "\n"); ### Конец отправки данных удаленному серверу $smtp->dataend(); ### Отправка команды QUIT удаленному серверу и закрытие сокет соединения $smtp->quit; } ### Функция по получению почты с imap.gmail.com sub imap_email { ### Входные переменные функции my $username = $_[0]; my $password = $_[1]; ### Открываем сокет с безопасным соединением с IMAP сервером my $socket = IO::Socket::SSL->new( PeerAddr => 'imap.gmail.com', PeerPort => 993, ) or die "socket(): $@"; eval { ### Создаем новый клиент для подключения к IMAP серверу ### Последовательно вызываются методы connect login my $client = Mail::IMAPClient->new( Socket => $socket, User => $username, Password => $password, ) or die "new(): $@"; ### Если login метод прошел успешно статус становится Authenticated if ($client->IsAuthenticated()) { print "Authentication is OK\n"; } else { die "Authentication is not correct\n"; } ### Получение имен папок вне зависимости от локали Inbox Sent ... my $xlist = $client->xlist_folders; foreach my $key (keys %$xlist) { print "$key $xlist->{$key} \n"; } ### Выбираем папку с входящими письмами и статус становится Selected $client->select("Inbox") or die "Could not select: $@\n"; ### Получить число сообщений в папке входящие ### Аналогично записи $client->message_count - для текущей выбранной папки my $msgcount = $client->message_count("Inbox"); print "MSG COUNt = $msgcount \n"; ### Вызов команды SEARCH IMAP с указанными аргументами my @msgs = $client->search("ALL"); ### Сохраняем все найденные email в файл $client->message_to_file("/home/gmail_emails/$username",@msgs) or die "Could not message_to_file: $@\n"; ### Вызывам команду LOGOUT IMAP. После этой команды сервер заканчивает соединение, ### а клиент переходит в состояние Unconnected $client->logout(); }; ### Закрываем сокет в любом случае if($@){ #print "Closing socket\nMessage Get bad\n"; $socket->close(); die "$@ \n"; } else { #print "Closing socket\nAll its fine\n"; $socket->close(); } } 1;