Форма электронной почты 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 = "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'; } } 

функция отправки mail была вне условия if с проверкой $_POST . Поэтому он отправлял почту каждый раз, когда обновлялся.

Для обработки действий необходимо использовать разные файлы на разных 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"); } 

Подробнее см. В документе .

В success.php

 <p>Oh yeah ;)</p> 

В error.php

 <p>Ooops :(</p>