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

Решение

Вместо этого используйте заголовок и убедитесь, что у вас нет вывода перед заголовком.

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 / токена)

Вы можете использовать куки, и это только пример.

<?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>
3

Другие решения

попробуй это-

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 функция отправки была вне условия if с $_POST проверять. Поэтому он отправлял почту каждый раз, когда обновлялся.

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");
}

Смотрите документ для деталей.

В success.php

<p>Oh yeah ;)</p>

В error.php

<p>Ooops :(</p>
0
По вопросам рекламы [email protected]