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

Posted

技术标签:

【中文标题】每次刷新页面时,PHP 电子邮件表单都会发送电子邮件【英文标题】:PHP email form sends email everytime page is refreshed 【发布时间】:2015-01-01 04:37:27 【问题描述】:

每次刷新页面时,我的 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';
    
   

【问题讨论】:

查看这张图片upload.wikimedia.org/wikipedia/commons/f/f3/… 你最好重定向到另一个带有标题的页面。 【参考方案1】:

试试这个-

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';
    

mail 发送函数在 $_POST 检查的 if 条件之外。所以每次刷新都会发送邮件。

【讨论】:

您好,感谢您的超快速响应。即使内部有发送邮件功能,每次刷新仍然会发送。我更改了上面的代码以反映这一点。 试试var_dump($_POST),看看每次刷新都有什么效果。【参考方案2】:

您应该在不同的 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>

【讨论】:

【参考方案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>

【讨论】:

我希望在与表单相同的页面上输出成功消息。我是编程新手,这是否违反了更好的做法?就像在与表单相同的页面上输出成功消息是否被认为是不正确的编码? @user3770278 这不是“不正确”,但您仍然会遇到同样的问题。您可以在echo 'Message has been sent'; 之后添加exit;exit("Thank you");,但这会使您的表单消失。我建议您将它们重定向到您的主页,或者将它们重定向到您的主页,或者将它们重定向到真正出现相同内容的表单本身,或者使用 Ajax。 @user3770278 如果他们在回显后使用exit; 刷新页面,您仍然会遇到同样的问题。最好重定向到另一个页面。 @user3770278 您可以尝试的另一件事是在echo 'Message has been sent'; 之后添加unset($_POST);,但这可能不是最好的方法。即使是 cookie 或验证码也会有所帮助。 @user3770278 我添加了一个 cookie/token 方法,您可以根据自己的情况进行操作。试试看,然后点击刷新。你会看到结果。在编辑下重新加载

以上是关于每次刷新页面时,PHP 电子邮件表单都会发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

我似乎无法让我的表格成功通过电子邮件发送

ASP.Net 刷新页面再次发送电子邮件

PHP 表单通过电子邮件发送的结果。我需要捕获表单中的上传文件

刷新页面时,php UPDATE发送到MYSQL空参数

通过PHP将Mailchimp简报发送到List

通过一次提交发送双表单,同时将电子邮件字段从第一个表单拉到第二个表单