Несколько советов... НИКОГДА не сбрасывайте $_POST вслепую.
(или $_GET или $_REQUEST или любой другой пользовательский ввод) в поле заголовков.
ОСОБЕННО в поле заголовков.
Хорошее эмпирическое правило для параметров $to, $subject и $additional_headers для почты: ВСЕГДА удаляйте возврат каретки, перевод строки И точку с запятой, поскольку они имеют особое значение, которое может позволить людям перехватить вашу почтовую форму!
Я также считаю, что определить CRLF удобно, мне кажется, что это чище.
и сейчас 2016 год, а не 1996 год, используйте utf-8, поскольку, если ваш документ чего-то стоит, он уже настроен и использует его.
Я использую эту функцию для очистки значений, если они попадают в эти поля для mail().
define('CRLF', "\r\n");
function mailPost($index) {
return
array_key_exists($index, $_POST) ?
str_replace(["\r", "\n", ';'], ' ', $_POST[$index]) :
'';
}
$subject = 'Front Page Reply';
$message = wordwrap($_POST['message'], 70);
$from = mailPost('email');
$headers =
'MIME-Version: 1.0' . CRLF .
'X-Mailer: PHP/' . phpversion() . CRLF .
'Content-type: text/html; charset=utf-8' . CRLF .
'From: ' . $from . CRLF .
'Reply-To: ' . $from . CRLF .
'Return-Path: ' . $from . CRLF;
mail($userEmail, $subject, $message, $headers);
header('Location: ../../ad.php?token='.$_POST['token'].'&success=message+sent');
exit;
Код (разметка):
примечание Здесь массив PHP 5.4+!
Итак, мое обращение с этим будет примерно таким:
function mailPost($index) { return array_key_exists($index, $_POST) ? str_replace(["\r", "\n", ';'], ' ', $_POST[$index]) : ''; }
Код (разметка): НЕ то, чтобы я использовал какое-то глупое перенаправление заголовка.
(ПОЧЕМУ, черт возьми, люди это делают?) или вызов выхода, поскольку я склонен использовать подход «один индекс, чтобы управлять ими всеми» при разработке PHP.
Вы не хотите случайной повторной отправки, поместите случайный хэш в форму в качестве скрытого ввода и в свой сеанс и сравните его, признавая его недействительным в каждом запросе, будь то прохождение проверки (отправка почты) или сбой (поэтому повторно отправьте заполненную форму )