Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Не проверяет поле Select в форме "Обратная связь" (https://javascript.ru/forum/dom-window/81314-ne-proveryaet-pole-select-v-forme-obratnaya-svyaz.html)

zulfukar 08.11.2020 17:49

Не проверяет поле Select в форме "Обратная связь"
 
Установил на сайт скрипт Обратной связи, изменил под себя (использую как Задать вопрос), все работает, но при отправке не проверяет 2 поля <select> (выбрано в них что-то или нет).

Еще нужно прикрутить какую-нибудь капчу, чтобы спамеры не доставали.
Сам не смог справиться с этим, знаний не хватает. Помогите пожалуйста.
Заранее благодарю.

файл mails_sender.php
<?php
 
// Адрес, куда отправляем письмо
$to = 'pochta@mail.ru';
 
// Получаем данные от пользователя
// Все данные обязательно нужно проверять на правильность!
$userEmail = filter_input(INPUT_POST, 'youremail', FILTER_VALIDATE_EMAIL);
$subject = filter_input(INPUT_POST, 'subject', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
$option = filter_input(INPUT_POST, 'option', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
$message = strip_tags(filter_input(INPUT_POST, 'message', FILTER_SANITIZE_MAGIC_QUOTES), '<p><a><b><div><br>');
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
$sex = filter_input(INPUT_POST, 'sex', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
 
// Проверка, что данные не пустые. 
// Нас не интересуют анонимки
if (empty($userEmail)) {
    die('Отсутствует или неверен адрес почты');
// Нас не интересуют послания с пустым сообщением
} elseif (empty($message)) {
    die('Отсутствует сообщение');
} elseif (empty($sex)) {
    $sex = '[Выберите Ваш пол]';
} elseif (empty($option)) {
    $option = '[Выберите сотрудника]';
}
// elseif (empty($subject)) {
//    $subject = '[тема не указана]';}
 
 
$the_file = '';
//Если пользователь выбрал файл для отправки
if (!empty($_FILES['fileforsending']['tmp_name'])) {
    // Закачиваем файл
    $path = $_FILES['fileforsending']['name'];
    if (copy($_FILES['fileforsending']['tmp_name'], $path)) {
        $the_file = $path;
    }
}
// Если есть прикреплённый файл, то заголовки чуть другие.
// Поэтому, в зависимости от того, отправил ли пользователь файл,
// выбираем, что делать дальше
$headers = null;
 
if (empty($the_file)) {
    // эта часть кода отвечает за отправку сообщений без вложений
    // собираем заголовки
    $headers = array();
    $headers[] = "MIME-Version: 1.0";
    $headers[] = "Content-type: text/html; charset=UTF-8";
    $headers[] = "From: $name <$userEmail>";
    $headers[] = "Bcc: JJ Chong <bcc@domain2.com>";
    $headers[] = "Reply-To: Recipient Name <receiver@domain3.com>";
    $headers[] = "Subject: Связь с администратором!";
    $headers[] = "X-Mailer: PHP/" . phpversion();
    // собираем текст письма
    $allmsg = "
    <p><b>Пол:</b> $sex</p>
    <p><b>E-mail:</b> $userEmail</p>
    <p><b>Сотрудник:</b> $option</p>
    <p><b>Сообщение:</b> $message</p>";
    $allmsg = " . $allmsg . ";
    // отправляем
    if (!mail($to, $subject, $allmsg, implode("\r\n", $headers))) {
        echo 'Письмо не отправлено - что-то не сработало.';
    } else {
        echo 'Ваше письмо успешно отправлено!';
    }
} else {
    // эта часть кода отвечает за отправку сообщений без вложений
    // читаем отправляемый файл в строку
    $fp = fopen($the_file, "r");
    if (!$the_file) {
        die("Ошибка отправки письма: Файл $the_file не может быть прочитан.");
    }
    $file = fread($fp, filesize($path));
    fclose($fp);
    // удаляем временный файл
    unlink($path);
    // собираем текст письма
    $allmsg = "
    <p><b>Пол:</b> $sex</p>
    <p><b>E-mail:</b> $userEmail</p>
    <p><b>Сотрудник:</b> $option</p>
    <p><b>Сообщение:</b> $message</p>";
    $allmsg = " . $allmsg . ";
    // генерируем разделитель
    $boundary = "--" . md5(uniqid(time()));
    // собираем заголовки
    $headers = array();
    $headers[] = "MIME-Version: 1.0";
    $headers[] = "From: $name <$userEmail>";
    $headers[] = "Bcc: JJ Chong <bcc@domain2.com>";
    $headers[] = "Reply-To: Recipient Name <receiver@domain3.com>";
    $headers[] = "Subject: Связь с администратором!";
    $headers[] = "X-Mailer: PHP/" . phpversion();
    $headers[] = "Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
    // собираем текст письма + приложенынй файл
    $multipart = array();
    $multipart[] = "--$boundary";
    $multipart[] = "Content-Type: text/html; charset=UTF-8";
    $multipart[] = "Content-Transfer-Encoding: Quot-Printed\r\n";
    $multipart[] = "$allmsg\r\n";
    $multipart[] = "--$boundary";
    $multipart[] = "Content-Type: application/octet-stream";
    $multipart[] = "Content-Transfer-Encoding: base64";
    $multipart[] = "Content-Disposition: attachment; filename = \"" . $path . "\"\r\n";
    $multipart[] = chunk_split(base64_encode($file));
    $multipart[] = "--$boundary";
    // отправляем
    if (!mail($to, $subject, implode("\r\n", $multipart), implode("\r\n", $headers))) {
        echo 'Письмо не отправлено - что-то не сработало.';
    } else {
        echo 'Отправлено письмо с вложениями.';
    }
}

zulfukar 08.11.2020 17:50

<div class="sub-title comadd"><h3>Задать вопрос!</h3></div>
        <div style="color: #f00;" id="result"></div>
        <img src="/feedback/ajax-loader.gif" id="load-indicator" alt="loading" style="position:absolute; z-index:1000; display:none;" />
 
<form method="post" action="/feedback/mails_sender.php" id="feedback" name="feedback" enctype="multipart/form-data">
    <div class="comment">
                <fieldset>
                        <select name="sex">
                            <option>Выберите Ваш пол *</option>
                            <option value="Мужчина">Мужчина</option>
                            <option value="Женщина">Женщина</option>
                        </select>
                </fieldset>
                <fieldset>
                        <input name="youremail" type="text" placeholder="Эл. @ почта *" size="20" />
                </fieldset>
                <fieldset>
                        <select name="option">
                            <option>Выберите сотрудника *</option>
                            <option value="Сергей">Сергей</option>
                            <option value="Иван">Иван</option>
                            <option value="Николай">Николай</option>
                            <option value="Антон">Антон</option>
                            <option value="Виктор">Виктор</option>
                        </select>
                </fieldset>
                <fieldset>
                        <textarea name="message" id="sendtext" placeholder="Текст сообщения *" style="resize: vertical; width: 98%; height: 130px; display: block;" cols="40" rows="5"></textarea>
                </fieldset>
    </div>
<table><tr><td style="padding-right:20px;">                
    <div class="send">
        <input name="to" type="hidden" value="send" />
        <button type="submit" class="sub">Отправить</button>
    </div>
</td><td>
        <input name="to" type="hidden" value="Очистить" />
        <button type="reset" class="sub">Очистить</button>
</td></tr>
</table>
</form>
 
        <script>
            // этот участок кода нужен только для отображения гифки
            // которая даёт пользователю понять, что что-то происходит
            // и нужно подождать
            $(document).ready(function () {
                $(document).ajaxStart(function () {
                    // найдем элемент с изображением загрузки и уберем невидимость:
                    var imgObj = $("#load-indicator");
                    imgObj.show();
                    // вычислим в какие координаты нужно поместить изображение загрузки,
                    // чтобы оно оказалось в серидине страницы:
                    var centerY = $(window).scrollTop() + ($(window).height() + imgObj.height()) / 2;
                    var centerX = $(window).scrollLeft() + ($(window).width() + imgObj.width()) / 2;
                    imgObj.offset({
                        left: centerX,
                        top: centerY
                    });
                });
                //скрываем изображение после окончания AJAX-запроса
                $(document).ajaxStop(function () {
                    $("#load-indicator").hide();
                });
            });
 
            // назначаем действие на такое событие как отправка формы
            $("#feedback").submit(function (evtObj) {
                evtObj.preventDefault();
                // Если элемент формы fileforsending содержит значения (т.е. выбран файл для отправки),
                // то вместо AJAX-запроса используем FormData()
                // поскольку файлы через AJAX-запросы не передаются                
 
                 {
                    var form = $(this);
                    $.ajax({
                        // Здесь файл, который обрабатывает полученные от пользователя данные и отправляет почту
                        url: "/feedback/mails_sender.php",
                        type: "POST",
                        data: form.serialize(),
                        // Действия в случае успешной отправки AJAX-запроса (а не письма!)
                        // Здесь data - полученное от mails_sender.php сообщение
                        success: function (data) {
                            if (data === "Отправлено письмо без вложений.") {
                                $("#result").html("Отправлено письмо без вложений.");
                                // Письмо отправлено, сбрасываем данные формы
                                document.getElementById("feedback").reset();
                                // Следующая строка после успешной отправки сообщения
                                // перенаправляет пользователь на любую страницу/сайт
                                // достаточно раскомментировать её и поменять адрес сайта webware.biz
                                // на ваш собственный
                                // document.location.href = "http://";
                            } else {
                                $("#result").html(data);
                            }
                        },
                        error: function (data) {
                            $("#result").html("Результат выполнения: " + data);
                        }
                    });
                }
            });
        </script>

laimas 08.11.2020 18:06

Сначала вопрос такого плана - на клиенте нет проверки формы пред отправкой и поля обязательные не имеют такого признака, то есть и нативной проверки тоже нет. В таком случае как нужно понимать это:
// Нас не интересуют анонимки
if (empty($userEmail)) {
    die('Отсутствует или неверен адрес почты');

и для других полей? Отчего такая уверенность, что это аноним, а не просто человеческий фактор - забыл, не усмотрел пользователь перед отправкой?

zulfukar 08.11.2020 18:31

Цитата:

Сообщение от laimas (Сообщение 530495)
Сначала вопрос такого плана - на клиенте нет проверки формы пред отправкой и поля обязательные не имеют такого признака, то есть и нативной проверки тоже нет. В таком случае как нужно понимать это:

При отправке родные поля проверяются. Не проверяются только 2 поля select ($option и $sex), которые я добавил.
форму можно посмотреть и проверить тут, в самом низу страницы: _http://new.313news.net

laimas 08.11.2020 18:35

Цитата:

Сообщение от zulfukar
При отправке родные поля проверяются

Где, этого не видно в коде, следовательно, сервер оборвет выполнение сценария и что делать пользователю?

laimas 08.11.2020 18:45

Цитата:

Сообщение от zulfukar
if (!empty($_FILES['fileforsending']['tmp_name']))

Это тоже, мягко говоря, глупости. Проверять не это нужно, а ключ error, и если нет ошибок, тогда обработка, но ни в коем случае не:
$path = $_FILES['fileforsending']['name'];
    if (copy($_FILES['fileforsending']['tmp_name'], $path)) {
        $the_file = $path;
    }

а исключительно move_uploaded_file, ибо copy при определенных условиях может даже и не выполняться. И обязательно basename($_FILES['fileforsending']['name']); Но если это прикрепление к почте, то зачем вообще перемещать файл в какой-то каталог, проверили файл, и читайте его из временного каталога.

zulfukar 08.11.2020 18:48

Цитата:

Сообщение от laimas
Где, этого не видно в коде, следовательно, сервер оборвет выполнение сценария и что делать пользователю?

я взял готовый скрипт и немного переделал его для своих нужд. Мне нужна именно такая форма и я не знаю как заставить этот код работать как надо. Поэтому и попросил помощи. Если есть возможность помогите пожалуйста.

laimas 08.11.2020 18:58

Да елки палки, ну как еще вам объяснить, что вы просто кверху каком своих пользователей поставите.

die() - это эквивалент функции exit(), которая выводит сообщение, если указан текст или ничего не выводит, если указано число, но обязательно прекращает работу скрипта. То есть, если пользователь по неосторожности забыл ввести данные в какое-то поле, то die("Text") выдаст сообщение пользователю и все, далее работать ничего не будет! И где логика?

Вы уж тогда хотя бы добавьте атрибут required обязательным для заполнения полям, в этом случае сам браузер не отправит форму с пустыми полями.

Но даже в этом случае die() нужно выбросить, ибо чтобы делать выход нужно быть на 100% уверенным, что это левый запрос. Нужен диалог для "браузеров калек", которые по той или иной причине пропустят такое. Но ведь введенный пробел в поле, уже не пустое значение, но и для сервера это не значение.

zulfukar 08.11.2020 19:09

Цитата:

Сообщение от laimas
Да елки палки, ну как еще вам объяснить, что вы просто кверху каком своих пользователей поставите.

Если бы я все понимал, то наверное не спрашивал бы тут, а сам все сделал :))
Я понял, что Вы хотите сказать, но это понимание никак не прибавляет мне знаний. Я в любом случае сам не смогу изменить код, так как не знаю даже азов java.
Может это звучит не очень приятно, но прошу исправить код за меня.

laimas 08.11.2020 19:11

И так тоже нельзя:
$headers[] = "Reply-To: Recipient Name <receiver@domain3.com>";
    $headers[] = "Subject: Связь с администратором!";

Это нужно кодировать. Времени сейчас нет свободного, есть тут знающие как, но если никто не поможет, то напишу как, но не сейчас, просто пока некогда.

zulfukar 08.11.2020 19:21

Цитата:

Сообщение от laimas
Это нужно кодировать. Времени сейчас нет свободного, есть тут знающие как, но если никто не поможет, то напишу как, но не сейчас, просто пока некогда.

я около месяца бился над этой задачей. Могу еще подождать. Меня сроки не поджимают. Буду рад если поможете.

laimas 10.11.2020 08:00

На клиенте:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<style>
.container {
    width: 30%;
    margin: 0 auto;
}

.container h3:before {
    content: attr(data-quest);
}

.container.send h3:before {
    content: attr(data-send);
}

.container.done h3:before {
    content: attr(data-done);
}

.container.error h3:before {
    content: attr(data-error);
    color: #f00;
}

.container .next {
    visibility: hidden;
}

.container:not(.send) .next {
    visibility: visible;
}

form {
    position: relative;
}

form * {
    box-sizing: border-box;
}

input, select, textarea {
    width: 100%;
}

textarea {
    resize: vertical; 
    height: 130px; 
}

/*цвет списка не выбранного*/
select:invalid {
    color: #767676; 
}
/*но только не его доступных опций*/
select:invalid option:not(:disabled) {
    color: #000;
}

.overlap {
    display: none;
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    padding: 30px;
    background-color: rgba(1, 34, 77, 0.93);
    z-index: 5;
}

.container.send .overlap,
.container.done .overlap,
.container.error .overlap {
    display: block;
}

.overlap ul {
    padding: 0;
    margin-top: 20px;
}

.overlap li {
    list-style: none;
    font-size: 18px;
    color: #fff;
}

.progress {
  display: none;
  justify-content: center;
  align-items: center;
  height: 100%;
  overflow: hidden;
}

.container.send .progress {
  display: flex;  
}

.circle {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  margin: 7px;
  display: flex;
  justify-content: center;
  align-items: center;
}

.circle:before {
  content: "";
  width: 20px;
  height: 20px;
  border-radius: 50%;
  opacity: 0.7;
  animation: scale 2s infinite cubic-bezier(0, 0, 0.49, 1.02);
}

.circle-1 {
  background-color: #49b8e5;
}
.circle-1:before {
  background-color: #49b8e5;
  animation-delay: 200ms;
}

.circle-2 {
  background-color: #1e98d4;
}
.circle-2:before {
  background-color: #1e98d4;
  animation-delay: 400ms;
}

.circle-3 {
  background-color: #2a92d0;
}
.circle-3:before {
  background-color: #2a92d0;
  animation-delay: 600ms;
}

.circle-4 {
  background-color: #3a88c8;
}
.circle-4:before {
  background-color: #3a88c8;
  animation-delay: 800ms;
}

.circle-5 {
  background-color: #507cbe;
}
.circle-5:before {
  background-color: #507cbe;
  animation-delay: 1000ms;
}

@keyframes scale {
  0% {
    transform: scale(1);
  }
  50%, 75% {
    transform: scale(2.5);
  }
  78%, 100% {
    opacity: 0;
  }
}
</style>
</head>
<body>

<div class="container">
<h3 data-quest="Задать вопрос" data-send="Отправление формы" data-done="Форма отправлена" data-error="Ошибки приема данных"></h3>

<form id="feedback" method="post" action="/feedback/mails_sender.php" enctype="multipart/form-data" autocomplete="off">
    <div class="comment">
                <fieldset>
                        <select name="sex" required="">
                            <option value="" selected="" disabled="">Выберите Ваш пол *</option>
                            <option value="1">Мужчина</option>
                            <option value="3">Женщина</option>
                        </select>
                </fieldset>
                <fieldset>
                        <input name="email" type="email" placeholder="Эл. @ почта *"  required="" />
                </fieldset>
                <fieldset>
                        <select name="worker" required="">
                            <option value="" selected="" disabled="">Выберите сотрудника *</option>
                            <option value="1">Сергей</option>
                            <option value="2">Иван</option>
                            <option value="a">Николай</option>
                            <option value="4">Антон</option>
                            <option value="5">Виктор</option>
                        </select>
                </fieldset>
                <fieldset>
                        <input name="subject" type="text" placeholder="Тема *"  required="" />
                </fieldset>
                <fieldset>
                        <textarea name="message" placeholder="Текст сообщения *" required=""></textarea>
                </fieldset>
                <fieldset>
                        <input type="file" name="file" />
                </fieldset>
    </div>
    
    <div class="buttons">
        <button type="submit" class="sub">Отправить</button>
        <button type="reset" class="sub">Очистить</button> 
    </div>
    
    <div class="overlap">
        <div class="progress">
            <div class="circle circle-1"></div>
            <div class="circle circle-2"></div>
            <div class="circle circle-3"></div>
            <div class="circle circle-4"></div>
            <div class="circle circle-5"></div>
        </div>
        <ul class="response"></ul>
        <button class="next" type="button">Продолжить</button>
    </div>    
</form>
</div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
<script>
var frm = $("#feedback").submit(function(e) {
    e.preventDefault(); //отменяем действие по умолчанию
    
    var container = $('.container'), //контейнер
        data = new FormData; //данные для отправления
    
    //помещаем поля формы в data
    $.each(frm.serializeArray(), function() {
        data.append(this.name, this.value)
    });
    //если есть выбор файла, добавляем его в data
    if(this.file.value) data.append('file', this.file.files[0]);
    
    $.ajax({
            url: this.action,
            type: 'post',
            dataType: 'json',
            data: data,
            cache: false,
            contentType: false,
            processData: false,
            beforeSend: function() {
                container.addClass('send') //показываем прогресс
            },
            complete: function() {
                container.removeClass('send') //удаляем прогресс
            },
            success: function(resp) {
                //определяем вывод сообщения в заголовке
                container.addClass(resp.result); 
                //выводим результат отправления
                frm.find('ul.response').html('<li>' + resp.data.join('</li><li>') + '</li>')
            },
            error: function(xhr, opt, error) {
	           alert(error + "\n" + xhr.statusText + "\n" + xhr.responseText);
            }
    })
}).find('button.next').click(function() {
    //сбросить форму если нет ошибок
    if(!frm.parent().hasClass('error')) frm.find('[type="reset"]').click(); 
    //убираем перекрытие формы
    frm.parent().removeClass('done error').find('ul.response').empty() 
}).end();
</script>
</body>
</html>

На просторах интернета "крутилок" как собак ... здесь одна из них, если есть беспокойство о древних браузерах, тогда гифки.
Вывод действа в заголовок формы, который определяется его data атрибутами и текущим именем родительского контейнера. Остальное не требует пояснения, надеюсь, это простой минимум, которого вполне хватает для отправления, "жир наращивать", это уже по вкусу и потребностям.

Полям добавлен атрибут required поэтому будет нативная проверка браузером и пустая форма отправляется не будет.
Значения списков не могут быть Сергей, Петя ... это должны быть идентификаторы, которые сервер проверяет. Собственно и в список Пол вставлять в значения мужчина/женщина, это от лени.

laimas 10.11.2020 08:05

На сервере:
<?php
//задержка для посмотерть как работает форма при отправке, удалить после
sleep(2); 

$check = [
    'sex'       => [
        'filter'    => FILTER_VALIDATE_INT, //пол, это вообще-то поле типа ENUM в базе со значениями: 1 - мужчина, 2 - женщина, это и надо проверять 
        'flags'     => FILTER_REQUIRE_SCALAR, 
        'options'   => ['min_range' => 1, 'max_range' => 2]
    ],
    'email'     => FILTER_VALIDATE_EMAIL,
    'worker'    => FILTER_VALIDATE_INT, //сотрудник Петя может быть таким только как текст опции, но никак не ее значение, значением должен быть уникальный идентфикатор сотрудника
    'subject'   => [
        'filter'    => FILTER_VALIDATE_REGEXP,  
        'options'   => ['regexp' =>'/^[а-яё\s]{10,60}$/ui']
    ],
    'message'   => FILTER_SANITIZE_SPECIAL_CHARS //нет смысла в strip_tags, если отправление в html формате, лучше преобразовать в html сущности
];

$error_message = [
    'sex'       => 'Некорректное значение поля «Пол»!',
    'email'     => 'Некорректное значение поля «Адрес почты»!',
    'worker'    => 'Некорректное значение поля «Сотрудник»!',
    'subject'   => 'Некорректное значение поля «Тема»!',
    'message'   => 'Некорректное значение поля «Сообощение»!',
    'file'      => 'Ошибка получения файла!'
];

$errors = [];

//убираем возможные крайние пробелы
$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(!empty($_FILES)) {
    if(!$_FILES['error']) {
        //другие проверки файла - тип, размер и прочее что нужно        
    } else $errors += array_intersect_key($error_message, array_flip(array_keys($_FILES))); //если ошибка загрузки файла
}

//отправляем ошибки клиенту
if($errors) { 
    header('Content-Type: application/json');
    exit(json_encode(['result'=> 'error', 'data'=>  array_values($errors)]));
} else {
    //имитация базы
    $sex = [1 => 'мужчина', 'женщина'];
    $worker = [1 => 'Сергей', 'Иван', 'Николай', 'Антон', 'Виктор'];
    //получаем имя сотрудника запросом к базе по его 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             = '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          .= !empty($_FILES) ? '--==boundary-1' . PHP_EOL : '--==boundary-1--' . PHP_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, $subject, $body, $headers);
    
    //функция mail не знает о том отправлено ли письмо или нет, она лишь сообщает о факте его принятия для отправления программой sendmail
    
    header('Content-Type: application/json');
    exit(json_encode(['result'=> 'done', 'data'=>  ['Письмо отправлено']]));
}

А вообще используйте готовые библиотеки, которые более серьезно к этому подходят, например phpmailer. Она отправляет и по SMTP, что не мало важно в нынешнее время, когда не редкость в отказе хостов к доступу функции mail из-за вала спама захлестнувшего почту, только SMTP.

laimas 10.11.2020 08:18

В двух списках специально некорректные значения - в списке Пол у женщины, 3 вместо 2, и не цифровое значение в списке Сотрудники у опции Николай, чтобы проверить.

zulfukar 10.11.2020 15:13

Спасибо за помощь.
1. При отправке проверяет все поля, кроме поля Текст. Его можно отправить пустым.

2. После нажатия на кнопку "Отправить" белая страница! Ругается на
PHP Parse error:  syntax error, unexpected '[' in /feedback/mails_sender3.php on line 5
В файле mails_sender3.php размещена серверная часть.

3. Помогите убрать поля Тема и Загрузка файла, они не нужны. Можно ли вместо них прикрутить какую-нибудь капчу, чтобы спамеры не доставали?

laimas 10.11.2020 16:02

Цитата:

Сообщение от zulfukar
При отправке проверяет все поля, кроме поля Текст. Его можно отправить пустым.

Убрать атрибут required="" у текстового поля, и заодно звездочку в подсказке к нему, исключить это поле из фильтров и отдельно пропускать его значение через htmlspecialchars().

PHP Parse error: syntax error, unexpected '[' - старая версия РНР, ниже 5.4. Собственно [], это сокращенная запись array(), которая доступна с версии 5.4. Либо выберите версию выше, либо замените это на array().

Помогите убрать поля Тема и Загрузка файла, они не нужны. - просто уберите их из формы, из фильтров уберите проверку поля темы письма и определите свой текст, но до его кодирования, и удалите все что касается загрузки файла. А каптча, это лучше использовать готовые решения, например от Гугла, а как ее подключить, это в сети найдете.

Вы показываете код, в котором все, а затем только начинаются уточнения - это не надо, тут не то ...

zulfukar 10.11.2020 17:49

Посмотрите пожалуйста правильно ли поменял [ на array(
В строке 88 и далее что-то не так. Я не понял как там менять

<?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, //сотрудник Петя может быть таким только как текст опции, но никак не ее значение, значением должен быть уникальный идентфикатор сотрудника
	    'subject'   => array(
	        'filter'    => FILTER_VALIDATE_REGEXP, 
	        'options'   => array('regexp' =>'/^(а-яё\s){10,60}$/ui')
	    ),
	    'message'   => FILTER_SANITIZE_SPECIAL_CHARS //нет смысла в strip_tags, если отправление в html формате, лучше преобразовать в html сущности
	);
	 
	$error_message = array(
	    'sex'       => 'Некорректное значение поля «Пол»!',
	    'email'     => 'Некорректное значение поля «Адрес почты»!',
	    'worker'    => 'Некорректное значение поля «Сотрудник»!',
	    'subject'   => 'Некорректное значение поля «Тема»!',
	    '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(!empty($_FILES)) {
	    if(!$_FILES('error')) {
	        //другие проверки файла - тип, размер и прочее что нужно       
	    } else $errors += array_intersect_key($error_message, array_flip(array_keys($_FILES))); //если ошибка загрузки файла
	}
	 
	//отправляем ошибки клиенту
	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             = 'pocta@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          .= !empty($_FILES) ? '--==boundary-1' . PHP_EOL : '--==boundary-1--' . PHP_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, $subject, $body, $headers);
	     
	    //функция mail не знает о том отправлено ли письмо или нет, она лишь сообщает о факте его принятия для отправления программой sendmail
	     
	    header('Content-Type: application/json');
	    exit(json_encode(array('result'=> 'done', 'data'=>  array('Письмо отправлено'))));
	}

laimas 10.11.2020 18:04

:)
Ну тут:

$check = array(
        'sex'       => array(
...
и до конца


все верно, но !$_FILES('error') так и должно быть !$_FILES['error'], как и $data('worker') должно быть $data['worker'], и {$sex[$data[sex]]}, и т.д., и т.п., так как это не объявление массива, а обращение к элементу массива по ключу/индексу, и это пишется именно в квадратных скобках.

laimas 10.11.2020 18:09

Но коли вам не нужно вложения файлов, то проверку его
if(!empty($_FILES)) {
        if(!$_FILES('error')) {
            //другие проверки файла - тип, размер и прочее что нужно      
        } else $errors += array_intersect_key($error_message, array_flip(array_keys($_FILES))); //если ошибка загрузки файла
    }

можно удалить. В почте строку

$body          .= !empty($_FILES) ? '--==boundary-1' . PHP_EOL : '--==boundary-1--' . PHP_EOL;


заменить на

$body          .= '--==boundary-1--' . HP_EOL;


Удалить начиная с if(!empty($_FILES)) { и по закрывающую }

zulfukar 10.11.2020 18:40

PHP Parse error:  syntax error, unexpected $end in /feedback/mails_sender3.php on line 102
это самая последняя строка
}

zulfukar 10.11.2020 19:02

Цитата:

Сообщение от laimas (Сообщение 530633)
Но коли вам не нужно вложения файлов, то проверку его
if(!empty($_FILES)) {
        if(!$_FILES('error')) {
            //другие проверки файла - тип, размер и прочее что нужно      
        } else $errors += array_intersect_key($error_message, array_flip(array_keys($_FILES))); //если ошибка загрузки файла
    }

можно удалить. В почте строку

$body          .= !empty($_FILES) ? '--==boundary-1' . PHP_EOL : '--==boundary-1--' . PHP_EOL;


заменить на

$body          .= '--==boundary-1--' . HP_EOL;


Удалить начиная с if(!empty($_FILES)) { и по закрывающую }

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

laimas 10.11.2020 19:51

Значит вы где-то удали или оставили лишнюю закрывающую фигурную скобку. В редакторе проверьте, если к примеру в таком условии

if(...) {
....

отметить открывающую фигурную скобку (курсор на нее) то будет подсвечена ее парная закрывающая тело этого условия фигурная скобка. Если скобка лишняя, то отметка ее окрасит ее в красный цвет.

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

Внимательно проверьте.

zulfukar 10.11.2020 20:09

Вроде бы все правильно
<?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('Письмо отправлено'))));
	}

laimas 10.11.2020 21:50

<?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('Письмо отправлено'))));
}

zulfukar 10.11.2020 22:10

Вложений: 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

laimas 11.11.2020 03:56

Начинайте понемногу соображать сами - вы говорили, что тему письма не нужно задавать формой, а значит что, удалить и определить свою, о чем я писал. Это разве сделано? Это не ошибки, это предупреждения, но первая приведет к тому, что вместо темы ничего не будет в письме. Втрое можно вообще игнорировать, и с отключением их вывода, что на сервере и должно быть, вы даже и знать об этом не будете.

После строки 42, определите ее
$subject = "Чего такое нужное";

и в строке 43 замените $data['subject'] на $subject.

В строке 49, начинать "сборку" этой переменной не с конкатенации а с объявления убрать точку перед =:
$body          = '--==boundary-2' . PHP_EOL.PHP_EOL;

zulfukar 11.11.2020 15:08

$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 "Некорректное значение поля «Сотрудник»!"

laimas 11.11.2020 15:15

Вы читаете то, что я пишу или? Либо вы в раздел работа, там по всем мелочам претензии и я делаю платную работу от до всего, либо будьте добры читать, думать и действовать.

А я писал, что в одной опции списка Пол я указал значение неверное и для одной опции Сотрудники, чтобы выбрав именно их, проверить работу клиент-сервер.

Найти где это написано и заменить на корректное.

zulfukar 11.11.2020 16:12

Цитата:

Сообщение от laimas (Сообщение 530655)
А я писал, что в одной опции списка Пол я указал значение неверное и для одной опции Сотрудники, чтобы выбрав именно их, проверить работу клиент-сервер.
Найти где это написано и заменить на корректное.

я забыл об этом. исправил, работает.
остался один вопрос: почему после отправки письма страница не обновляется, а происходит переход на страницу /feedback/mails_sender3.php с сообщением:

result: "done"
data:
0: "Письмо отправлено"

Думаю скорее всего не работает аякс.

laimas 11.11.2020 16:19

Это значит, что форма отправляется естественным способом, JS не работает. Либо jQery не подключен, либо еще какие либо причины, например, есть еще js код, и в нем ошибка, которая не позволяет выполнятся далее.


Часовой пояс GMT +3, время: 16:49.