Выбрать главу

Во Всемирной сети Интернет насчитывается огромное количество файловых серверов, где хранятся архивы программ, документация и другая информация. FTP (File Transfer Protocol) - это протокол, специально созданный для передачи файлов. Обмен файлами остается одной из постоянных задач сетевого программирования, которая легко решается средствами языка Perl. В поставке Perl имеется стандартный модуль Net::FTP, реализующий FTP-клиента, который позволяет весьма просто организовать обмен файлами с сервером по протоколу FTP - например, автоматизировать автоматическое обновление нужных файлов с сервера. Далее приводится программа, которая с помощью команд FTP загружает с сервера файл, если он имеет более позднее время изменения, чем его локальная копия:

use Net::FTP; # используем модуль работы с FTP

my $server = 'ftp.server.org'; # имя или адрес сервера

my $file = 'file.name'; # имя файла

my $ftp = Net::FTP->new($server) # соединяемся с сервером

or die "Ошибка соединения с $server:$@";

$ftp->login('ftp','ftp') # указываем имя и пароль

or die " Ошибка регистрации:", $ftp->message;

$ftp->cwd("/pub") # переходим в каталог

or die "Ошибка смены каталога:", $ftp->message;

my $time_ftp = $ftp->mdtm($file) # время изменения на сервере

or die;

my $time_old = (stat($file))[9]; # время создания копии

if ($time_ftp > $time_old) { # если файл на сервере новее,

$ftp->binary; # то в двоичном режиме

$ftp->get($file) # загружаем файл

or die "Ошибка загрузки: ", $ftp->message;

utime($time_ftp, $time_ftp, $file); # и меняем время файла

}

$ftp->quit; # заканчиваем сеанс связи

Поскольку в классе Net::FTP реализованы остальные команды протокола FTP, с его помощью можно разрабатывать гораздо более сложные программы файлового обмена. Кроме этого класса, в архивах CPAN можно найти много других модулей для обмена файлами с FTP-серверами.

Электронная почта (e-mail) была и остается одним из самых популярных сетевых сервисов. Электронная почта базируется на асинхронной доставке почтового сообщения (message) с одного почтового сервера на другой с помощью протокола SMTP (Simple Mail Transfer Protocol). Почтовые сообщения каждого пользователя хранятся на сервере в отдельном почтовом ящике (mail-box). Клиентская почтовая программа (Mail User Agent, MUA) забирает почту с сервера с помощью одной из версий протокола POP (Post-Office Protocol) или предоставляет пользователю непосредственный доступ к ящику на почтовом сервере с помощью протокола IMAP (Internet Mail Access Protocol).

Естественно, что в Perl имеется множество средств работы с электронной почтой. По электронной почте можно организовать автоматическое уведомление системных администраторов или пользователей о наступлении определенного события. С помощью сообщений электронной почты организуется регулярная автоматическая рассылка информации, например, счетов клиентам. При работе с почтой можно воспользоваться стандартными модулями - Net::SMTP для отправки сообщений и Net::POP3 для их получения. Приведем пример простой программы, отправляющей сообщение электронной почты:

use Net::SMTP; # используем класс для отправки e-mail

my $mail_server = 'shokhirev.com'; # почтовый сервер

my $to_user = 'mikhail@shokhirev.com'; # получатель

my $from_user = 'mshock@shadrinsk.net'; # отправитель

$smtp = Net::SMTP->new(Host=>$mail_server);# соединяюсь

$smtp->mail($from_user); # пишу

$smtp->to($to_user); # получателю

$smtp->data(); # письмо

$smtp->datasend("To: $to_user\n"); #

$smtp->datasend("Subject: Lectures on Perl 5\n");

$smtp->datasend("\n");

$smtp->datasend("Сообщаем о публикации на intuit.ru\n");

$smtp->datasend("курса лекций по Perl 5\n");

$smtp->dataend(); # заканчиваю

$smtp->quit; # отсоединяюсь

Если нужно в программе проверить почтовый ящик на сервере, то с помощью класса Net::POP3 не составит труда написать короткую программу, принимающую электронную почту. Например, такую:

use Net::POP3; # используем класс для получения e-mail

my $mail_server = 'shadrinsk.net'; # почтовый сервер

my $user = 'mshock'; # почтовый ящик

my $password = 'secret'; # пароль

$pop = Net::POP3->new($mail_server); # подключаюсь

if ($pop->login($user, $password) > 0) {# регистрируюсь

my $numbers = $pop->list; # получаю номера писем

foreach my $numbers (keys %$numbers) {# по номеру

my $message = $pop->get($numbers); # получаю письмо