PHP表单发送重复的电子邮件

时间:2016-03-09 18:01:36

标签: javascript php html contact-form

我有一个PHP联系表单,它工作得很好,但现在我的客户说它复制甚至发送4-5倍的联系电子邮件,我的客户说它花了太长时间才显示网页上的响应告诉用户评论也已发送,但我已在我自己的服务器上测试过,一切正常,是否有可能是他们的服务器出现问题?这是我的HTML:

<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="mail@tucorreo.com" 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 = "contacto@mail.com";
$EmailTo = "clientmail@mail.com";
$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>";
}
?>

我的代码有什么问题吗?正如我所说,我已经测试了它到我的服务器,一切正常,但不是在我的客户端服务器上。有什么帮助吗?

1 个答案:

答案 0 :(得分: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上都有本地邮件转发器,这非常有用)。