Анимация
JavaScript
|
Главная Библионтека 18.3. Отправка почты Проблема Ваша программа должна отправлять почту. Некоторые программы следят за системными ресурсами - например, свободным местом на диске - и рассылают сообщения о том, что ресурс достиг опасного предела. Авторы сценариев CGI часто делают так, чтобы при нарушениях работы базы данных программа не сообщала об ошибке пользователю, а отправляла сообщение о проблеме администратору базы данных. Решение Воспользуйтесь модулем Mail;:Mailer с CPAN: use Mail::Mailer; Smaller = Mail::Mailer->new(); $mailer->open({ From => $from address, To => $to address, Subject => Ssubject, Если функция mkdir вызывается успешно, возвращается полный путь к только что созданному каталогу. При неудаче mkdir возвращает undef. Методы Is и dir возвращают список содержимого удаленного каталога. Традиционно dir выводит более подробную информацию, чем Is, но в обоих случаях стандартного формата не существует. Большинство серверов FTP выводит результаты команд Is и Is -/, но нельзя гарантировать, что это правило будет соблюдаться всеми серверами. В списковом контексте эти методы возвращают список строк, возвращенных сервером. В скалярном контексте возвращается ссылка на массив. @lines = $ftp->ls("/pub/gnat/perl") or die "Cant get a list of files in /pub/gnat/perl: $!"; $ref to lines = $ftp->dir("/pub/perl/CPAN/src/latest.tar.gz") or die "Cant check status of latest.tar.gz: $!\n"; Для корректного заверщения работы с FTP используется метод quit: $ftp->quit() or warn "Couldnt quit. Oh well.\n"; Другие методы переименовывают удаленные файлы, меняют владельца и нрава доступа, проверяют размер удаленных файлов и т. д. За подробностями обращайтесь к документации но модулю Net::FTP. Если вы хотите организовать зеркальное копирование файлов между компьютерами, воспользуйтесь превосходной программой mirror, написанной на Perl Ли Маклафлином (Lee McLoughlin) {http: sunsite.doc.ic.ac.uk/packages/mirror/)." t> Смотри также- Страницы руководства ftpCl) и ftpd{8) вашей системы (если есть); документация но модулю Net;:FTP с CPAN. 18.3. Отправка почты 651 or die "Cant open: $!\n"; print Smaller Sbody; $mailer->close(); Кроме того, можно воспользоваться программой sendmail: open(SENDMAIL, "/usr/lib/sendmail -oi -t -odq") or die "Cant 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 didnt 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 вместо способа отправки, принятого по умолчанию: Smaller = Mail::Mailer->new("sendmail"); В следующем примере вместо mail используется почтовая программа /u/gnat/ bin/f unkymailer: Smaller = Mail ;Mailer->new("mail", "/u/gnat/bm/funkymailer"); Подключение к серверу SMTP mail.myisp.com выполняется так: Smaller = Mail::Mailer->new("smtp", "mail.myisp.com"); При возникновении ошибки в любой части Mail::Mailer вызывается die. Следовательно, для проверки ошибок следует включить код отправки почты в блок eval, после чего проверить переменную $@: eval { Smaller = Mail.:Mailer->new("bogus", "arguments"); # ,.. If (S@) { # Неудачный вызов eval print "Couldnt send mail: S@\n"; I 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 переменную Smaller можно интерпретировать как файловый манипулятор и вывести в нее основной текст сообшения: print Smaller «EO SIG; Мы когда-нибудь закончим эту книгу Жена грозится уйти от меня Она говорит, что я люблю EMACS больше, чем ее. Что делать E0 SIG Завершив отправку текста, вызовите функцию close для объекта Mail::Mailer: close(Smailer) or die "cant close mailer: S!"; Впрочем, с программой sendmail можно общаться и напрямую: open(SENDMAIL, "1/usr/sbin/sendmail -oi -t -odq") or die "Cant fork for sendmail: $!\n"; print SENDMAIL «"E0F"; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 [ 211 ] 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 |