Консультация № 141164
01.08.2008, 11:35
30.00 руб.
01.08.2008, 15:34
0 1 0
Здравствуйте дорогие эксперты у меня вот кокая проблема, скачал я скрип для рассылки и подписки но когда я посылаю письма они приходят и не открывается проста в виде файла html и кодировка не cr1251, можно ли сделать чтоб я целиком html страничку вставлял и отправлял со своей кодировкой которая на странички, и чтоб после отправки возвращался на прежнею страничку для отправки, вот сам скрипт:

Код:
 #!/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




Приложение:
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 adminform
{

$number=0;
open(LIST,"$file");
if ($lock){
flock(LIST, $lock);
}
@addresses=<LIST>;
print LIST "$number";
close(LIST);
$number = push(@addresses);

print "<html><title>$list_name</title><body bgcolor=#d2d2d2>
<center><pre>



</pre>
<table width=500>
<td align=center>
<font face=arial>
<font face=arial size=+1 color=blue><b>$list_name</b></font>


В настоящее время <font color=red>$number</font> e-mail адресов в списке.<form action=mailmachine.cgi method=post><BR>Архив: <select name=archives>";

open(LIST,"archives/log.txt");
if ($lock){
flock(LIST, $lock);
}
@entries=<LIST>;
close(LIST);
@entries = reverse(@entries);
foreach $entry(@entries)
{
print "<option>$entry";
$x++;
}


print "</select><input type=submit name=action value=Загрузить></form><form action=mailmachine.cgi method=post>Тема: <input type=text name=subject><BR><BR>Сообщение: <BR><textarea name=message rows=12 cols=50></textarea><BR><BR><input type=submit name=action value=Отправить><input type=reset value=Очистить name=></FORM><BR><form action=mailmachine.cgi method=post><input type=text name=address> <input type=submit name=action value=Подписать>
<TABLE><TR><TD><form action=mailmachine.cgi method=post><select name=address size=6>";

@addresses = sort(@addresses);
foreach $member(@addresses)
{
print "<option>$member";
$x++;
}

print "</select></TD></TR><TR><TD><CENTER><input type=submit name=action value=Удалить></CENTER></TD></TR></TABLE></form></form>";
#
#
#

print "<BR><BR><BR><BR>
<font face=arial size=-1>ffffffffffffffff<BR>
Free from <A HREF="http://fffffff">fffffff</A></font>
<BR><BR>
</td>
</table>
</body></html>";
}

sub load
{

$number=0;
open(LIST,"$file");
if ($lock){
flock(LIST, $lock);
}
@addresses=<LIST>;
print LIST "$number";
close(LIST);
$number = push(@addresses);

print "<html><title>$list_name</title><body bgcolor=#d2d2d2>
<center><pre>



</pre>
<table width=500>
<td align=center>
<font face=arial>
<font face=arial size=+1 color=blue><b>$list_name</b></font>


В настоящее время <font color=red>$number</font> e-mail адресов имеются в списке.<form action=mailmachine.cgi method=post><BR>Архив: <select name=archives>";

open(LIST,"archives/log.txt");
if ($lock){
flock(LIST, $lock);
}
@entries=<LIST>;
close(LIST);
@entries = reverse(@entries);
foreach $entry(@entries)
{
print "<option>$entry";
$x++;
}

print "</select><input type=submit name=action value=Загрузить></form><form action=mailmachine.cgi method=post>Тема: <input type=text name=subject value="";

open(FILE,"archives/$in{'archives'}.txt");
while (<FILE>) {
($message, $subject) = split /::/;

if($subject ne "")
{
print "$subject"";
}
}
close(FILE);

print "><BR><BR>Сообщение: <BR><textarea name=message rows=12 cols=50>";

open(FILE,"archives/$in{'archives'}.txt");
while (<FILE>) {
($message, $subject) = split /::/;
print "$message";
}
close(FILE);

print "</textarea><BR><BR><input type=submit name=action value=Отправить><input type=reset value=Очистить name=></FORM><BR><form action=mailmachine.cgi method=post><input type=text name=address> <input type=submit name=action value=Подписать>
<TABLE><TR><TD><form action=mailmachine.cgi method=post><select name=address size=6>";

@addresses = sort(@addresses);
foreach $member(@addresses)
{
print "<option>$member";
$x++;
}

print "</select></TD></TR><TR><TD><CENTER><input type=submit name=action value=Удалить></CENTER></TD></TR></TABLE></form></form>";
#
#
#

#
print "<BR><BR><BR><BR>
<font face=arial size=-1>rrrrrrrrr 2008<BR>
Free from <A HREF="http://rrrrrrrrrrrrrrrrrr">rrrrrrrrrrrrrrrrrrrrrrrrrr</A></font>
<BR>
</td>
</table>
</body></html>";
exit;
}

sub send
{
$pid = fork();
$pid;
if ($pid) {
&sendcomplete;
&archive;
exit(0);
}
else {
close (STDOUT);

open(LIST,"$file");
if ($lock){
flock(LIST, $lock);
}
@addresses=<LIST>;
close(LIST);

foreach $member(@addresses)
{
chomp($member);

open (MAIL, "|$mailprog -t") || die "Can't open $mailprog!";
if ($html eq "1") {
print MAIL "Content-type:text/html";
}
print MAIL "From: $admin_email";
print MAIL "To: $member";
print MAIL "Subject: $in{'subject'}";
print MAIL "$in{'message'}";
if ($remove_notice eq "1") {
if ($html eq "1") {
print MAIL <<to_the_end;
<BR><BR>
---------------------------------------------------------------------<BR>
Если Вы больше не хотите получать нашу рассылку просто нажмите на ссылку ниже чтобы удалить свой адрес из списка рассылки
$list_name.<BR><BR>

<A HREF="http://$url$script_url?$member">http://$url$script_url?$member</A><BR>
---------------------------------------------------------------------
to_the_end
}
else {
print MAIL <<to_the_end;
---------------------------------------------------------------------
Нажмите на ссылку ниже чтобы удалить свой адрес из списка рассылки
$list_name.

http://$url$script_url?$member
---------------------------------------------------------------------

to_the_end
}
}
close (MAIL);
}
&confirmation;
exit;
}
}

sub archive
{
open(LIST, ">>archives/log.txt");
if ($lock){
flock(LIST, $lock);
}
print LIST "$date - $in{'subject'}";
close(LIST);

$message = "$in{'message'}";
$subject = "$in{'subject'}";
$new_entry = $message . "::" .
$subject;
open(FILE, ">>archives/$date - $in{'subject'}.txt");
if ($lock){
flock(FILE, $lock);
}
print FILE "$new_entry";
close(FILE);
}

sub sendcomplete
{
$message="Поздравляю. Отправка рассылки адресатам была начата. После завершения рассылки Вы получите подтверждение.";
&message;
}

sub confirmation
{
open (MAIL, "|$mailprog -t") || die "Can't open $mailprog!";
if ($html eq "1") {
print MAIL "Content-type:text/html";
}
print MAIL "From: $admin_email";
print MAIL "To: $admin_email";
print MAIL "Subject: Поздравляю!";
if ($html eq "1") {
print MAIL <<to_the_end;
Поздравляю! Рассылка произведена успешно. Было разослано следующее сообщение:<BR><BR>

$in{'message'}
to_the_end
close (MAIL);
}
else {
print MAIL <<to_the_end;
Поздравляю! Рассылка произведена успешно. Было разослано следующее сообщение:<BR><BR>:

$in{'message'}
to_the_end
close (MAIL);
}
}

sub message
{
print qq~
<html><title>$list_name</title><body bgcolor=#d2d2d2>
<center><pre>


</pre>
<table width=500>
<td align=center>
<font face=arial>
<font face=arial size=+1 color=blue><b>$list_name</b></font>


$message~;
#
#
#
#
print "<BR><BR><BR><BR>
<font face=arial size=-1>rrrrrrrrrrrrrrrrrrrrrr<BR>
Free from <A HREF="http://rrrrrrrrrrrrrrrrrrrrrrrrrr">rrrrrrrrrrrrrrrrrrrrrrr</A></font>
<BR>
</td>
</table>
</body></html>";
}
open (MAIL, "|$mailprog -t") || die "Can't open $mailprog!";
if ($html eq "1") {
print MAIL "Content-type:text/html";
}
print MAIL "From: $admin_email";
print MAIL "To: $admin_email";
print MAIL "Subject: Поздравляю!";
if ($html eq "1") {
print MAIL <<to_the_end;
Поздравляю! Рассылка произведена успешно. Было разослано следующее сообщение:<BR><BR>

$in{'message'}
to_the_end
close (MAIL);
}
else {
print MAIL <<to_the_end;
Поздравляю! Рассылка произведена успешно. Было разослано следующее сообщение:<BR><BR>:

$in{'message'}
to_the_end
close (MAIL);
}
}

sub message
{
print qq~
<html><title>$list_name</title><body bgcolor=#d2d2d2>
<center><pre>


</pre>
<table width=500>
<td align=center>
<font face=arial>
<font face=arial size=+1 color=blue><b>$list_name</b></font>


$message~;
#
#
#
#
print "<BR><BR><BR><BR>
<font face=arial size=-1>rrrrrrrrrrrrrrrrrrrrrr<BR>
Free from <A HREF="http://rrrrrrrrrrrrrrrrrrrrrrrrrr">rrrrrrrrrrrrrrrrrrrrrrr</A></font>
<BR>
</td>
</table>
</body></html>";
}

Обсуждение

Неизвестный
01.08.2008, 12:10
общий
можно :)
при беглом взгляде все и так должно работать..

но ИМХО легче написать заново чем ковырять никак не комментированный скрипт
Форма ответа