Программирование >>  Программный интерфейс приложений 

1 ... 117 118 119 [ 120 ] 121 122 123 ... 264


Для посылки электронной почты сценарий 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: Ваше членство в Исторической Лиге США нуждается в обновлении.

Поздравляем. Ваше членство в Исторической Лиге США скоро истекает. Мы надеемся, что вы сможете найти несколько минут, чтобы связаться с нашим офисом на предмет продления своего членства. Подробная информация приведена внизу. Пожалуйста, обратите внимание на дату истечения срока вашего членства.

Спасибо.



1 ... 117 118 119 [ 120 ] 121 122 123 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика