Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Запрет на отправку письма
 
 автор: relikt   (15.12.2007 в 18:19)   письмо автору
 
 

Есть скрипт.

<?
$error 
"";
@
$action $_POST["action"];
if (!empty(
$action)) 
{
    
$lenmsg strlen($_POST["com"]);
    
$templen 0;
    
$temp strtok($_POST["com"], " ");
    if (
strlen($_POST["com"])>40) {    
        while (
$templen $lenmsg) { 
            if (
strlen($temp)>40) {
                
$action ""
                
$error $error."<LI>Текст сообщения содержит слишком много символов без пробелов</LI>\n";
                break;
            } else {
                
$templen $templen strlen($temp) + 1;
            }
            
$temp strtok(" ");            
        }       
    }

    
$name trim($_POST["name"]);
    
$com trim($_POST["com"]);
    
$contacts trim($_POST["contacts"]);
    
$url trim($_POST["url"]);

    
$name substr($name060);
    
$name htmlspecialchars(stripslashes($name));
    
$contacts substr($contacts060);
    
$contacts htmlspecialchars(stripslashes($contacts));
    
$url substr($url060);
    
$url htmlspecialchars(stripslashes($url));
    
$com substr($com06000);
    
$com htmlspecialchars(stripslashes($com));

    if (empty(
$name)) 
    {
        
$action ""
        
$error $error."<LI>Вы не написали ваше имя</LI>\n";
    }

    if (empty(
$contacts)) 
    {
        
$action ""
        
$error $error."<LI>Вы не написали ваш email</LI>\n";
    }
  elseif (!
preg_match("/^[0-9a-z_-]+@[0-9a-z_^\.]+\.[a-z]{2,6}$/i"$contacts))
  {
        
$action ""
        
$error $error."<LI>Пишите email в виде somebody@server.com</LI>\n";
  }

    if (!empty(
$url)) 
    {
  
  if (!
preg_match("#(http://|www\.|http://www\.)[-a-z0-9_\.]+\.([a-z]\.[a-z])?([-a-z0-9_]+\.(html|php|pl|cgi))?([a-z])?#i"

$url)) 
  {
        
$action ""
        
$error $error."<LI>Пишите адрес вашего сайта в виде http://server.com</LI>\n";
  } 
}

    if (empty(
$com)) 
    {
        
$action ""
        
$error $error."<LI>Вы ничего не написали в письме</LI>\n";
    }


    if (empty(
$error)) 
    {
$data date("d.m.Y H:i:s");
$valmail "mail@mail.mail";
$all "

Дата: 
$data\r\n
Имя: 
$name\r\n
Адрес сайта: 
$url.\r\n
E-mail для связи: 
$contacts.\r\n
Содержание письма: 
$com\r\n";

$thm "письмо";
$headers "From: mail@mail.mail";

if(
mail($valmail$thm$all$headers)) {
$data $name $url $contacts $com "";
unset(
$com);
echo 
"<hr><p>Спасибо! Ваше сообщение отправлено.</p><hr>";
}


    }
}

if (empty(
$action) || !empty($action)) 
{
    
?>
    <?
    
if (!empty($error) || !empty($err)==1
    {
        print 
"<hr><P>Во время отправки сообщения произошли следующие ошибки: </P>\n";
        print 
"<UL class=list type=1>\n";
        print 
$error;
        print 
"</UL><hr>\n";

    
?>

<div class="form">
<h2>Контактная информация</h2>
<form action="mail.php" method="POST">
<input type=hidden name=action value=post>

<div class="width20">Ваше имя: *
<div class="inp">
<input type="text" name="name" value="<? if (isset($name)) echo htmlspecialchars(stripslashes($name)); ?>">
</div></div>

<div class="width50">Ваш E-mail: *
<div class="inp">
<input type="text" name="contacts" value="<? if (isset($contacts))  echo htmlspecialchars(stripslashes($contacts)); ?>">
</div></div>

<div class="width50">Ваш сайт:
<div class="inp">
<input type="text" name="url" value="<? if (isset($url)) echo htmlspecialchars(stripslashes($url)); ?>">
</div></div>

<div class="width150">
Ваше письмо: *
<div class="inp">
<textarea name="com" rows="10" cols="45"><? if (isset($com)) echo htmlspecialchars(stripslashes($com)); ?></textarea>
</div></div>

        <div class="formmail">
            <input type="submit" class="submit" value="" name="go">
        </div>
</form>
</div>

    <?

?>

Такой вопрос, как сделать так, чтобы пользователь мог отправить сообщение только один раз. То есть при нажатии обновить страницу письмо не отправлялось ещё раз, а предлагалось заполнить пустые поля. Можно ли как то это сделать не создавая перенаправлений на другие страницы?

   
 
 автор: sim5   (15.12.2007 в 18:47)   письмо автору
 
   для: relikt   (15.12.2007 в 18:19)
 

А это что означает?:
if (empty($action) || !empty($action))
Зачем проверка, в которой нет смысла?

   
 
 автор: relikt   (15.12.2007 в 19:12)   письмо автору
 
   для: sim5   (15.12.2007 в 18:47)
 

Правильно. Моя ошибка. Исправил.

   
 
 автор: relikt   (15.12.2007 в 19:32)   письмо автору
 
   для: relikt   (15.12.2007 в 19:12)
 

А есть возможность как то решить эту проблему. Нашёл способ с помощью капчи, но не хочется её использовать ради отправки письма на сайт.

   
 
 автор: sim5   (15.12.2007 в 19:47)   письмо автору
 
   для: relikt   (15.12.2007 в 19:32)
 

Есть, передать заголовок (на самого себя) после отправки почты, но для этого нужно внести коррективы в ваш код.

   
 
 автор: relikt   (15.12.2007 в 20:10)   письмо автору
 
   для: sim5   (15.12.2007 в 19:47)
 

Такой:

        print "<HTML><HEAD>\n";
        print "<META HTTP-EQUIV='Refresh' CONTENT='0; URL=mail.php'>\n";
        print "</HEAD></HTML>\n";

?. Я это уже пробовал, но пока всё не то. Если вставить этот код после отправки сообщения, то происходит редерикт и прочитать сообщение не успеваешь, при том не желательно его делать. Поэтому мне интересно, а после отправки сообщения можно ли обнулить как то переменную action, что бы приходилось данные заново вводить и нельзя было отправить сообщение обновляя страницу.

   
 
 автор: sim5   (15.12.2007 в 20:33)   письмо автору
 
   для: relikt   (15.12.2007 в 20:10)
 


<?
if(mail($valmail$thm$all$headers)) { 
  
//перенаправляем с уведомлением 
  
header('location: mail.php?send=1');
}
//так же как и вывод ошибок
if (!empty($_GET['send'])) echo '<hr><p>Спасибо! Ваше сообщение отправлено.</p><hr>';

Но вам еще надо внести изменения, пудумайте где и что.

   
 
 автор: mihdan   (15.12.2007 в 21:03)   письмо автору
 
   для: sim5   (15.12.2007 в 20:33)
 


<?
if(mail($valmail$thm$all$headers)) { 
  
//перенаправляем с уведомлением 
  
header('location: mail.php?send=1&rnd='.time());

?>

   
 
 автор: relikt   (15.12.2007 в 21:31)   письмо автору
 
   для: sim5   (15.12.2007 в 20:33)
 


<?
$send 
$_POST["send"];
if (!empty(
$action) && $send == ""

////////........./////////

if(mail($valmail$thm$all$headers))
        {  
  
//перенаправляем с уведомлением  
  
header('location: mail.php?send=1'); 
        } 
//так же как и вывод ошибок 
if (!empty($_GET['send'])) echo '<hr><p>Спасибо! Ваше сообщение отправлено.</p><hr>';
?>

В форму добавил

<input type="hidden" name="send" value="">

И получил тот же результат, что и был. Я так понимаю, в форме полюбому должна присутствовать переменная send. Тогда почему вы её проверяете при отправке сообщения, что всё нормально.

   
 
 автор: sim5   (15.12.2007 в 22:09)   письмо автору
 
   для: relikt   (15.12.2007 в 21:31)
 

Перенаправление спасет вас от повторной отправки почты, а вот сообщение будет присутвовать всегда, а чтобы понять почему, взгляньте на url при вызове скрипта и после отправки почты, там присутвует переменная send, потому обновляя страницу, вы передаете ее вновь. Не знаете как избавиться? А есть механизм - сессии, и если написать так:

<?
$_SESSION
['send'] = 1;  
header('location: mail.php');

А дальше подумайте как этим можно воспользоваться. Но вот какое дело, поняв как это сделать, вы реально избаветесь от этого, но визуально она у вас будет присутсвовать, конечно если при вводе не произойдет ошибка.

   
 
 автор: relikt   (15.12.2007 в 23:04)   письмо автору
 
   для: sim5   (15.12.2007 в 22:09)
 

Отлично всё заработало, кроме вывода сообщения об удачной отправке сообщения. Вот, что у меня получилось:


<?
session_start
();
$_SESSION['send'] = 1
.......
if(
mail($valmail$thm$all$headers))
        {
  
//перенаправляем с уведомлением  
  
header('location:  index.php?send=1');
        }
//так же как и вывод ошибок 
if (!empty($_GET['send'])) echo '<hr><p>Спасибо! Ваше сообщение отправлено.</p><hr>';
.....


Всё правильно? А как выдать "Спасибо! Ваше сообщение отправлено."?

   
 
 автор: sim5   (15.12.2007 в 23:26)   письмо автору
 
   для: relikt   (15.12.2007 в 23:04)
 

Нет, вы не поняли. Если использовать сессию, то для того, чтобы избавиться от вывода сообщения благодарности. Значит в хидере не надо пердавать переменную send. Стартуете сессию, а переменную $_SESSION['send'] устанавливаете после отправки почты, потом делаете перенаправление.
Вместо $_GET['send'] проверяете $_SESSION['send'] и если она установлена, выводите сообщение, после чего эту переменную очищаете или удаляете. После этого повторного вывода сообщения уже быть не должно при обновлении страницы.
Но подумайте сами. Некто отправил письмо, получил "Спасибо..." и опять форму ввода, если теперь опять отправить почту, опять получим сообщение "Спасибо..." и т.д., если смысл тогда убирать его? Если это были бы разные пользователи за одним компьютером, то можно в сообщение передавать хотя бы имя пользователя, для разнообразия. :)
И еще. Мне могут возразить, но я высказываю свое мнение, потому как привык определять переменные, прежде чем обращаться к ним, а РНР несколько вольно поступает в этом вопросе. Почему бы вам не сделать так:

<?
session_start
();
$error "";
$action   = !empty($_POST["action"]) ? $_POST["action"] : "";
$name     = !empty($_POST["name"]) ? trim($_POST["name"]) : "";
$com      = !empty($_POST["com"]) ? trim($_POST["com"]) : "";
$contacts = !empty($_POST["contacts"]) ? trim($_POST["contacts"]) : "";
$url      = !empty($_POST["url"]) ? trim($_POST["url"]) : "";
//далее думаю понятно какие лишние строки можно выбросить из вашего кода
.....
?>
//а в форме
<input type="text" name="name" value="<?=$name;?>">
<input type="text" name="contacts" value="<?=$contacts;?>">
//и так далее

Можете конечно пользоваться для подавления и собачкой, либо подавить вывод предупреждений на экран, решать вам, но правильно оформить отправку почты (заголовки) вы обязаны.

   
 
 автор: Unkind   (15.12.2007 в 23:56)   письмо автору
 
   для: sim5   (15.12.2007 в 23:26)
 

Лучше бы заменить "!empty" на "isset", а то как-то смысл теряется.

   
 
 автор: sim5   (16.12.2007 в 00:13)   письмо автору
 
   для: Unkind   (15.12.2007 в 23:56)
 

Вообще-то да, ведь дальше идет проверка значений.

   
 
 автор: relikt   (16.12.2007 в 10:39)   письмо автору
 
   для: sim5   (15.12.2007 в 23:26)
 

У меня получилось так.

<?
session_start
();
......
if(
mail($valmail$thm$all$headers))
        {
  
$_SESSION['send'] = 1
  
header('location:  index.php?send=1'); 
        }
//так же как и вывод ошибок 
if (!empty($_SESSION['send'])) echo "<hr><p>Спасибо! Ваше сообщение отправлено.</p><hr>";
unset(
$_SESSION['send']);
?>

Но сообщения я так и не увидел. Ни разу.

   
 
 автор: sim5   (16.12.2007 в 10:56)   письмо автору
 
   для: relikt   (16.12.2007 в 10:39)
 


$_SESSION['send'] = 1;  
  header('location:  index.php');

Не надо в хидере send передавать. Но, перенаправление теперь у вас идет на index.php, а проверка $_SESSION['send'] и вывод сообщения в этом файле, и если мне память не изменяет, он у вас называется mail.php - конечно никакаго сообщения вы не увидите.

   
 
 автор: relikt   (16.12.2007 в 12:48)   письмо автору
 
   для: sim5   (16.12.2007 в 10:56)
 

Да всё так, я просто переименовал файл для удобства. По названиям всё нормально. Файл называется index.php и перенаправление я делаю на него. Но от этого ничего не меняется, я убрал из хидера переменную, а сообщения по прежнему нет. Перенаправление ведь происходит и переменную я устанавливаю сразу после отправки письма.

   
 
 автор: sim5   (16.12.2007 в 12:50)   письмо автору
 
   для: relikt   (16.12.2007 в 12:48)
 

Ну если так, то проверьте - у вас сессия работает, создается ли она?

   
 
 автор: relikt   (16.12.2007 в 13:21)   письмо автору
 
   для: sim5   (16.12.2007 в 12:50)
 

Да создаётся.

   
 
 автор: sim5   (16.12.2007 в 13:25)   письмо автору
 
   для: relikt   (16.12.2007 в 13:21)
 

Ну значит все должно работать. Вот, все ваше (с изменениями небольшими), работает.

   
 
 автор: relikt   (16.12.2007 в 13:51)   письмо автору
 
   для: sim5   (16.12.2007 в 13:25)
 

А ведь работает. Нашёл я у себя ошибку. Я пытался вывести сообщение сразу после переадресации...

if (!empty($action)) {
.....
if (!empty($_SESSION['send'])) echo '<hr><p>Спасибо! Ваше сообщение отправлено.</p><hr>';
unset($_SESSION['send']);

if (!empty($error)) { 
        print "<hr><P>Во время отправки сообщения произошли следующие ошибки: </P>\n"; 
        print "<UL class=list type=1>\n"; 
        print $error; 
        print "</UL><hr>\n";
}

Вот в чём ошибка. Большое спасибо, что помогли.

   
 
 автор: udpn   (15.12.2007 в 20:34)   письмо автору
 
   для: relikt   (15.12.2007 в 20:10)
 

Даешь капчу!

   
 
 автор: sim5   (15.12.2007 в 20:37)   письмо автору
 
   для: udpn   (15.12.2007 в 20:34)
 

Капча от F5 не спасет.

   
 
 автор: Unkind   (15.12.2007 в 23:15)   письмо автору
 
   для: sim5   (15.12.2007 в 20:37)
 

> Капча от F5 не спасет
Если только CAPTCHA с ошибкой.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования