Receiving 2x emails from the form

Asked

Viewed 74 times

0

Hello, I put a form on my page and to load everything on the same page put the action=#contact (form section)

Even if I just click 1x on the SEND button, I get 2 identical emails.

Follows the contato.php who wear a include on the same home page:

<?
ini_set('display_errors', true);
error_reporting(E_ALL|E_STRICT);

if(!empty($_GET) && $_SERVER['REQUEST_METHOD'] == 'GET'){
//pega as variaveis por POST
$nome     = $_GET["nome"];
$email    = $_GET["email"];
$fone     = $_GET["fone"];
$assunto  = $_GET["assunto"];
$mensagem   = $_GET["mensagem"];

global $email; //função para validar a variável $email no script todo

$data      = date("d/m/y");                     //função para pegar a data de envio do e-mail
$hora      = date("H:i");                       //para pegar a hora com a função date

//aqui envia o e-mail para você
mail ("[email protected]", //email aonde o php vai enviar os dados do form
      "$assunto",
      "Nome: $nome\nData: $data\nHora: $hora\nE-mail: $email\nTelefone: $fone\n\nMensagem: $mensagem",
      "From: $email"
     );

//aqui são as configurações para enviar o e-mail para o visitante
$site   = "[email protected]"; //o e-mail que aparecerá na caixa postal do visitante
$titulo = "Contato";    //titulo da mensagem enviada para o visitante
$msg    = "$nome, Seu e-mail foi recebido!\nObrigado por entrar em contato conosco, em breve entraremos em contato!";

//aqui envia o e-mail de auto-resposta para o visitante
mail("$email",
     "$titulo",
     "$msg",
     "From: $site"
    );
}

?>

The main page looks something like this

<? include "contato.php";?>
<form action="#contato">
</form>

And at the end of the form I have another part in php to show the sending msg successfully

<?  
    if(!empty($_GET) && $_SERVER['REQUEST_METHOD'] == 'GET'){
        echo "<p>Sua mensagem foi entregue com sucesso!<br>";
        echo "Em até 48hrs você receberá um contato nosso. Obrigado!</p>";
    }
?>

When I click send it sends an email and when it loads the page again it sends another email ?

Is there any way I can cancel the first or second shipment?

  • Have you tried printing the $email variable before and after the call to the global $email to see if that variable changes?

  • Explain this one better quando carrega a pagina de novo ele envia outro email, you’re saying refresh?

  • 1

    if refresh it will always send again because the url has the necessary parameters for sending and you are using if(!empty($_GET) && $_SERVER['REQUEST_METHOD'] == 'GET'){

  • How is your form?

2 answers

0

When you send an email and continue on the same page, "giving an F5", the form will always send again, because the data sent by POST are stored, (You can take as example send something by GET and update the page. The URL remains.) what you have to do, is that when the form is sent, you use a window.location.href = "https://www.suaurl.com" or a header("Location: https://www.suaurl.com"); and then the problem will no longer occur.

0

In your code I see 2 possibilities of the email being sent 2 or more times.

  • 2 times if the email entered in the form input is equal to email aonde o php vai enviar os dados do form
  • 2 or more times if you keep refreshing the page or repeatedly click the SEND button.

To get around this problem:

Create a $_SESSION['me'] as soon as the email is sent with the value of $_SERVER['QUERY_STRING'].

The $_SERVER['QUERY_STRING'] variable will contain the parameters passed in a URL. These parameters are all characters existing in the url after the question mark (?)

Assign to variables $string and $session, respectively the values $_SERVER['QUERY_STRING'] and $_SESSION['me']

Finally compare these two values and if they are different send the email

if ($string!=$session){
 //envia email

contact page.php

//Inicia uma nova sessão
session_start(); 

$string = $_SERVER['QUERY_STRING'];
$session = $_SESSION['me'];

ini_set('display_errors', true);
error_reporting(E_ALL|E_STRICT);

if ($string!=$session){

    if(!empty($_GET) && $_SERVER['REQUEST_METHOD'] == 'GET'){
        //pega as variaveis por POST
        $nome     = $_GET["nome"];
        $email    = $_GET["email"];
        $fone     = $_GET["fone"];
        $assunto  = $_GET["assunto"];
        $mensagem   = $_GET["mensagem"];

        global $email; //função para validar a variável $email no script todo

        $data      = date("d/m/y");                     //função para pegar a data de envio do e-mail
        $hora      = date("H:i");                       //para pegar a hora com a função date

        //aqui envia o e-mail para você


        mail ("[email protected]", //email aonde o php vai enviar os dados do form
              "$assunto",
              "Nome: $nome\nData: $data\nHora: $hora\nE-mail: $email\nTelefone: $fone\n\nMensagem: $mensagem",
              "From: $email"
             );

        //aqui são as configurações para enviar o e-mail para o visitante
        $site   = "[email protected]"; //o e-mail que aparecerá na caixa postal do visitante
        $titulo = "Contato";    //titulo da mensagem enviada para o visitante
        $msg    = "$nome, Seu e-mail foi recebido!\nObrigado por entrar em contato conosco, em breve entraremos em contato!";

        //aqui envia o e-mail de auto-resposta para o visitante
        mail("$email",
             "$titulo",
             "$msg",
             "From: $site"
            ); 

        $_SESSION['me']=$_SERVER['QUERY_STRING']; 

    }

}

Form

   <form action="#contato">
    .......

<?  
    if(!empty($_GET) && $_SERVER['REQUEST_METHOD'] == 'GET'){
        echo "<p>Sua mensagem foi entregue com sucesso!<br>";
        echo "Em até 48hrs você receberá um contato nosso. Obrigado!</p>";
    }
?>

If you want to provide a new email submission, just put echo "<a href=\"principal.php\">Enviar outro email</a>"; in the code above.

<?  
    if(!empty($_GET) && $_SERVER['REQUEST_METHOD'] == 'GET'){
        echo "<p>Sua mensagem foi entregue com sucesso!<br>";
        echo "Em até 48hrs você receberá um contato nosso. Obrigado!</p>";

        echo "<a href=\"principal.php\">Enviar outro email</a>";
    }
?>

NOTE: the Get method has a limited size , if the information is too large you risk data loss.

Internet Explorer: 2.083 caracteres
Firefox: 65.536 caracteres
Safari: 80.000 caracteres
Opera: 190.000 caracteres

maximum length of IE URL

Browser other questions tagged

You are not signed in. Login or sign up in order to post.