2014-11-05 56 views
0

我的PHP電子郵件地址每次頁面刷新時都會發送電子郵件。例如,用戶正在填寫表單並通過發送按鈕發送。這一切都很好,但如果他們刷新頁面,它會再次發送電子郵件與所有相同的表單信息。PHP電子郵件表格每次刷新頁面都會發送電子郵件

我相信這是問題代碼,但不知道它是什麼。

require_once('class.phpmailer.php'); 
    if(isset($_POST['submit'])){ 
    $name = $_POST['name']; 
    $subject = 'WebForm'; 
    $email = $_POST['email']; 
    $body = $_POST['message']; 
    $mail = new PHPMailer; 
    // $mail->SMTPDebug = 2; 
    // print_r($_POST); 
    $mail->IsSMTP(); 
    $mail->SMTPAuth = true; 
    $mail->SMTPSecure = "tls"; 
    $mail->Host = "smtp.office365.com"; 
    $mail->Port = 587; 
    $mail->Username = "[email protected]"; 
    $mail->Password = "password"; 

    $mailto = "[email protected]"; 
    $mailfrom = "[email protected]"; 
    $mail->SetFrom($mailto, ''); 
    // $mail->AddReplyTo($mailfrom, 'email'); 
    $address = '[email protected]'; 
    $mail->AddAddress($address, "My Addy"); 

    $mail->Subject = $subject; 
    $mail->AltBody = $body; 
    $mail->MsgHTML($body); 

    if(!$mail->Send()) { 
    echo 'Message has been sent'; 
    } 
    } 
+0

退房這一形象http://upload.wikimedia.org/wikipedia/commons/f/f3/PostRedirectGet_DoubleSubmitProblem.png – Ghost 2014-11-05 04:11:47

+0

你用頭另一頁最佳轉向。 – 2014-11-05 04:14:42

回答

3

使用一個頭而不是,並確保你有頭之前沒有輸出。

if(!$mail->Send()) { 
    header("Location: http://www.example.com"); 
    exit; 
    } 

如果不爲你工作,將元刷新方法:

if(!$mail->Send()) { 
$to = "http://www.example.com"; 
    $url = $to; 
    print "<meta HTTP-EQUIV=Refresh CONTENT=\"0; URL=$url\">"; 
    exit; 
} 

或顯示一條消息,5秒後重定向:

if(!$mail->Send()) { 
$to = "http://www.example.com"; 
    $url = $to; 
    print "<meta HTTP-EQUIV=Refresh CONTENT=\"5; URL=$url\">"; 
    print "Thank you for your message."; 
    exit; 
} 

編輯:(cookie /令牌方法)

你可以使用一個cookie,這只是一個例子。

<?php 

$token = time(); 
setcookie('formToken', $token, time() + 3600); 

if(isset($_POST['submit'])){ 

if($_POST['token'] != $_COOKIE['formToken']){ 
// die("Sorry"); 

$error_list .= '<li>You can not submit this form twice.</li>'; 

echo $error_list; 

echo ' 
Thank you, your message has been sent. You do not need resubmit it again. 
'; 

exit; 

} 

    foreach($_POST as $values) { $data .= $values . "<br>"; echo $data; } 

} 

?> 

<form action="" method="POST"> 

Name: <input type="text" name="name"> 
<br> 
Email: <input type="text" name="email"> 
<input type="hidden" name="token" value="<?php echo $token; ?>" /> 

<input type="submit" value="Submit" name="submit" /> 
</form> 
+0

我希望能夠在窗體的相同頁面上輸出成功消息。我是編程新手,是針對更好的實踐?就像它認爲不正確的編碼輸出成功的消息在同一頁面上的形式? – badsyntax 2014-11-05 04:33:26

+0

@ user3770278這不是「不恰當」,但你仍然會遇到同樣的問題。你可以在'echo'消息發送後添加'exit;'或'exit(「Thank you」);'但是這會讓你的表單消失。我建議您將它們重定向到您的主頁,或者將它們重新定向到真正相同的東西,或者使用Ajax。 – 2014-11-05 04:37:02

+0

@ user3770278如果他們在回顯後使用'exit;'刷新頁面,您仍然會遇到同樣的問題。最好重定向到另一個頁面。 – 2014-11-05 04:41:16

0

嘗試這個 -

require_once('class.phpmailer.php'); 
if(isset($_POST['submit'])){ 
    $name = $_POST['name']; 
    $subject = 'WebForm'; 
    $email = $_POST['email']; 
    $body = $_POST['message']; 
    $mail = new PHPMailer; 
    // $mail->SMTPDebug = 2; 
    // print_r($_POST); 
    $mail->IsSMTP(); 
    $mail->SMTPAuth = true; 
    $mail->SMTPSecure = "tls"; 
    $mail->Host = "smtp.office365.com"; 
    $mail->Port = 587; 
    $mail->Username = "[email protected]"; 
    $mail->Password = "password"; 

    $mailto = "[email protected]"; 
    $mailfrom = "[email protected]"; 
    $mail->SetFrom($mailto, ''); 
    // $mail->AddReplyTo($mailfrom, 'email'); 
    $address = '[email protected]'; 
    $mail->AddAddress($address, "My Addy"); 

    $mail->Subject = $subject; 
    $mail->AltBody = $body; 
    $mail->MsgHTML($body); 
    if(!$mail->Send()) { 
     echo 'Message has been sent'; 
    } 
} 

mail發送功能是,如果條件之外與$_POST檢查。所以每次刷新時都會發送郵件。

+0

嗨感謝您的超級快速響應。即使使用裏面的發送郵件功能仍然每次刷新都會發送。我改變了上面的代碼來反映這一點。 – badsyntax 2014-11-05 04:18:13

+0

嘗試'var_dump($ _ POST)'並查看它在每次刷新時獲得的內容。 – 2014-11-05 04:26:17

0

你應該使用不同的文件,在不同的URL處理措施:

  • 發送電子郵件
  • 顯示確認頁面

例如:

在您的形式

<form ... method="post" action="/sendmail.php"> 

在sendmail.php

// same code as above except: 
if(!$mail->Send()) { 
    header("Location: success.php"); 
} else { 
    header("Location: error.php"); 
} 

See the doc for details

在success.php

<p>Oh yeah ;)</p> 

在error.php

<p>Ooops :(</p>