PHP电子邮件表单在每次刷新页面时发送电子邮件


PHP email form sends email everytime page is refreshed

每次刷新页面时,我的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 = "person@emailaddy.com";
    $mail->Password = "password";
    $mailto = "person@emailaddy.com";
    $mailfrom = "person@emailaddy.com";
    $mail->SetFrom($mailto, '');
    // $mail->AddReplyTo($mailfrom, 'email');
    $address = 'person@emailaddy.com';
    $mail->AddAddress($address, "My Addy");
    $mail->Subject  = $subject;
    $mail->AltBody  = $body;
    $mail->MsgHTML($body);
    if(!$mail->Send()) {
    echo 'Message has been sent';
    }
   }

请改用标头,并确保在标头之前没有输出。

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>

试试这个-

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 = "person@emailaddy.com";
    $mail->Password = "password";
    $mailto = "person@emailaddy.com";
    $mailfrom = "person@emailaddy.com";
    $mail->SetFrom($mailto, '');
    // $mail->AddReplyTo($mailfrom, 'email');
    $address = 'person@emailaddy.com';
    $mail->AddAddress($address, "My Addy");
    $mail->Subject  = $subject;
    $mail->AltBody  = $body;
    $mail->MsgHTML($body);
    if(!$mail->Send()) {
        echo 'Message has been sent';
    }
}

CCD_ 1发送功能在具有CCD_ 2检查的if条件之外。所以它每次刷新都会发送邮件。

您应该在不同的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");
}

有关详细信息,请参阅文档。

In success.php

<p>Oh yeah ;)</p>

出错.php

<p>Ooops :(</p>