#!/usr/bin/perl
#
##############################################################################
$mailprog = '/usr/sbin/sendmail';
# Установите путь до программы sendmail на Вашем сервере.
$admin_email="mail@mail.ru";
# Смените на Ваш email сохраните знак перед @
$list_name="QG Kazakhstan новые поступления.";
# Название Вашей рассылки
$adminpass="111111";
# Административный пароль. Советуем поменять.
$sendto="1";
# Если значение этой переменной 1 то Вы будете получать письмо по электронной
# почте когда кто либо подписывается или отказывается от рассыки.
# Если значение 0 таких писем не будет.
$temp="1";
# Значение 1 - новый участник должен будет подтверждать подписку
# нажимая ссылку в специально посланном ему для этой цели письме.
# Значение 0 участник будет добавлен в список без подтверждения
$remove_notice="0";
# Поставьте значение 1 если хотите дать возможность подписчикам отказаться
# от рассылки прямо из письма. В каждом письме рассылки будет ссылка пройдя по которой
# пользователь удалит свой адрес из списка.
$html = "1";
# Значение 1 HTML версия рассылки, 0 текстовая версия.
$file = "addresses.txt";
# Файл в котором хранятся все адреса подписчиков. Лучше переименовать его для безопасности.
@bannedaddresses = ('john@johndoe.com','joe@joedoe.com');
# Адреса которые не смогут добавить себя в список рассылки (банлист)
$lock = "2";
# оставьте значение 2 если сервер позволяет использовать
# блокировку файла. Иначе удалите эту строчку.
@months = ('Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь');
@days = ('Воскресенье','Понедельник','Вторник','Среда','Четверг','Пятница','Суббота');
($mday,$mon,$year,$wday) = (localtime(time))[3,4,5,6];
$year += 1900;
$date = "$months[$mon] $mday, $year";
# URL Вашего сайта без HTTP://
$url = 'www.freyn.agava.ru';
$script_url = $ENV{'SCRIPT_NAME'};
print "Content-type:text/html";
✓
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$in{$name} = $value;
}
if ($in{'action'} eq "Подписать") {&subscribe}
if ($in{'action'} eq "Удалить") {&unsubscribe}
if ($in{'action'} eq "Отправить") {&send}
if ($in{'action'} eq "Загрузить") {&load}
if ($in{'adminpass'} ne "$adminpass") {&adminerror}
if ($in{'adminpass'} eq "$adminpass") {&adminform}
exit;
sub check
{
open(LIST,"$file");
if ($lock){
flock(LIST, $lock);
}
@addresses=<LIST>;
close(LIST);
foreach $member(@addresses)
{
chomp($member);
$in{'address'} = "$ENV{'QUERY_STRING'}";
if ($in{'address'} eq $member){&unsubscribe}
}
open(LIST,"temp.txt");
if ($lock){
flock(LIST, $lock);
}
@addresses=<LIST>;
close(LIST);
foreach $tempmember(@addresses)
{
chomp($tempmember);
$in{'address'} = "$ENV{'QUERY_STRING'}";
if ($in{'address'} eq $tempmember){&subscribetemp}
}
if("admin" eq $ENV{'QUERY_STRING'}){
&admin
}
}
sub subscribe
{
open(LIST,"$file");
if ($lock){
flock(LIST, $lock);
}
@addresses=<LIST>;
close(LIST);
if ($in{'address'}!~ /.*@.*..*/){&bademail}
foreach $bannedaddress(@bannedaddresses)
{
if ($in{'address'} eq $bannedaddress){&banned_message}
}
foreach $member(@addresses)
{
chomp($member);
if ($in{'address'} eq $member){&already_subscribed}
}
if ($temp eq "1") {
push (@addresses,$in{'address'});
open(LIST,">>temp.txt");
if ($lock){
flock(LIST, $lock);
}
print LIST "$in{'address'}";
close(LIST);
$message="Адрес электронной почты <font color=red>$in{'address'}</font> добавлен в список адресов ожидающих подтверждения.
Пожалуйста подтвердите Ваше желание получать почтовую рассылку $list_name . Для подтверждения подписки Вам надо щёлкнуть по
ссылке в письме которое мы Вам только что отправили. Письмо должно Вам прийти через несколько минут.";
&mailtemp;
&message;
exit;
}
else {
push (@addresses,$in{'address'});
open(LIST,">>$file");
if ($lock){
flock(LIST, $lock);
}
print LIST "$in{'address'}";
close(LIST);
$message="Этот e-mail адрес <font color=red>$in{'address'}</font> Успешно подписан на рассылку $list_name.";
&mailadd;
&message;
exit;
}
}
sub subscribetemp
{
open(LIST,"$file");
if ($lock){
flock(LIST, $lock);
}
@addresses=<LIST>;
close(LIST);
if ($in{'address'}!~ /.*@.*..*/){&bademail}
foreach $bannedaddress(@bannedaddresses)
{
if ($in{'address'} eq $bannedaddress){&banned_message}
}
push (@addresses,$in{'address'});
open(LIST,">>$file");
if ($lock){
flock(LIST, $lock);
}
print LIST "$in{'address'}";
close(LIST);
$message="Этот e-mail адрес <font color=red>$in{'address'}</font> был удалён из списка адресов ожидающих подтверждения подписки и
добавлен в список постоянных подписчиков на рассылку $list_name.";
&mailadd;
&message;
&unsubscribetemp;
exit;
}
sub bademail
{
$message="Похоже что Вы указали не совсем правильный e-mail адрес. Пожалуйста вернитесь назад и попробуйте ещё раз. Если
программа не позволяет добавить Ваш e-mail адрес напишите на e-mail <a href=mailto:$admin_email> $admin_email</a> and I'll и ваш адрес
будет добавлен в рассылку вручную. Извините за доставленные неудобства.";
&message;
exit;
}
sub banned_message
{
$message="Жаль, но Ваш адрес <font color=red>$in{'address'}</font> по каким то причинам был добавлен в чёрный список, и Вы не имеете
право подписаться на данную рассылку.";
&message;
exit;
}
sub already_subscribed
{
$message="Этот адрес <font color=red>$in{'address'}</font> уже подписан на
рассылку!";&message;
exit;
}
sub unsubscribe
{
open(LIST,"$file");
if ($lock){
flock(LIST, $lock);
}
@addresses=<LIST>;
close(LIST);$x=0;
foreach $member(@addresses)
{
&clean;
if ($in{'address'} eq $member){&deletemember}
$x++;
}
¬_found;
}
sub unsubscribetemp
{
open(LIST,"temp.txt");
if ($lock){
flock(LIST, $lock);
}
@addresses=<LIST>;
close(LIST);$x=0;
foreach $member(@addresses)
{
&clean;
if ($in{'address'} eq $member){@addresses[$x]="";
open(LIST,">temp.txt");
if ($lock){
flock(LIST, $lock);
}
foreach $member(@addresses)
{
&clean;
unless($member eq "")
{print LIST "$member";}
}}
$x++;
}
exit;
}
sub adminerror
{
$message="Похоже Вы не имеете прав администратора в данной рассылке, или просто ошиблись вводя свой пароль. Вернитесь назад и попробуйте ещё раз.";
&message;
exit;
}
sub admin
{
$message="<form action=mailmachine.cgi method=post> Пароль: <input type=password name=adminpass><BR><BR><input type=submit value=Ввести><input type=reset value=Очистить></FORM>";
&message;
exit;
}
sub clean
{
chomp($member);
$member=~ s/^s+//;
$member=~ s/s+$//;
}
sub not_found
{
$message="Адрес <font color=red>$in{'address'}</font>
не может быть удалён и з рассылки так как он на неё и не подписан!";
&message;
exit;
}
sub deletemember
{
@addresses[$x]="";
open(LIST,">$file");
if ($lock){
flock(LIST, $lock);
}
foreach $member(@addresses)
{
&clean;
unless($member eq "")
{print LIST "$member";}
}
$message="<font color=red>$in{'address'}</font> Был успешно удален из рассылки $list_name.";
&mailun;
&message;
exit;
}
sub mailadd{
open (MAIL, "|$mailprog -t") || die "Can't open $mailprog!";
print MAIL "From: $admin_email";
print MAIL "To: $in{'address'}";
print MAIL "Subject: Подтверждение подписки!";
print MAIL <<to_the_end;
Это письмо просто подтверждает подписку на рассылку $list_name.
to_the_end
close (MAIL);
if ($sendto eq "1") {
open (MAIL, "|$mailprog -t") || die "Can't open $mailprog!";
print MAIL "From: $admin_email";
print MAIL "To: $admin_email";
print MAIL "Subject: Подтверждение подписки";
print MAIL <<to_the_end;
$in{'address'} был подписан на рассылку $list_name.
to_the_end
close (MAIL);
}
}
sub mailtemp{
open (MAIL, "|$mailprog -t") || die "Can't open $mailprog!";
print MAIL "From: $admin_email";
print MAIL "To: $in{'address'}";
print MAIL "Subject: Подтверждение подписки";
print MAIL <<to_the_end;
Для того что бы подтвердить подписку на почтовую рассылку $list_name Вы должны нажать на ссылку расположенную внизу этого письма.
Повторное нажатие на эту же ссылку удалит Ваш адрес из списка рассылки. Если Вы не подписывались на нашу рассылку это значит что
кто то с IP адресом $ENV{'REMOTE_ADDR'} пытался сделать это за Вас. В этом случае Вам не надо нажимать на нижеприведённую ссылку и
больше никаких писем от нас Вы получать не будете.
http://$url$script_url?$in{'address'}
to_the_end
close (MAIL);
}
sub mailun{
open (MAIL, "|$mailprog -t") || die "Can't open $mailprog!";
print MAIL "From: $admin_email";
print MAIL "To: $in{'address'}";
print MAIL "Subject: Вы удалены из рассылки!";
print MAIL <<to_the_end;
Вы были удалены из списка рассылки $list_name. Если Вы захотите заново подписаться на нашу рассылку
можете сделать это в любое время с нашего сайта.
to_the_end
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.