On-Line Библиотека www.XServer.ru - учебники, книги, статьи, документация, нормативная литература.
       Главная         В избранное         Контакты        Карта сайта   
    Навигация XServer.ru








 

Список рассылки новостей

Помимо гостевой книги основным атрибутом серьезного Web-узла является список рассылки новостей. Perl-программа для выполнения рассылки довольно проста, при желании ее можно несколько улучшить, добавив новые возможности (см. листинг 9).

При создании Web-узла, ориентированного как на русскоязычных, так и на англоязычных посетителей, в программе предусмотрена возможность выдачи сообщений в соответствующем виде. Основная форма (рис. 3) в зависимости от языка узла должна обязательно содержать поле:

<input type='hidden' name='lang' value='english'> 

или

<input type='hidden' name='lang' value='russian'>

для распознавания языка выдачи сообщений.

Чтобы облегчить разбор программы рассылки новостей, в ней расставлены комментарии.

Листинг 9. Список рассылки новостей

#!/usr/local/bin/perl
############################
# SCRIPT: POSTER.CGI       #
# (c) Michael Yevdokimov   #
############################

require 'cgi_lib.pl';

$PathList='../mlist'; #физический путь к каталогу с базой посетителей
$PathNews='../mnews'; #физический путь к каталогу с документом для посылки
$ReturnPage='index.html' #страница, к которой нужно будет возвратиться

$mail_prog='/usr/sbin/sendmail'; #физический адрес к почтовой программе
$Title='News List'; #заголовок списка рассылки
$From='maillist\@mysite.ru'; #адрес списка рассылки
$Website='www.mysite.ru'; #источник списка рассылки для Subject
# Method Detection and Decoding
&Parse_Data;  # декодировать данные из формы / URL

$Lang=$CGI{'lang'};  # тип языка (Рус/Англ) 
$User=$CGI{'user_name'}; # имя посетителя
$Email=$CGI{'user_email'}; # email посетителя
$Flag=$CGI{'flag'}; # флаг для проверки некоторых условий в программе
$Command=$CGI{'command'}; # считать команду (send или '')

if ($Lang eq 'english') {
	$db='userbase.eng'; # база с иностранными подписчиками
        $nf='news.eng' # английская 'посылка' (обычный TXT)
} else {
        if ($Lang eq 'russian') {
        	$db='userbase.rus'; ' с российскими подписчиками
		$nf='news.rus'; русская 'посылка' (обычный TXT)
        } else {
		&Print_Head; # аналогично print 'Content-type:text/html\n\n';
		print '<H3>ATTENTION! ERROR OCCURED!<H3>\n';
		print 'PRESS <A HREF=\'$ENV{'HTTP_REFERER'}\'>[BACK]</A> TO RETURN!\n';
		exit(0);                       
        }
}

if ($Command eq 'send') { # проверка той самой команды
 	if ($db eq 'userbase.eng') {
		#Post English News
		&Post_News($User,$Email);
	} else {
		#Post Russian News
		&Post_News($User,$Email);
	}	
}

#Проверить значение атрибута flag
if ($Flag eq 'eng_yes') { # если информация верна
	&Check_Email; # вызвать подпрограмму проверки введенного email
	&Add_Record($Path,$db); # добавить запись в соответ. базу
	&Print_Head; 
	print 'Your records were added to database

\n'; print 'Click <a href=\'/$ReturnPage\'>here</a> to return...\n'; exit(0); } else { if ($Flag eq 'rus_yes') { &Check_Email; &Add_Record; &Print_Head; print 'Ваши данные занесены в базу данных

\n'; print 'Нажмите <a href=\'/$ReturnPage\'>здесь</a> для возврата...\n'; exit(0); } else { } } # вывести форму подтверждения правильности введенной информации if ($db eq 'userbase.eng') { #Английский вариант формы &Print_Head; print '<H2><b>News List Registration</b></H2>\n'; print '<PRE>\n'; print '<FORM METHOD=\'GET\' ACTION=\'/cgi-bin/poster.cgi\'>\n'; print '<input type=hidden name=lang value=english><br>\n'; print ' Your Name: <input type=text name=user_name size=15 value=\'$User\'><br>\n'; print 'Your Email: <input type=text name=user_email size=15 value=\'$Email\'><br>\n'; # добавляем в форму скрытое поле flag, значение которого проверяется # этой программой: если flag равен одному из двух указанных здесь # значений, то выполняется подпрограмма добавления пользователя в БД print '<input type=hidden name=flag value=eng_yes><br>\n'; print '<input type=submit value=\' Correct \'> '; print '<input type=reset value=\' Incorrect \'><br>\n'; print '</FORM>\n'; print '</PRE>\n'; } else { #Русский вариант формы &Print_Head; print '<H2><b>Регистрация в списке рассылки новостей</b> </H2>\n'; print '<PRE>\n'; print '<FORM METHOD=\'GET\' ACTION=\'/cgi-bin/poster.cgi\'>\n'; print '<input type=hidden name=lang value=russian><br>\n'; print ' Ваше имя: <input type=text name=user_name size=15 value=\'$User\'><br>\n'; print 'Ваш Email: <input type=text name=user_email size=15 value=\'$Email\'><br>\n'; # добавляем скрытое поле flag (см. описание выше) print '<input type=hidden name=flag value=rus_yes><br>\n'; print '<input type=submit value=\'Все правильно\'> '; print '<input type=reset value=\'Неправильно\'><br>\n'; print '</FORM>\n'; print '</PRE>\n'; } sub Add_Record { # подпрограмма записи посетителей в БД open (UB, '>>$PathList/$db') || die ('Error during adding a record $!'); print UB join ('::', '$User', '$Email'), '\n'; close (UB); } sub Post_News { # подпрограмма рассылки новостей #Открыть UB - базу пользователей open (UB, '$PathList/$db') || die ('Error during reading file $!'); while (<UB>) { $line=$_; ($User, $Email) = split (/::/, $line); #Направить вывод на 'email' open (MAIL, '|$mail_prog $Email'); print MAIL 'From: $From\n'; print MAIL 'Reply-to: $From\n'; print MAIL 'Subject: $Title from $Website\n'; print MAIL '\n\n'; print MAIL 'Dear $User,\n\n'; #Открываем файл новостей и считываем из него данные open (NF, '$PathNews/$nf') || die ('Error during reading file $!'); while (<NF>) { print MAIL '$_'; # направляем считанные данные на email } close (NF); # print MAIL '\n\nThis script was created by Michael Yevdokimov\n'; print MAIL 'Developer's website: http://www.basicnet.sonnet.ru\n'; print MAIL '\n\n'; close (MAIL); } close (UB); &Print_Head; print 'PRESS <A HREF=\'/$ReturnPage\'>[BACK]</A> TO RETURN!\n'; exit(0); } sub Check_Email { # подпрограмма проверки правильности введенного email &Err_Msg; if ($Email !~ /.+\@.+\..+/) { &Print_Head; &Err_Msg; print '$ErrMsg\n'; #print 'Location: $ENV{'HTTP_REFERER'}\n\n'; exit(0); } #exit(0); } sub Err_Msg { # функция вывода сообщения об ошибке в email if ($Lang eq 'english') { $ErrMsg='<B>ATTENTION! ERROR OCCURED!</B><P>\n <I>Email: <B>$Email</B> which you have entered is incorrect!</I><P>\n <B>PRESS [BACK] TO RETURN<B>\n'; return $ErrMsg; } else { $ErrMsg='<B>ВНИМАНИЕ! ВОЗНИКЛА ОШИБКА!</B><P>\n <I>Email: <B>$Email</B>, который вы ввели неправилен!</I><P>\n <B>НАЖМИТЕ [BACK] ДЛЯ ВОЗВРАТА</B>\n'; return $ErrMsg; } }

 

Назад       Главная