Общение напрямую по почтовым протоколам
Общение напрямую по почтовым протоколам
Последний выбор - написать программу, общающуюся с почтовым сервером на его родном языке. Большая часть этого языка документирована в RFC821. Вот как выглядит основной обмен данными по SMTP (Simple Mail Transfer Protocol, простой протокол передачи почты). Данные, которые мы посылаем, выделены жирным шрифтом:
%
telnet example.com 25 -соединяемся с SMTP-портом наexample.com
Trying 192.168.1.10 ... Connected to example.com. Escape character is '"]'.
220 mailhub.example.com ESMTP Sendmail 8.9.1a/8.9.1: Sun, 11 Apr 1999 15:32:16 -0400 (EOT)
HELD client.example.com -идентифицируеммашину,с которой мы.
пришли (можно использовать EHLO)
250 mailhub.example.com Hello dnb@client.example.com [192.168.1.11]. pienSt;' to meet you
MAIL FROM: «jnb@example.com> - определяем отправителя 250 <dnb@exarnple. com>... Sender ok
RCPT TO: <dnb@example.com> - определяем получателя
250 <dnb@example.com>... Recipient ok
DATA - начинаем отправлять данные, не забывая о некоторых ключевых заголовках
354 Enter mail, end with "." on a line by itself From:
David N. Blank-Edelman (David N. Blank-Edelman) To: dnbeexample.com Subject: SMTP - хороший протокол
Просто хочу напомнить себе о том, насколько я люблю SMTP. С миром, dNb
- завершаем сообщение
250 РАА266Р4 Message accepted for delivery QUIT - конец сессии
221 mailhuD.example.com closing connection Cor.rectici closed by foreign host.
Несложно записать в сценарий подобную беседу. Можно было бы использовать модуль Socket или что-нибудь вроде Net: : Telnet, как в главе 6 «Службы каталогов». Но существует несколько хороших модулей для отправки почты, которые упрощают эту задачу. Среди них модуль Женды Крыницки (Jenda Krynicky) Mail; :Se'-oer, Mai 1: :Sendmail Мили-вожа Ивковича (Milivoj Ivkovic) и Mail::Ma:Ier из пакета MailTools Грэхема Бара (Graham Barr). Все эти модули не зависят от операционной системы и будут работать практически везде, где доступен современный дистрибутив Perl. Мы рассмотрим Mail: :Mailer, поскольку он предлагает единый интерфейс к двум способам отправки почты, которые обсуждались до сих пор. Как и в случае с большинством модулей, написанных в объектно-ориентированном стиле, первый шаг заключается в создании экземпляра нового объекта:
use Mail::Mailer;
$f rom="me\@example. coin"; $to="you\@example.com";
$subject="Hi there"; $body="message body\n";
$type="srnto"; $server="mail.example,com";
my Smaller = Mail::Mailer->new($type, Server -> $server) or die
"Невозможно создать новый объект mailer:$'\n".
Переменная $type позволяет выбрать один из следующих типов поведения:
smtp
Посылает почту, обращаясь к модулю Net: :SMTP (часть пакета lib-net), доступному и для большинства не-Unix версий Perl. Если используется MailTools версии 1.13 или выше, можно задать имя SMTP-сервера, применяя приведенную выше символику =>. В противном случае, придется устанавливать имя сервера во время процедуры установки libnet.
Отправка почты при помощи почтового агента mail (или любого другого, который задан вторым необязательным аргументом). Это напоминает недавнее использование AppleScript и MAPI.
sendmail
Отправка почты с помощью программы sendmail, как и в первом случае из данного раздела.
Кроме того, можно установить переменную окружения PtRL_MAILERS, чтобы изменить путь, установленный по умолчанию для поиска программ (например, sendmail) в системе.
Вызов метода ореп() для нашего объекта Mail:: Mailer заставляет последний выполнять роль дескриптора для исходящего сообщения. В этом вызове передаются заголовки сообщения ссылке на анонимный хэш:
$mailer->open({From => $from, То => $to.
Subject => Ssubject}) or die "Невозможно заполнить объект mailer
Тело сообщения выводится в этот псевдодескриптор, который потом закрывается для отправки сообщения:
print Smailer $body: $mailer->close;
Этого вполне достаточно, чтобы отправка почты из Perl не зависела от системы.
В зависимости от того, какой тип поведения $type был выбран при работе с модулем, могут оказаться скрытыми (а могут и не оказаться) более сложные вопросы, относящиеся к МТА, о которых уже говорилось. В предыдущем примере использовалось поведение smtp, а это означает, что программа должна быть достаточно умна, чтобы обрабатывать такие сбои как недоступность сервера. Приведенный пример не настолько «сообразителен». Обязательно позаботьтесь о таких моментах, когда будете писать программы.