2015-10-10 2 views
0

У меня есть простое сообщение, которое я отправляю с помощью php mail(). код используется:php mail() отправлено две копии

//recipient info 
$to = "$bookernavn <$mail>"; 
$from = "Visens Venner Hillerød <[email protected]>"; 
$subject = "Kvittering - $a_titel - ". date("j/n - Y",$a_dato); 

$headers = "MIME-Version: 1.0" . "\r\n"; 
$headers .= "Content-type: text/html; charset=utf-8" . "\r\n"; 
$headers .= "From: $from" . "\r\n"; 
$headers .= "Reply-To: $from" . "\r\n"; 
$headers .= "Return-Path: $from" . "\r\n"; 
$headers .= "Bcc: $from" . "\r\n"; 

// now lets send the email. 
mail($to, $subject, $mailmsg, $headers); } 

По какой-то странной причине два письма посылаются каждый раз ...
Иногда несколько минут между ...
Любые идеи?

+1

вы понимаете, у вас есть 'Bcc' заголовок там правильно? Одна почта отправляется в '$ to', другая -' $ from'. Если они совпадают, две письма поступают по одному и тому же адресу. –

+0

Они не одно и то же :-) Я просто хочу сохранить копию квитанции, отправленную бухгалтеру ... так что это не так, но хорошо догадаться :-) –

+1

Я вижу фигурные скобки там. У вас есть, возможно, больше кода, который дважды вызывает вызов mail()? –

ответ

1

Вы не проверяете, была ли форма отправлена, поэтому обновление браузера снова отправит данные формы и снова отправит письмо. Это также происходит, когда пользователь нажимает кнопку «Назад».

После отправки сообщения электронной почты вам необходимо выполнить перенаправление 303, чтобы предотвратить повторную отправку. Вы можете перенаправить на ту же страницу, если хотите.

Это называется Post/Redirect/Get pattern.

mail(...); 
header('Location: /some-page-php', true, 303); 
exit; 
+0

Это страница, которая получает форму - и у меня есть: header ('location: kvittering.php') "a несколько строк вниз. Я попытаюсь добавить «true, 303» и «exit;» к нему :-) –

+0

Это также относится к использованию кнопки «Назад», поэтому это все еще применяется –

+0

Полезно знать ... но вышеприведенная форма, следовательно, отправляет две письма - также с возвратом. Так что это не текущая проблема –

0

простой способ предотвратить это происходит, чтобы использовать метод POST вместо GET для формы.

<form method="post"> 



if (isset($_POST['submitted'])) 

и в конце почтового кода используйте перенаправление, которое отправит браузер для загрузки с использованием метода GET.

Не только вы можете перенаправить пользователя на страницу «ОК», либо на странице с сообщением «извините, что была ошибка, повторите попытку», обновление этой страницы, открытое браузером, отправит только сообщение GET, не вызывая функцию отправки электронной почты

if (empty($errors)) { 
    header('Location: http://www.example.com/mail_OK.html'); 
    exit; 
} else { 
    // passing data to the "error/retry" page 
    $info = array(
    'msg' => $msg, 
    'email' => $_POST['email'], 
    'name' => $_POST['name'] 
    // etc... 
) 
    header('Location: http://www.example.com/mailform.php?'.http_build_query($info)); 
    exit; 
} 

в вашей форме, вы можете получить эти данные

<input name="name" type="text" placeholder="Naam" class="form-control" value="<?php echo htmlspecialchars($_GET['name']); ?>"> 
+0

, проблема с ее изменением в сообщении заключается в том, что я получу всплывающее окно, когда обновляю страницу .. и он все равно отправляет второй раз :( –

+0

Вы не читали весь путь. .. header ('Location: ...') превратит браузер в GET, поэтому только когда пользователь нажмет кнопку отправки (или нажмите клавишу ввода), браузер выполнит POST. Ответ на сообщение будет перенаправлен на GET, так что следующее обновление будет GET. (Я замечаю, что я забыл поставить выход после заголовка) –

Смежные вопросы