Отправка почты
Проблема
Ваша программа должна отправлять почту. Некоторые программы следят за системными ресурсами —
например, свободным местом на диске — и рассылают сообщения о том, что ресурс достиг опасного
предела. Авторы сценариев CGI часто делают так, чтобы при нарушениях работы базы данных
программа не сообщала об ошибке пользователю, а отправляла сообщение о проблеме администратору
базы данных.
Решение
Воспользуйтесь модулем Mail::Mailer с CPAN:
use Mail::Mailer;
$mailer = Mail::Mailer->new();
$mailer->open( { From => $from_address,
To => $to_address,
Subject => $subject
})
or die "Can't open; $!\n";
print $mailer $body;
$mailer->close();
Кроме того, можно воспользоваться программой sendmail:
open(SENDMAIL, " |/usr/lib/sendmail -oi -t -odq")
or die "Can't fork for sendmail: $!\n";
print SENDMAIL <<"EOF";
From: User Originating Mail <me\@host>
To: Final Destination <you\@otherhost>
Subject: A relevant subject line
Body of the message goes here, in as many lines as you like.
EOF
close(SENDMAIL) or warn "sendmail didn't close nicely";
Комментарий
Существуют три варианта отправки почты из программы. Во-первых, можно воспользоваться
внешней программой, которая обычно применяется пользователями для отправки почты — например,
Mail или mailx; такие программы называются «пользовательскими почтовыми агентами»
(MUA, Mail User Agents). Во-вторых, существуют почтовые программы системного уровня
(например, sendmail); они называются «транспортными почтовыми агентами»
(МТА, Mail Transport Agents). Наконец, можно подключиться к серверу SMTP
(Simple Mail Transfer Protocol). К сожалению, стандартной программы пользовательского уровня
не существует, для sendmail не определено стандартного местонахождения, а протокол SMTP
довольно сложен. Модуль Mail::Mailer от CPAN избавляет вас от этих сложностей.
При установке модуль Mail::Mailer ищет mail, Mail и другие имена, под которыми
обычно скрываются программы отправки почты. Кроме того, он просматривает некоторые
распространенные каталоги, где может находиться sendmail. При создании объекта Mail::Mailer
вы получаете удобный доступ к этим программам (и почтовым серверам SMTP), не заботясь
о структуре аргументов или о возвращаемых ошибках.
Создайте объект Mail::Mailer конструктором Mail::Mailer->new. При вызове конструктора
без аргументов используется метод отправки почты по умолчанию (вероятно, с помощью внешней
программы типа mail). Аргументы new позволяют выбрать альтернативный способ отправки
сообщений. Первый аргумент определяет способ отправки ("mail" для пользовательских почтовых
агентов UNIX, "sendmail" для программы sendmail и "smtp" для подключения к серверу SMTP).
Необязательный второй аргумент определяет путь к программе.
Например, следующая команда приказывает Mail::Mailer использовать sendmail вместо
способа отправки, принятого по умолчанию
$maller = Mail::Mailer->new("sendmail");
В следующем примере вместо mail используется почтовая программа /u/gnat/bin/funkymailer:
$maller = Mail::Mailer->new("mail", "/u/gnat/bin/funkymailer");
Подключение к серверу SMTP mail.myisp.com выполняется так:
$maller = Mail::Mailer->new("smtp", "mail.myisp.com");
При возникновении ошибки в любой части Mail::Mailer вызывается die. довательно,
для проверки ошибок следует включить код отправки почты в
eval, после чего проверить переменную $@:
eval {
$maller = Mail::Mailer->new("bogus", "arguments");
# ...
};
if ($@) {
# Неудачный вызов eval
print "Couldn't send mail;
} else {
# Успешный вызов eval
print "The authorities have been notified.\n";
}
Если конструктор new не понимает переданные аргументы или не имеет метода по умолчанию при
отсутствии аргументов, он инициирует исключение. Модули Mail::Mailer запускает почтовую
программу или подключается к серверу SMTP лишь после вызова метода
open для заголовков сообщения:
$mailer->open( 'From' => 'Nathan Torkington <gnat@frii.com>',
'To' => 'Tom Christiansen <tchrist@perl.com>'
'Subject' => 'The Perl Cookbook' );
Если попытка запустить программу или подключиться к серверу завершилась неудачно,
метод open инициирует исключение. После успешного вызова open пeременную $mailer можно
интерпретировать как файловый манипулятор и вывести в нее основной текст сообщения:
print $mailer <<EO_SIG;
Мы когда-нибудь закончим эту книгу?
Жена грозится уйти от меня.
Она говорит, что я люблю EMACS больше, чем ее.
Что делать?
Нат
EO_SIG
Завершив отправку текста, вызовите функцию close для объекта Mail::Mailer
close($mailer) or die "can't close mailer: $!";
Впрочем, с программой sendmail можно общаться и напрямую:
open(SENDMAIL, "|/usr/sbin/sendmail -oi -t -odq")
or die "Can't fork for sendmail: $!\n";
print SENDMAIL <<"EOF";
From: Tom Christiansen <tchrist\sperl.com>
To: Nathan Torkington <gnat\@frii.com>
Subject: Re: The Perl Cookbook
(1) Мы никогда не закончим эту книгу.
(2) Tot, кто работает с EMACS, не заслуживает любви.
(3) Переходи на vi.
Том
EOF
close(SENDMAIL);
Перед нами тривиальное использование функции open для запуска другой программы.
Нам приходится указывать полный путь к sendmail, поскольку местонахождение этой программы
меняется от компьютера к компьютеру. Обычно она находится в каталоге /usr/lib или /usr/sbin.
Флаги, передаваемые sendmail, говорят о том, что программа не должна завершаться при чтении
строки, состоящей из одной точки (-оr); что адресат сообщения определяется по данным заголовка (-t);
а также о том, что вместо немедленной доставки сообщение должно помещаться в очередь (-odq).
Последний параметр важен лишь при отправке больших объемов почты — без него компьютер быстро
захлебнется в многочисленных процессах sendmail. Чтобы сообщение доставлялось немедленно
(например, во время тестирования или при срочной доставке почты), удалите -odq из командной строки.
Мы выводим функцией print все сообщение — заголовки и основной текст, разделяя их
пустой строкой. Не существует специальных служебных символов для вставки новых строк
(как в некоторых пользовательских почтовых программах), поэтому весь текст интерпретируется
буквально. Sendmail добавляет заголовки Date и Message-ID (которые все равно пришлось бы
генерировать вручную).
Некоторые версии Perl (особенно для Windows и Мас) не имеют аналогов sendmail или mail.
В таких случаях отправка почты осуществляется через сервер SMTP.
См. также
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|