2016-03-09 44 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這是非常有益的)。