Поиск

Программные средства организации почтовой службы

Цель следующих разделов — написать на Perl короткую функцию, которую можно использовать в CGI-программах для отправки почтовых сообщений. Однако существует одна проблема: работа такой функции зависит от того, имеется ли в вашей системе агент передачи почты (такой, как sendmail), либо программа напрямую должна отправлять почту по протоколу SMTP ближайшему серверу. Поэтому бегло просмотрите следующие разделы и решите, какой из них вам понадобится для реализации конкретной программы.

Отправка почты в системах UNIX

Если вы работаете в системе UNIX и у вас корректно настроена программа sendmail (а так оно и должно быть!), это именно тот раздел, который вам нужен. Если же какая-либо из необходимых составляющих (система UNIX или программа sendmail) отсутствует и вы читаете этот раздел лишь из любознательности, то заслуживаете всяческих похвал. Однако в этом случае функция, представленная в листинге 22.1, скорее всего, вам не подойдет.

Даже если вы работаете в системе UNIX, вам все равно стоит прочесть следующий раздел, "Отправка почты не из системы UNIX". В нем рассматривается новый метод использования объектно-ориентированного модуля.

Проведем анализ программы.

  • Строка 6. Переменной $sendmail присваивается значение полного пути к программе sendmail и необходимые аргументы для ее запуска. Учтите, что программа sendmail может находиться в другом каталоге вашей системы или иметь другие аргументы.
  • Строка 8. Открывается конвейер для записи информации в стандартный входной поток программы sendmail, полный путь и параметры которой указаны в переменной $sendmail. Конвейеру назначается дескриптор файла MAIL.
  • Строки 9~14. Заголовок почтового сообщения выводится в дескриптор MAIL.
  • Строки 15—17. Тело сообщения записывается в дескриптор MAIL. Вконей каждой строки добавляется символ n.

Чтобы протестировать эту функцию, просто вызовите ее с набором из четырех аргументов:

При вызове этой функции считается, что программа sendmail должна уже быть корректно установлена и настроена для работы в вашей системе. Если она отсутствует, переходите к следующему разделу, "Отправка почты не из системы UNIX", поскольку представленное там решение должно работать также и под управлением системы UNIX.

Вам нужно будет изменить значение переменной $sendmail в соответствии с действительным расположением программы sendmail в вашей системе. Она может находиться в одной из таких папок, как /usr/lib, /usr/sbin и /lib, или в любой другой. Для поиска используйте команду whereis sendmail.

Если что-то работает не так, как вы ожидали, убедитесь в корректной работе службы электронной почты вашей системы. Попытайтесь отправить контрольное сообщение с помощью одной из почтовых утилит, как, например, mail или pine. Если эти утилиты не работают надлежащим образом, то маловероятно, что программа sendmail установлена корректно. Приступая к работе, вам придется устранить эту проблему или использовать метод, описанный в следующем разделе.

В листинге 22.1 программа sendmail запускается с использованием описанных ниже параметров, причем вы можете изменить их по своему усмотрению.

Остальная часть функции send mail() говорит "сама за себя".

Отправка почты не из системы UNIX

При работе под управлением Windows и других операционных систем, в которых нет встроенной программы-агента МТА типа sendmail, вам не избежать определенных трудностей. Программы МТА не так уж просты, и попытка скопировать их действия с помощью нескольких строк Perl оказывается не из легких. Тем не менее это осуществимо.

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

Теперь о плохом: этот модуль не входит в стандартную поставку Perl. Вы должны загрузить его самостоятельно и установить на том компьютере, откуда собираетесь отправлять почту. Модуль Net::SMTP является частью пакета libnet, который содержит все виды полезных модулей, обеспечивающих работу в сети.

В приложении "Инсталляция модулей в Perl" подробно описан процесс установки модулей в Perl под управлением таких операционных систем, как UNIX, Windows и Macintosh. Кроме того, вы получите инструкции по установке собственных копий модулей на случай, если системный администратор не захочет устанавливать общую копию.

Функция send_mail для систем без программы МТА представлена в листинге 22.2. Она включает несколько необычный (новый) синтаксис, с которым вы еще незнакомы. Обязательно прочитайте последующие пояснения.

Проведем анализ программы.

  • Строка 5. Подключается модуль Net::SMTP, который позволяет намного упростить отправку почты.
  • Строка 10. Создается объект Net:: SMTP, связанный с соответствующим почтовым сервером, адрес которого был указан в строке 9.
  • Строки 13—23. Серверу электронной почты отправляются заголовки и тело сообщения. Для получения более подробной информации см. пояснения по функциям Net: :SMTP, приведенные ниже.

Чтобы протестировать эту функцию, достаточно вызвать ее с четырьмя аргументами, представляющими отдельные части почтового сообщения:

Первое, что может удивить вас в этой функции, это строка Ssratp = Net: :SMTP->new($relay). При ее выполнении создается нечто, именуемое объектом. Объект — это не скаляр, не случайные данные ("мусор") и не массив, это нечто совсем иное. Значение в переменной $smtp представляет соединение с программой пересылки почты, которой можно управлять. Представьте себе объект как значение особого вида, которое позволяет вызывать функции, имеющие к нему отношение.

Следующей "странностью" для вас может оказаться строка $smtp->mail($from). Элемент -> соединяет объект, заданный слева, с функцией, указанной справа от него. Поэтому mail — это вызов функции, в котором используется объект $smtp, созданный на предыдущей строке.

Для использования модуля Net::SMTP вам необязательно вникать во все подробности синтаксиса объекта — достаточно его соблюдать. Ниже перечислены функции, которые можно использовать вместе с объектом Net: :SMTP.

  • $smtp->mail(addr). Функция mail указывает, кто является отправителем почты. Здесь вполне можно сообщить "не свой" адрес.
  • $smtp->to(addr). Функция to определяет, кому вы отправляете сообщение. При вызове функции to со списком имен каждый адресат получит копию данного почтового сообщения. Имена получателей необязательно должны содержаться в теле сообщения, например, если вы их поместите в поле ВСС:.
  • $smtp->data(). Функция data означает, что вы готовы отправить само сообщение,
  • $smtp->datasend(data). Эта функция отправляет действительный текст сообщения. Вы должны явно вывести обязательные поля заголовка (То:, From: и т.д.), а такие поля, как Date: и Received:, генерируются автоматически. Между заголовком и телом сообщения необходимо вывести пустую строку: $smtp->datasend("n"). За пустой строкой следует тело сообщения, которое также посылается с помощью конструкции $smtp->datasend().
  • $smtp->dataend(). Функция dataend означает, что вы завершили отправку тела сообщения. Сообщение не будет послано до тех пор, пока не обозначится конец сообщения.
  • $smtp->quit(). Эта функция завершает сеанс связи с SMTP-сервером.