|
Программирование >> Программный интерфейс приложений
Для посылки электронной почты сценарий renewalnotif у открывает канал с профаммой sendmail и направляет сообщение по этому каналу. Путь к каталогу, в котором хранится профамма sendmail, задается в начале сценария В зависимости от типа системы может понадобиться его изменить. # изменение пути ту (Ssendmail) = /usr/lib/sendmail -t -ox ; Основной цикл обработки аргументов работает следующим образом. В случае отсутствия аргументов в командной сфоке входные данные счи-тываются со стандартного устройства ввода. В противном случае аргументы передаются для анализа в функцию interpret argument () для распознавания в качестве идентификационного номера, элекфонного адреса или файла: if (@ARGV ==0) # аргументы отсутствуют, ожидать ввода # с устройства STDIN read flle (\*STDIN); else { while (my Sarg = shift (@ARGV)) { # интерпретация аргумента с рекурсией по имени файла interpret argument ($arg, 1); Функция read file() считывает содержимое файла (предполагается, что они уже открыты) и просматривает первое поле в каждой строке. (При считывании вывода сценария need renewal в качестве ввода renewalnotify каждая сфока содержит несколько полей, но нам необходимо просмафивать только одну сфоку.) sub read file { my (Sfh) = shift; my (Sarg); while (defined ($arg = <Sfh>)) { # отсекаем все данные, следующие после первого столбца, # включая новую строку Sarg =~ s/\s.* s; # интерпретировать аргумент без рекурсии имени файла interpret argument ($arg, 0); Такой прием не будет работать с ОС fVindows, которая не имеет в своем арсенале программы sendmail Вместо нее нужно использовать какую-то другую программу рассылки. функция interpret argument () определяет, является ли аргумент идентификационным номером, электронным адресом или именем файла. В случае электронного адреса или имени файла эта функция находит соответствующую запись и передает полученные данные функции notif y member {). С электронными адресами нужно быть очень осторожными. Вполне возможно, что два члена имеют один и тот же адрес (например, муж и жена). При этом необходимо следить, чтобы сообщение не попало тому, кому оно не предназначено. Для того чтобы этого избежать, необходимо проверить, чтобы соответствие между идентификационным номером и электронным адресом было взаимно однозначным. Если адрес соответствует нескольким идентификационным адресам, он игнорируется и печатается предупреждение. В случае когда аргумент не похож на идентификационный номер или электронный адрес, он принимается за имя файла, который необходимо прочитать для дальнейшего ввода. И здесь необходимо быть предельно осторожными - не надо читать повторно файл, чтобы избежать опасности неопределенного цикла: sub interpret argument { my (Sarg, $recurse) = @ ; my ($query, $ary ref); if (Sarg =- / \d+S/) # цифровой идентификационный номер { notify member (Sarg) ; elseif (Sarg =- /(?/) # электронный адрес { # получить идентификационный номер, связанный с адресом # (должен быть только один) Squery = qq{ SELECT member id FROM member WHERE email = ? }; Sary ref = Sdbh->selectcol arrayref (Squery, undef, Sarg); if (scalar ({a($ary ref }) ==0) { warn He найдено соответствия для электронного адреса Sarg: проигнорированХп ; elseif (scalar ((?{Sary ref )) > 1) { warn Электронный адрес Sarg соответствует нескольким записям: проигнорирован \п ; else { notify member (Sary ref ->[0] ) ; else # имя файла { if (ISrecurse) { warn имя файла $arg в файле: проигнорированоХп ; else { open (IN, $arg) or die Нельзя открыть $arg: $!\n read file (\*IN); close (IN); Профаммный код функции notif y member (), рассылающей сообщения о возобновлении членства, выполняет следующие функции. Если определяется, что член общества не имеет элекфонного адреса, то ничего не остается как распечатать с помощью функцш! notif у member () предупреждение с уведомлением о том, что с ним надо будет связаться каким-либо другим способом. Можно вызвать функцию showmember, показьгеаюшую идентификационный номер в сообщении, чтобы отобразить всю запись - прежде всего для определения телефонного номера и адреса, например: # предупредить члена общества о том, что срок его членства # скоро истекает sub notify inember { my ($member id) = shift; my ($query, $sth, Sentry ref, @col name); warn Ставим в известность $member id. . . \n ; $query = qq{ SELECT * FROM member WHERE member id = ? }; $sth = $dbh->prepare ($query); $sth->execute ($member id); @col name = @{$sth->(NAME)}; $entry ref = $sth->fetchrowhashref (); $sth->finish 0; if (!$entry ref ) # номер не найден! warn Запись не найдена по члену $member id! \п ; return; open (OUT, ] $sendmail ) or die Программа рассылки не доступна\п ; print OUT EOF; To: $entry ref ->{email} Subject: Ваше членство в Исторической Лиге США нуждается в обновлении. Поздравляем. Ваше членство в Исторической Лиге США скоро истекает. Мы надеемся, что вы сможете найти несколько минут, чтобы связаться с нашим офисом на предмет продления своего членства. Подробная информация приведена внизу. Пожалуйста, обратите внимание на дату истечения срока вашего членства. Спасибо.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |