Отправка почты

Проблема

Ваша программа должна отправлять почту. Некоторые программы следят за системными ресурсами — например, свободным местом на диске — и рассылают сообщения о том, что ресурс достиг опасного предела. Авторы сценариев 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.

См. также




2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: