Рассылка и получение почты по протоколам SMTP и IMAP на perl.

В данной статье описывается, как отправить почту через smtp сервер gmail, а также как скачать почту с imap сервера gmail.

Отправка почты через SMTP сервер

Для передачи почты с помощью сервера smtp.gmail.com можно использовать модуль perl Net::SMTP::SSL. Этот модуль поддерживает SSL - протокол безопасности передачи данных. SSL необходим для сервера smtp.gmail.com.

Если Вы имеете ящик на gmail, то используя приведенный ниже скрипт сможете отправлять почту кому захотите через smtp сервер gmail.

Опишем основные функции модуля Net::SMTP::SSL :
Net::SMTP::SSL->new() Создает новый объект - клиент , который присоединяется к smtp серверу на указанном порту.
auth() SASL аутентификация клиента с указанными логином и паролем.
mail() Инициируем отправку сообщения.
data() Начало передачи данных.
datasend() Непосредственно отправка данных.
dataend() Конец передачи данных удаленному серверу.
Пример использования описанных функций:

### Создаем соединение с удаленным сервером, включаем отладку (Debug)
$smtp = Net::SMTP::SSL->new('smtp.gmail.com',
        		             Port => 465,
				             Debug => 0));
### Аутентифицируемся на сервере - указываем свой логин пароль
$smtp->auth('user@gmail.com', 'password');
### Создаем письмо - указываем свой ящик                             
$smtp->mail('user@gmail.com'. "\n");
### Указываем кому направляется письмо, например, user@yandex.ru
$smtp->to('user@yandex.ru' . "\n");
### Непосредственно передача джанных 
$smtp->data();
$smtp->datasend("From: " . 'user@gmail.com' . "\n");
....
$smtp->dataend();
### Закрываем сокет соединения с сервером
$smtp->quit;

Получение почты с IMAP сервера

Для того чтобы иметь возможность скачивать почту (или просто лазить по ней и т.д.) с IMAP сервера gmail надо поправить настройки. Необходимо зайти на свой ящик gmail.com (с которого вы собираетесь скачивать \ проверять почту) перейти в Настройки, далее перейти на вкладку Пересылка и POP\IMAP и внизу Доступ по протоколу IMAP выбрать Включить IMAP.

При получении почты через imap сервер необходимо также, как и smtp, создавать безопасное соединение. Для создания безопасного соединения с сервером будем использовавть модуль IO::Socket::SSL , а для работы непосредственно с почтой через сервер IMAP будем использовать модуль Mail::IMAPClient.
С помощью модуля Mail::IMAPClient, можно скачивать входящую почту, почту которая лежит в папке отправленных писем, можно узнать сколько писем лежит в той или иной папке, можно удалять не нужные письма из папок и т.д.

Опишем основные функции модуля Mail::IMAPClient:
Mail::IMAPClient->new() Создается клиентское подключение к серверу imap и сразу проверяется логин пароль для аутентификации.
xlist_folders() Позволяет отобразить имена папок на почтовом ящике в локали пользователя и соответствующие каждой папке ключи, такие каr Inbox, Sent и т.д. Эти значения разбирает Mail::IMAPClient и их удобнее всего использовать для перехода по пакам.
select() Переходит на указанную папку(переставляет указатель). Все остальные операции, такие как число сообщений , поиск сообщений будут происходить в данной папке. message_count() Получаем количество сообщений в текущей или указанной папке.
search() Позволяет в текущей папке отобрать сообщения удовлетворяющие заданному критерию. "ALL" - отобрать все сообщения, "UNSEEN" - отобрать только не прочитанные сообщения.
Пример использования описанных функций:

### Создаем безопасное соединение с IMAP сервером
$socket = IO::Socket::SSL->new(PeerAddr => 'imap.gmail.com',
                               PeerPort => 993);
### Соединяемся и атунетифицируемся на сервере
$client = Mail::IMAPClient->new(Socket   => $socket,
                                User     => $username,
                                Password => $password);
### Переходим на папку с входящими письмами
$client->select("Inbox");
### Получаем число сообщений в папке входящих писем
$msgcount = $client->message_count("Inbox");
### Получаем все письма
@msgs = $client->search("ALL");
### Сохраняем отобранные письма в файл
$client->message_to_file("/home/perl/inbox_msg.txt");
### Заканчиваем соединение с сервером
$client->logout();
### Закрываем сокет
$socket->close();

Описание работы программы рассылки и скачивания писем

Программа реализована в виде модуля MailClient.pm, который удобно использовать из других скриптов. Модуль реализован с двумя экспортными функциями send_mail - для отправки почты и imap_email - для скачивания почты из папки Inbox (входящая почта). В функцию send_mail необходимо передавать 5 значений: адрес получателя, тема письма, текст письма, ваш gmail адрес и пароль соответственно. В функцию imap_email передаются 2 входных значения - это ваш gmail адрес и пароль.
К примеру, расположим модуль MailClient.pm в папке /home/mymodules. Для того чтобы модуль MailClient.pm можно было подключать во всех программа perl, а не только из программ находящихся в той же папке , что и сам модуль , нам необходимо добавить в файл /etc/profile строку:
export PERL5LIB=/home/mymodules
Далее выполнить команду:
# source /etc/profile
Таким образом модуль станет доступным для подключения для всех пользователей. Либо если прописать эту же строку только в файле /root/.bash_profile - то модуль станет доступным только пользователю root.

Текст программы с комментариями

Модуль MailClient.pm - для рассылки и скачивания писем gmail

Скрипт send.pl - пример подключения и использования данного модуля

Исходный текст модуля: MailClient.pm
Пример программы использующей данный модуль: send.pl