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