мой 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>