Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подтверждение на Perl 
:(
    Опции темы
Digo
Дата 16.4.2005, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 30.9.2004
Где: Ростов на Дону

Репутация: нет
Всего: нет



Вот опять столкнулся с проблемами:
Вроде скрипт работает, выводит параметры, но почту не отсылает, в чем может быть дело?

Код

#!/usr/bin/perl
#$mail_prog = '/usr/sbin/sendmail' ;
#$recipient = '[email protected]';
use strict;
use CGI qw( :standard ); print header( -charset => 'Windows-1251');
my $LastName = param('lastname') ;
print "Подтверждение: ", $LastName, "<BR>";

open (MAIL,"|/usr/sbin/sendmail");
print MAIL "To: xxx\@mail.ru\n";
print MAIL "Content-Type: text/plain; charset=windows-1251\n";
print MAIL "From: digo\@list.ru\n";
print MAIL "Subject: Subject\n\n";
print MAIL "Подтверждение от ".$LastName." \n" ;
close MAIL;


--------------------
640кб оперативной памяти хватит миру по самые уши (Билл Гейтс )
PM MAIL WWW ICQ   Вверх
Secandr
Дата 17.4.2005, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



а точно путь /usr/sbin/sendmail

где ты его взял?


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Digo
Дата 17.4.2005, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 30.9.2004
Где: Ростов на Дону

Репутация: нет
Всего: нет



Да, я в супорте своего хоста спросил, они сказали /usr/sbin/sendmail К тому же у меня работает другой скрипт отправки почты, у него тот же путь...
--------------------
640кб оперативной памяти хватит миру по самые уши (Билл Гейтс )
PM MAIL WWW ICQ   Вверх
korob2001
Дата 17.4.2005, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Код

open (MAIL,"|/usr/sbin/sendmail");

Добавь ключи:
Код

open (MAIL,"|/usr/sbin/sendmail -t -oi -odq");

-t - Поля заголовка берутся из входных данных, а не из командной строки
-oi - Символ точки не считать признаком конца сообщения
-odq - Ставит сообщения в очередь, а не пытается отправить его немедленно, этот ключ можно убрать, но без него sendmail становится уязвим при атаке "Отказ от обслуживания".


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Digo
Дата 18.4.2005, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 30.9.2004
Где: Ростов на Дону

Репутация: нет
Всего: нет



Спасибо smile smile , теперь работает, правда письма с задержкой доходят...
Последний шаг это редирект после выполнения скрипта... Я как понял он осуществляется
print "Location: http://www.mysite.ru/\n\n";

когда выполняю скрипт, все просто выводится на экран, и никуда не переходит...
--------------------
640кб оперативной памяти хватит миру по самые уши (Билл Гейтс )
PM MAIL WWW ICQ   Вверх
korob2001
Дата 18.4.2005, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Для того, что бы работал редирект, им нужно заменить заголовок:
print "Content-type: text/html\n\n";
Т.е. строку заголовка нужно заменить следующей:
Код

print "Location: http://yandex.ru\n\n";

Если используешь CGI.pm, то заголовок:
Код

print $cgi->header();

Нужно заменить на такой
Код

my $cgi = new CGI;
print $cgi->redirect( -uri => 'http://yandex.ru' );


Если нужно просто перенаправить пользователя через определённое кол-во секунд, то вставляешь в код страницы, с которой будет осуществляться перенаправление, такую строку в раздел <HEAD></HEAD>:
Код

<meta HTTP-EQUIV="Refresh" CONTENT="5;URL='http://yandex.ru'">

Другими словами, в HTML коде это будет выглядеть примерно так:
Код

<html>
 <head>
   <meta HTTP-EQUIV="Refresh" CONTENT="5;URL='http://yandex.ru'">
    <title>Перенаправление</title>
 </head>
 <body>
   <!--// Здесь тело документа //-->
 </body>
</html>

В последнем примере, перенаправление произойдёт через 5 секунд.
Удачи.

Это сообщение отредактировал(а) korob2001 - 18.4.2005, 19:02


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Digo
Дата 18.4.2005, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 30.9.2004
Где: Ростов на Дону

Репутация: нет
Всего: нет



В принципе все понятно... только вот что менять?, нужно же оставить print header( -charset => 'Windows-1251');(чтоб русские буквы отображал)??? А если дописывать пишет Status: 302 Moved Location:http://yandex.ru
Кстати редирект будет осуществлятся после отправки письма?

Код

use strict;
use CGI qw( :standard );
print header( -charset => 'Windows-1251');
my $cgi = new CGI;
print $cgi->redirect( -uri => 'http://yandex.ru' );

....



--------------------
640кб оперативной памяти хватит миру по самые уши (Билл Гейтс )
PM MAIL WWW ICQ   Вверх
korob2001
Дата 18.4.2005, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



redirect() - это и есть хеадер, только с перенаправлением.
charset - указывай на той странице, куда перенаправляешь пользователя, можешь ещё указать прямо в redirect'e.
Код

print $cgi->redirect( -uri => 'http://yandex.ru',
                      -charset => 'Windows-1251' );

Если используешь redirect, то header не нужен.
Код

use strict;
use CGI;
my $cgi = new CGI;
print $cgi->redirect( -uri => 'http://yandex.ru',
                       -charset => 'Windows-1251' );

Удачи.

ЗЫ: если используешь CGI.pm объектно ориентированно, то не нужно указывать qw( :standard ). Просто пиши так use CGI; , создавай объект и орудуй всеми методами и свойствами этого, чудного, модуля.

Это сообщение отредактировал(а) korob2001 - 18.4.2005, 23:46


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Digo
Дата 19.4.2005, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 30.9.2004
Где: Ростов на Дону

Репутация: нет
Всего: нет



Большое спасибо smile , а то я никак не знал как редирект осуществлять, только теперь письма не отправляет, похоже просто не выполняется все что ниже, как же тогда делать если нужно осуществлять редирект после отправки письма?
--------------------
640кб оперативной памяти хватит миру по самые уши (Билл Гейтс )
PM MAIL WWW ICQ   Вверх
korob2001
Дата 19.4.2005, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Разбей программу на подпрограммы, там геде нужен redirect, юзай redirect, там где нужен header, юзай header.

Структура примерно такая:
Код

#!/usr/bin/perl -w
use strict;
use CGI;
my $cgi = new CGI;

sub show_form {
       
       print $cgi->header( -charset => 'Windows-1251' );
       # Здесь тело подпрограммы выводящей форму в браузер

}


sub send_mail {

      # Здесь тело подпрограммы которая отправляет E-mail
      # ни header, ни redirect здесь не нужны

      # Здесь отправляем письмо

      # А здесь перенаправляем пользователя
      enjoy();
      
}


sub user_controll {

      # Здесь тело подпрограммы, которая проверяет полученные параметры
      # Ни header, ни redirect здесь не нужны

}


sub enjoy {
      
      # Здесь перенаправляем юзера
      print $cgi->redirect( -charset => 'indows-1251',
                            -uri => 'http://yandex.ru' );
     
}

# Здесь делаем условия по которым будем запускать ту, или иную подпрограмму
if ( defined $cgi->param('send') ) {
     # Если программа получила параметр send, запускаем подпрограмму проверки данных
     # если она вернёт истенное значение значит данные обрботаны и в порядке. Тогда
     # передадим управление подпрограмме send_mail();
     send_mail if user_controll();
} else {
     # Если параметры не полученны, выводим форму в браузер
     show_form();
}

Получается такая последовательность, когда запускается программа, она пропускает все подпрограммы. Когда доходит до условного выражения if ...else она проверяет был ли передан программе параметр send - это может быть имя кнопки SUBMIT.

Если параметр определён, то значит пользователь нажал кнопку SUBMIT и нам нужно сделать проверку данных если подпрограмма user_controll вернула истенное значение, то значит данные проверены и готовы к отправке. Запускаем подпрограмму send_mail.

Далее подпрограмма send_mail отправляет данные и из неё запускается подпрограмма enjoy, которая и перенаправляет пользователя на нужную тебе страницу.

Вообще-то я упростил код и условия для наглядности, для удобства можно было бы передавать параметры из одной подпрограммы, в другую. Не мешало бы ещё создать подпрограмму, которая выводила бы ошибки, если подпрограмма user_controll их опеределит. Но это уже лирика, цель была объяснить принцип и удобство работы программы, которая разбита на несколько подпрограмм.

Вроде понятно изложил.

Удачи.

Это сообщение отредактировал(а) korob2001 - 19.4.2005, 21:09


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Digo
Дата 23.4.2005, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 30.9.2004
Где: Ростов на Дону

Репутация: нет
Всего: нет



Спасибо за программу, я вчера в ней разбирался весь вечер с книгой (вернее в использовании процедур smile ) Вот только вопрос нельзя ли как-то упростить программку, мне например не нужно проверять данные и передавать параметр или выводить что-то в браузере(это я делал для проверки) Мне только нужно отправить в письме переданный по ссылке параметр и после осуществить редирект на html страницу.
Пытаюсь вызвать процедуру с конца, но че-то не пашет...

Код

#!/usr/bin/perl -w
use strict;
use CGI;
my $cgi = new CGI;

sub enjoy {

      # Здесь перенаправляем юзера
      print $cgi->redirect( -charset => 'Windows-1251',
                            -uri => 'http://yandex.ru' );

}



open (MAIL,"|/usr/sbin/sendmail -t -oi -odq");
print MAIL "To: orders\@helpos.org\n";
print MAIL "Content-Type: text/plain; charset=windows-1251\n";
print MAIL "From: xxx\@mail.ru\n";
print MAIL "Subject: Subject\n\n";
print MAIL "Переданный  параметр ".$LastName." \n" ;
close MAIL;

enjoy();


--------------------
640кб оперативной памяти хватит миру по самые уши (Билл Гейтс )
PM MAIL WWW ICQ   Вверх
korob2001
Дата 23.4.2005, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Ну, а где переменная $LastName получает параметр??? Вобщем замени строку:
Код

print MAIL "Переданный  параметр ".$LastName." \n" ;

На такую:
Код

print MAIL "Переданный  параметр ". $cgi->param('lastName') ." \n" ;

Естественно измени lastName на сой параметр.

ЗЫ: Только этот код очень опасен, я надеюсь ты понимаешь почему.

Удачи.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Digo
Дата 23.4.2005, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 30.9.2004
Где: Ростов на Дону

Репутация: нет
Всего: нет



Да, я просто не все скопировал...
Все равно ошибки не возникает, редирект проходит, а письмо не отсылается:
Код

#!/usr/bin/perl -w
use strict;
use CGI;
my $cgi = new CGI;

sub enjoy {

      # Здесь перенаправляем юзера
      print $cgi->redirect( -charset => 'Windows-1251',
                            -uri => 'http://yandex.ru' );

}


print "Переданный  параметр ". $cgi->param('lastName') ." \n" ;
open (MAIL,"|/usr/sbin/sendmail -t -oi -odq");
print MAIL "To: orders\@helpos.org\n";
print MAIL "Content-Type: text/plain; charset=windows-1251\n";
print MAIL "From: xxx\@mail.ru\n";
print MAIL "Subject: Subject\n\n";
print MAIL "Переданный  параметр ". $cgi->param('lastName') ." \n" ;
close MAIL;

enjoy();

А на счет опасности догадываюсь... типа можно ящик завалить письмами кликая по ссылке, но я пока только начинающий... так что эту проблему оставлю на будущее.
--------------------
640кб оперативной памяти хватит миру по самые уши (Билл Гейтс )
PM MAIL WWW ICQ   Вверх
korob2001
Дата 23.4.2005, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Только что проверил, всё работает только строку:
Код

print "Переданный  параметр ". $cgi->param('lastName') ." \n" ;

нужно убрать.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Digo
Дата 23.4.2005, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 30.9.2004
Где: Ростов на Дону

Репутация: нет
Всего: нет



Да, верно просто у меня сервер тормозит только сейчас письмо дошло smile , только в письме не пришел сам параметр
Пришло: Переданный параметр и все...
--------------------
640кб оперативной памяти хватит миру по самые уши (Билл Гейтс )
PM MAIL WWW ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.1544 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.