2016-03-09 3 views
1

У меня есть контактная форма PHP, она работает очень хорошо, но теперь мой клиент говорит, что он дублирует или даже отправляет 4-5 раз контактное письмо, мой клиент говорит, что слишком много времени, чтобы показать ответ на веб-странице, который сообщает пользователю комментарий, также был отправлен, но я протестировал его на своем собственном сервере, и все работает отлично, есть ли вероятность, что это может быть проблема с их сервером? Вот мой html:PHP-форма отправки повторяющихся писем

<form id="contactForm" action="contacto.php" method="POST" novalidate> 
<p> 
    <label for="nombre">Tu nombre completo</label> 
</p> 
<p> 
    <input type="text" name="nombre" id="nombre" placeholder="Nombre y apellidos" required oninvalid="this.setCustomValidity('Por favor, llena todos los campos')" oninput="setCustomValidity('')"/> 
</p> 
<p> 
    <label for="correo">Tu e-mail</label> 
</p> 
<p> 
    <input type="text" name="correo" id="correo" placeholder="[email protected]" required oninvalid="this.setCustomValidity('Por favor, llena todos los campos')" oninput="setCustomValidity('')"/> 
</p> 
<p> 
    <label for="asunto">Asunto</label> 
</p> 
<p> 
    <input type="text" name="asunto" id="asunto" placeholder="¿Por qué nos escribes?" required oninvalid="this.setCustomValidity('Por favor, llena todos los campos')" oninput="setCustomValidity('')"/> 
</p> 
<p> 
    <label for="aspirante">Nombre completo del aspirante</label> 
</p> 
<p> 
    <input type="text" name="aspirante" id="aspirante" placeholder="Nombre y apellidos" required oninvalid="this.setCustomValidity('Por favor, llena todos los campos')" oninput="setCustomValidity('')"/> 
</p> 
<p> 
    <label for="fecha">Fecha de nacimiento del aspirante</label> 
</p> 
<p> 
    <input type="text" name="fecha" id="fecha" placeholder="dd/mm/aa" required oninvalid="this.setCustomValidity('Por favor, llena todos los campos')" oninput="setCustomValidity('')"/> 
</p> 
<p> 
    <label for="grado">Grado a cursar</label> 
</p> 
<p> 
    <input type="text" name="grado" id="grado" placeholder="Grado a cursar" required oninvalid="this.setCustomValidity('Por favor, llena todos los campos')" oninput="setCustomValidity('')"/> 
</p> 
<p> 
    <label for="ciclo">Ciclo escolar</label> 
</p> 
<p> 
    <input type="text" name="ciclo" id="ciclo" placeholder="Ej. 2016-2017" required oninvalid="this.setCustomValidity('Por favor, llena todos los campos')" oninput="setCustomValidity('')"/> 
</p> 
<p> 
    <label for="escuela">Escuela de procedencia</label> 
</p> 
<p> 
    <input type="text" name="escuela" id="escuela" placeholder="Escuela de procedencia" required oninvalid="this.setCustomValidity('Por favor, llena todos los campos')" oninput="setCustomValidity('')"/> 
</p> 
<p> 
    <label for="ciudad">Ciudad de origen</label> 
</p> 
<p> 
    <input type="text" name="ciudad" id="ciudad" placeholder="Ciudad de origen" required oninvalid="this.setCustomValidity('Por favor, llena todos los campos')" oninput="setCustomValidity('')"/> 
</p> 
<p> 
    <label for="comentario">Comentarios</label> 
</p> 
<p> 
    <textarea type="text" name="comentario" id="comentario" placeholder="Déjanos saber tus comentarios" required oninvalid="this.setCustomValidity('Por favor, llena todos los campos')" oninput="setCustomValidity('')"/></textarea> 
</p> 
<p class="submit"> 
    <button type="submit">Enviar</button> 
</p> 
</form> 

И JS, подтверждающий форму. Я также включил отключенный атрибут кнопку, как только оно было отправлено:

<script> 
/* Forma Contacto */ 
$("#contactForm").submit(function(event) { 
    /* stop form from submitting normally */ 
    event.preventDefault(); 
    /* get some values from elements on the page: */ 
    var $form = $(this), 
    $submit = $form.find('button[type="submit"]'), 
    nombre_value = $form.find('input[name="nombre"]').val(), 
    correo_value = $form.find('input[name="correo"]').val(), 
    asunto_value = $form.find('input[name="asunto"]').val(), 
    aspirante_value = $form.find('input[name="aspirante"]').val(), 
    fecha_value = $form.find('input[name="fecha"]').val(), 
    grado_value = $form.find('input[name="grado"]').val(), 
    ciclo_value = $form.find('input[name="ciclo"]').val(), 
    escuela_value = $form.find('input[name="escuela"]').val(), 
    ciudad_value = $form.find('input[name="ciudad"]').val(), 
    comentario_value = $form.find('textarea[name="comentario"]').val(), 
    url = $form.attr('action'); 

    if (!event.target.checkValidity()) { 
     // the form is not valid 
     // show some nice errors here 
     $submit.text('Llena todos los campos'); 
     return false; 
    }else{ 
     /* Send the data using post */ 
     var posting = $.post(url, { 
      nombre: nombre_value, 
      correo: correo_value, 
      asunto: asunto_value, 
      aspirante: aspirante_value, 
      fecha: fecha_value, 
      grado: grado_value, 
      ciclo: ciclo_value, 
      escuela: escuela_value, 
      ciudad: ciudad_value, 
      comentario: comentario_value, 
     }); 

     posting.done(function(data){ 
      /* Put the results in a div */ 
      $("#contactResponse").html(data); 

      /* Change the button text. */ 
      $submit.text('Enviado'); 
      /* Disable the button. */ 
      $submit.attr("disabled", true); 
     }); 
    } 
}); 
</script> 

И, наконец, мой PHP:

<?php 

$EmailFrom = "[email protected]"; 
$EmailTo = "[email protected]"; 
$Subject = "Nuevo comentario en el website"; 
$nombre = Trim(stripslashes($_POST['nombre'])); 
$correo = Trim(stripslashes($_POST['correo'])); 
$asunto = Trim(stripslashes($_POST['asunto'])); 
$aspirante = Trim(stripslashes($_POST['aspirante'])); 
$fecha = Trim(stripslashes($_POST['fecha'])); 
$grado = Trim(stripslashes($_POST['grado'])); 
$ciclo = Trim(stripslashes($_POST['ciclo'])); 
$escuela = Trim(stripslashes($_POST['escuela'])); 
$ciudad = Trim(stripslashes($_POST['ciudad'])); 
$comentario = Trim(stripslashes($_POST['comentario'])); 

// prepare email body text 
$Body = ""; 
$Body .= "Nombre: "; 
$Body .= $nombre; 
$Body .= "\n"; 
$Body .= "E-mail: "; 
$Body .= $correo; 
$Body .= "\n"; 
$Body .= "Asunto: "; 
$Body .= $asunto; 
$Body .= "\n"; 
$Body .= "Nombre del aspirante: "; 
$Body .= $aspirante; 
$Body .= "\n"; 
$Body .= "Fecha de Nacimiento: "; 
$Body .= $fecha; 
$Body .= "\n"; 
$Body .= "Grado a cursar: "; 
$Body .= $grado; 
$Body .= "\n"; 
$Body .= "Ciclo escolar: "; 
$Body .= $ciclo; 
$Body .= "\n"; 
$Body .= "Escuela de procedencia: "; 
$Body .= $escuela; 
$Body .= "\n"; 
$Body .= "Ciudad de origen: "; 
$Body .= $ciudad; 
$Body .= "\n"; 
$Body .= "Comentario: "; 
$Body .= $comentario; 
$Body .= "\n"; 

// send email 
$success = mail($EmailTo, $Subject, $Body, "From: <$EmailFrom>"); 

// redirect to success page 
if ($success){ 
    echo "<h2>¡Gracias! Recibimos tu mensaje</h2>"; 
} 
else{ 
    echo "<h2>Lo sentimos, hubo un error, inténtalo nuevamente</h2>"; 
} 
?> 

Что случилось с моим кодом? Как я уже сказал, я протестировал его на своем сервере, и все работает отлично, но не на моем клиентском сервере. Любая помощь?

+0

Проверьте клиентскую версию php и настроен адрес электронной почты или нет onserver –

+0

Если вы не перенаправляете на другую страницу, если пользователь обновляет страницу, форма отправляется снова. Обратите внимание на это.Однако, если это не проблема, вы можете использовать внешнюю библиотеку для отправки писем, таких как https://github.com/PHPMailer/PHPMailer –

ответ

0

Я думаю, что в принципе есть две вещи, на которые можно ответить. (1) У вашего кода могут быть ошибки, которые позволяют пользователю отправлять одну и ту же форму несколько раз. (2) Как электронные письма отправляются скриптами PHP (клиент жалуется, что страница медленная).

(1) Я рассмотрел ваш код JavaScript и прочитал его. Я считаю, что вы должны заблокировать кнопку отправки до тех пор, пока состояние оценки формы не станет ясным. Вы уже следующая строка:

$submit = $form.find('button[type="submit"]') 

Сразу после извлечения значения формы с помощью (я предполагаю, JQuery) вы могли бы сделать следующее:

$submit.prop('disabled', true); 

Конечно, если становится ясно, что форма недействителен и пользователь имеет право снова подать вам нужно сделать:

$submit.prop('disabled', false); 

Пожалуйста, обратите внимание выше код работает с JQuery 1.6+, если вы используете JQuery 1.5 правильный код:

$submit.attr('disabled', 'disabled'); 
$submit.removeAttr('disabled'); 

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

(2) На вашем PHP вы используете функцию mail(), которая полагается на конфигурацию сервера SMTP/sendmail на сервере, чтобы отказаться от электронной почты. Я предполагаю, что в случае вашей тестовой системы у вас работает локальная почтовая система. Когда функция PHP mail() отправляет почту на ваш компьютер, она может напрямую отправлять почту по адресу localhost. Однако в производственной среде очень вероятно, что центральный почтовый сервер с аутентификацией и все на месте. Это означает, что функция mail() выполняет сложный процесс подключения к SMTP-серверу, возможно, аутентифицировав его, затем отбрасывая тело письма и ожидая ответа сервера. Сервер будет отвечать только в том случае, если он успешно поставил в очередь ваше сообщение электронной почты в одной из своих очередей. Это может занять некоторое время, если почтовый сервер не работает. Расскажите короткому разговору с вашим клиентом об этом сценарии и попытайтесь найти способы смягчить это (на нашем хостинге у нас есть локальные почтовые пересылки на всех машинах SSMTP, что очень полезно).

Смежные вопросы