Цитата:
PHP Notice: Use of undefined constant sex - assumed 'sex' in /feedback/mails_sender3.php on line 52 PHP Notice: Use of undefined constant email - assumed 'email' in /feedback/mails_sender3.php on line 53 PHP Notice: Use of undefined constant message - assumed 'message' in /feedback/mails_sender3.php on line 55 PHP Fatal error: Function name must be a string in /feedback/mails_sender3.php on line 58 |
Значит вы где-то удали или оставили лишнюю закрывающую фигурную скобку. В редакторе проверьте, если к примеру в таком условии
if(...) { .... отметить открывающую фигурную скобку (курсор на нее) то будет подсвечена ее парная закрывающая тело этого условия фигурная скобка. Если скобка лишняя, то отметка ее окрасит ее в красный цвет. Все завит от редактора, есть редакторы которые могут раскрывать/сворачивать блоки условий или прочие помещенные в фигурные скобки. Внимательно проверьте. |
Вроде бы все правильно
<?php //задержка для посмотерть как работает форма при отправке, удалить после sleep(2); $check = array( 'sex' => array( 'filter' => FILTER_VALIDATE_INT, //пол, это вообще-то поле типа ENUM в базе со значениями: 1 - мужчина, 2 - женщина, это и надо проверять 'flags' => FILTER_REQUIRE_SCALAR, 'options' => array('min_range' => 1, 'max_range' => 2) ), 'email' => FILTER_VALIDATE_EMAIL, 'worker' => FILTER_VALIDATE_INT, //сотрудник Петя может быть таким только как текст опции, но никак не ее значение, значением должен быть уникальный идентфикатор сотрудника 'message' => FILTER_SANITIZE_SPECIAL_CHARS //нет смысла в strip_tags, если отправление в html формате, лучше преобразовать в html сущности ); $error_message = array( 'sex' => 'Некорректное значение поля «Пол»!', 'email' => 'Некорректное значение поля «Адрес почты»!', 'worker' => 'Некорректное значение поля «Сотрудник»!', 'message' => 'Некорректное значение поля «Сообощение»!', 'file' => 'Ошибка получения файла!' ); $errors = array(); //убираем возможные крайние пробелы $post = array_map('trim', $_POST); //если не все на месте, это не наш клиент, в этом случае можно прекртить работу и выйти if(array_diff_key($post, $check)) exit; //проверяем что прислали $data = filter_var_array($post, $check); //если есть ошибки получим их сообщения $errors += array_intersect_key($error_message, array_filter($data, function($v) { return !$v; })); //отправляем ошибки клиенту if($errors) { header('Content-Type: application/json'); exit(json_encode(array('result'=> 'error', 'data'=> array_values($errors)))); } //имитация базы $sex = array(1 => 'мужчина', 'женщина'); $worker = array(1 => 'Сергей', 'Иван', 'Николай', 'Антон', 'Виктор'); //если нет ошибок if(!$errors) { //получаем имя сотрудника запросом к базе по его ID, проверяя заодно есть ли такой //здесь проверка имитация, проверяется наличие ключа в $worker if(!$name = $worker[$data['worker']]) exit; //выход, нет такого сотрудника, форма левая //хороший тон, это отправление и текстовой версии, так как неизвестно в каком формате адресат принимает почту $text = 'Текстовый вариант'; //html версия $html = "<p><b>Пол:</b> {$sex[$data[sex]]}</p> <p><b>E-mail:</b> {$data[email]}</p> <p><b>Сотрудник:</b> $name</p> <p><b>Сообщение:</b> {$data[message]}</p>"; $to = 'zulfukar@mail.ru'; $headers = 'From: =?utf-8?B?' . base64_encode($name) . '?= <' . $data('email') . '>' . PHP_EOL; $headers .= 'Reply-To: receiver@domain3.com' . PHP_EOL; $headers .= 'X-Mailer: PHP/' . phpversion() . PHP_EOL; $headers .= 'Mime-Version: 1.0' . PHP_EOL; $headers .= 'Content-Type: multipart/alternative; boundary="==boundary-2"' . PHP_EOL.PHP_EOL; $body .= '--==boundary-2' . PHP_EOL.PHP_EOL; $body .= 'Content-type: text/plain; charset="utf-8"' . PHP_EOL; $body .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL.PHP_EOL; $body .= $text . PHP_EOL; //текстовая версия $body .= '--==boundary-2' . PHP_EOL; $body .= 'Content-Type: multipart/related; boundary="==boundary-1"; type="text/html"' . PHP_EOL.PHP_EOL; $body .= '--==boundary-1' . PHP_EOL; $body .= 'Content-type: text/html; charset="utf-8"' . PHP_EOL; $body .= 'Content-Transfer-Encoding: base64' . PHP_EOL.PHP_EOL; $body .= chunk_split(base64_encode($html)) . PHP_EOL.PHP_EOL; //html версия $body .= '--==boundary-1--' . HP_EOL; if(!empty($_FILES)) { $f = fopen($_FILES['file']['tmp_name'], 'rb'); $body .= 'Content-Type: image/jpeg' . PHP_EOL; //заголовок произвольный, а вообще нужно проверять тип и его указывать, в случае изображения его можно встроить непосредственно в письмо $body .= 'Content-Transfer-Encoding:base64' . PHP_EOL; $body .= 'Content-Disposition: inline; filename="' . basename($_FILES['file']['name']) . '"' . PHP_EOL.PHP_EOL; $body .= chunk_split(base64_encode(fread($f, filesize($_FILES['file']['tmp_name'])))); $body .= '--==boundary-1--' . PHP_EOL; } $body .= '--==boundary-2--' . PHP_EOL; mail($to, $body, $headers); //функция mail не знает о том отправлено ли письмо или нет, она лишь сообщает о факте его принятия для отправления программой sendmail header('Content-Type: application/json'); exit(json_encode(array('result'=> 'done', 'data'=> array('Письмо отправлено')))); } |
<?php $check = array( 'sex' => array( 'filter' => FILTER_VALIDATE_INT, 'flags' => FILTER_REQUIRE_SCALAR, 'options' => array('min_range' => 1, 'max_range' => 2) ), 'email' => FILTER_VALIDATE_EMAIL, 'worker' => FILTER_VALIDATE_INT, 'message' => FILTER_SANITIZE_SPECIAL_CHARS ); $error_message = array( 'sex' => 'Некорректное значение поля «Пол»!', 'email' => 'Некорректное значение поля «Адрес почты»!', 'worker' => 'Некорректное значение поля «Сотрудник»!', 'message' => 'Некорректное значение поля «Сообощение»!', ); $errors = array(); $post = array_map('trim', $_POST); if(array_diff_key($post, $check)) exit; $data = filter_var_array($post, $check); $errors += array_intersect_key($error_message, array_filter($data, function($v) { return !$v; })); if($errors) { header('Content-Type: application/json'); exit(json_encode(array('result'=> 'error', 'data'=> array_values($errors)))); } else { $sex = array(1 => 'мужчина', 'женщина'); $worker = array(1 => 'Сергей', 'Иван', 'Николай', 'Антон', 'Виктор'); if(!$name = $worker[$data['worker']]) exit; $text = 'Текстовый вариант'; $html = "<p><b>Пол:</b> " . $sex[$data['sex']] . "</p> <p><b>E-mail:</b> " . $data['email'] . "</p> <p><b>Сотрудник:</b> " . $name . "</p> <p><b>Сообщение:</b> " . $data['message'] . "</p>"; $to = 'pochta@mail.ru'; $subject = '=?utf-8?b?' . base64_encode($data['subject']) . '?='; $headers = 'From: =?utf-8?B?' . base64_encode($name) . '?= <' . $data['email'] . '>' . PHP_EOL; $headers .= 'Reply-To: receiver@domain3.com' . PHP_EOL; $headers .= 'X-Mailer: PHP/' . phpversion() . PHP_EOL; $headers .= 'Mime-Version: 1.0' . PHP_EOL; $headers .= 'Content-Type: multipart/alternative; boundary="==boundary-2"' . PHP_EOL.PHP_EOL; $body .= '--==boundary-2' . PHP_EOL.PHP_EOL; $body .= 'Content-type: text/plain; charset="utf-8"' . PHP_EOL; $body .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL.PHP_EOL; $body .= $text . PHP_EOL; //текстовая версия $body .= '--==boundary-2' . PHP_EOL; $body .= 'Content-Type: multipart/related; boundary="==boundary-1"; type="text/html"' . PHP_EOL.PHP_EOL; $body .= '--==boundary-1' . PHP_EOL; $body .= 'Content-type: text/html; charset="utf-8"' . PHP_EOL; $body .= 'Content-Transfer-Encoding: base64' . PHP_EOL.PHP_EOL; $body .= chunk_split(base64_encode($html)) . PHP_EOL.PHP_EOL; //html версия $body .= '--==boundary-1--' . PHP_EOL; $body .= '--==boundary-2--' . PHP_EOL; mail($to, $subject, $body, $headers); header('Content-Type: application/json'); exit(json_encode(array('result'=> 'done', 'data'=> array('Письмо отправлено')))); } |
Вложений: 1
PHP Notice: Undefined index: subject in /feedback/mails_sender3.php on line 43 PHP Notice: Undefined variable: body in /feedback/mails_sender3.php on line 49 |
Начинайте понемногу соображать сами - вы говорили, что тему письма не нужно задавать формой, а значит что, удалить и определить свою, о чем я писал. Это разве сделано? Это не ошибки, это предупреждения, но первая приведет к тому, что вместо темы ничего не будет в письме. Втрое можно вообще игнорировать, и с отключением их вывода, что на сервере и должно быть, вы даже и знать об этом не будете.
После строки 42, определите ее $subject = "Чего такое нужное"; и в строке 43 замените $data['subject'] на $subject. В строке 49, начинать "сборку" этой переменной не с конкатенации а с объявления убрать точку перед =: $body = '--==boundary-2' . PHP_EOL.PHP_EOL; |
$to = 'pocta@mail.ru'; $subject = "Тема письма"; $subject = '=?utf-8?b?' . base64_encode($subject) . '?='; $headers = 'From: =?utf-8?B?' . base64_encode($name) . '?= <' . $data['email'] . '>' . PHP_EOL; $headers .= 'Reply-To: receiver@domain3.com' . PHP_EOL; $headers .= 'X-Mailer: PHP/' . phpversion() . PHP_EOL; $headers .= 'Mime-Version: 1.0' . PHP_EOL; $headers .= 'Content-Type: multipart/alternative; boundary="==boundary-2"' . PHP_EOL.PHP_EOL; $body = '--==boundary-2' . PHP_EOL.PHP_EOL; $body .= 'Content-type: text/plain; charset="utf-8"' . PHP_EOL; $body .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL.PHP_EOL; $body .= $text . PHP_EOL; //текстовая версия $body .= '--==boundary-2' . PHP_EOL; $body .= 'Content-Type: multipart/related; boundary="==boundary-1"; type="text/html"' . PHP_EOL.PHP_EOL; $body .= '--==boundary-1' . PHP_EOL; $body .= 'Content-type: text/html; charset="utf-8"' . PHP_EOL; $body .= 'Content-Transfer-Encoding: base64' . PHP_EOL.PHP_EOL; $body .= chunk_split(base64_encode($html)) . PHP_EOL.PHP_EOL; //html версия $body .= '--==boundary-1--' . PHP_EOL; $body .= '--==boundary-2--' . PHP_EOL; result "error" data 0 "Некорректное значение поля «Пол»!" 1 "Некорректное значение поля «Сотрудник»!" |
Вы читаете то, что я пишу или? Либо вы в раздел работа, там по всем мелочам претензии и я делаю платную работу от до всего, либо будьте добры читать, думать и действовать.
А я писал, что в одной опции списка Пол я указал значение неверное и для одной опции Сотрудники, чтобы выбрав именно их, проверить работу клиент-сервер. Найти где это написано и заменить на корректное. |
Цитата:
остался один вопрос: почему после отправки письма страница не обновляется, а происходит переход на страницу /feedback/mails_sender3.php с сообщением: result: "done" data: 0: "Письмо отправлено" Думаю скорее всего не работает аякс. |
Это значит, что форма отправляется естественным способом, JS не работает. Либо jQery не подключен, либо еще какие либо причины, например, есть еще js код, и в нем ошибка, которая не позволяет выполнятся далее.
|
Часовой пояс GMT +3, время: 15:19. |