Почему с формы обратной связи на почту хостинга приходит пустое письмо?
Здравствуйте! Загрузила на сайт главную страницу. Проверила форму, а на почту приходят пустые письма с нее.
Подскажите, пожалуйста, способы диагностики этой проблемы?
Или, если проблема очевидна, подскажите, как исправить?
Сайт:
antik88.ru
Код:
<section class="feedback"> <div class="container"> <h2 class="large-title .large-title_feedback">Есть вопросы?</h2> <p class="mini-title .mini-title_feedback "> <a name="form"> Вы можете задать интересующий Вас вопрос,и наши специалисты ответят Вам в ближайшее время!</a></p> <div class="about-form"> <form action="#" id="form_body" class="form"> <!-- Hidden Required Fields --> <input type="hidden" name="project_name" value="Antik-Salon_88"> <input type="hidden" name="admin_email" value="info@antik88.ru"> <input type="hidden" name="form_subject" value="Заявка с нижней формы"> <!-- END Hidden Required Fields --> <!-- <h1 class="form_title">Отправка данных на почту</h1> --> <input id="name" class="form_input" type="text" placeholder="Ваше имя*"> <input id="email" class="form_input" type="email" placeholder="Ваш E-mail или телефон"> <div class="input__wrapper"> <input name="file" type="file" id="input__file" class="input input__file" multiple> <label for="input__file" class="input__file-button"> <span class="input__file-icon-wrapper"><img class="input__file-icon" src="icons/upload.svg" alt="Выбрать файл" width="25"></span> <span class="input__file-button-text">Загрузите фото</span> </label> </div> <textarea id="for_message" class="form_textarea" placeholder="Ваш вопрос*"></textarea> <button class="form_btn" type="submit">Отправить</button> </form> </div> </div> </section> |
<section class="feedback"> <div class="container"> <h2 class="large-title .large-title_feedback">Есть вопросы?</h2> <p class="mini-title .mini-title_feedback "> <a name="form"> Вы можете задать интересующий Вас вопрос,и наши специалисты ответят Вам в ближайшее время!</a></p> <div class="about-form"> <form action="#" id="form_body" class="form"> <!-- Hidden Required Fields --> <input type="hidden" name="project_name" value="Antik-Salon_88"> <input type="hidden" name="admin_email" value="info@antik88.ru"> <input type="hidden" name="form_subject" value="Заявка с нижней формы"> <!-- END Hidden Required Fields --> <!-- <h1 class="form_title">Отправка данных на почту</h1> --> <input id="name" class="form_input" type="text" placeholder="Ваше имя*"> <input id="email" class="form_input" type="email" placeholder="Ваш E-mail или телефон"> <div class="input__wrapper"> <input name="file" type="file" id="input__file" class="input input__file" multiple> <label for="input__file" class="input__file-button"> <span class="input__file-icon-wrapper"><img class="input__file-icon" src="icons/upload.svg" alt="Выбрать файл" width="25"></span> <span class="input__file-button-text">Загрузите фото</span> </label> </div> <textarea id="for_message" class="form_textarea" placeholder="Ваш вопрос*"></textarea> <button class="form_btn" type="submit">Отправить</button> </form> </div> </div> </section>
<?php $method = $_SERVER['REQUEST_METHOD']; //Script Foreach $c = true; if ( $method === 'POST' ) { $project_name = trim($_POST["project_name"]); $admin_email = trim($_POST["admin_email"]); $form_subject = trim($_POST["form_subject"]); foreach ( $_POST as $key => $value ) { if ( $value != "" && $key != "project_name" && $key != "admin_email" && $key != "form_subject" ) { $message .= " " . ( ($c = !$c) ? '<tr>':'<tr style="background-color: #f8f8f8;">' ) . " <td style='padding: 10px; border: #e9e9e9 1px solid;'><b>$key</b></td> <td style='padding: 10px; border: #e9e9e9 1px solid;'>$value</td> </tr> "; } } } else if ( $method === 'GET' ) { $project_name = trim($_GET["project_name"]); $admin_email = trim($_GET["admin_email"]); $form_subject = trim($_GET["form_subject"]); foreach ( $_GET as $key => $value ) { if ( $value != "" && $key != "project_name" && $key != "admin_email" && $key != "form_subject" ) { $message .= " " . ( ($c = !$c) ? '<tr>':'<tr style="background-color: #f8f8f8;">' ) . " <td style='padding: 10px; border: #e9e9e9 1px solid;'><b>$key</b></td> <td style='padding: 10px; border: #e9e9e9 1px solid;'>$value</td> </tr> "; } } } $message = "<table style='width: 100%;'>$message</table>"; function adopt($text) { return '=?UTF-8?B?'.Base64_encode($text).'?='; } $headers = "MIME-Version: 1.0" . PHP_EOL . "Content-Type: text/html; charset=utf-8" . PHP_EOL . 'From: '.adopt($project_name).' <'.$admin_email.'>' . PHP_EOL . 'Reply-To: '.$admin_email.'' . PHP_EOL; mail($admin_email, adopt($form_subject), $message, $headers ); |
<?php $method = $_SERVER['REQUEST_METHOD']; //Script Foreach $c = true; if ( $method === 'POST' ) { $project_name = trim($_POST["project_name"]); $admin_email = trim($_POST["admin_email"]); $form_subject = trim($_POST["form_subject"]); foreach ( $_POST as $key => $value ) { if ( $value != "" && $key != "project_name" && $key != "admin_email" && $key != "form_subject" ) { $message .= " " . ( ($c = !$c) ? '<tr>':'<tr style="background-color: #f8f8f8;">' ) . " <td style='padding: 10px; border: #e9e9e9 1px solid;'><b>$key</b></td> <td style='padding: 10px; border: #e9e9e9 1px solid;'>$value</td> </tr> "; } } } else if ( $method === 'GET' ) { $project_name = trim($_GET["project_name"]); $admin_email = trim($_GET["admin_email"]); $form_subject = trim($_GET["form_subject"]); foreach ( $_GET as $key => $value ) { if ( $value != "" && $key != "project_name" && $key != "admin_email" && $key != "form_subject" ) { $message .= " " . ( ($c = !$c) ? '<tr>':'<tr style="background-color: #f8f8f8;">' ) . " <td style='padding: 10px; border: #e9e9e9 1px solid;'><b>$key</b></td> <td style='padding: 10px; border: #e9e9e9 1px solid;'>$value</td> </tr> "; } } } $message = "<table style='width: 100%;'>$message</table>"; function adopt($text) { return '=?UTF-8?B?'.Base64_encode($text).'?='; } $headers = "MIME-Version: 1.0" . PHP_EOL . "Content-Type: text/html; charset=utf-8" . PHP_EOL . 'From: '.adopt($project_name).' <'.$admin_email.'>' . PHP_EOL . 'Reply-To: '.$admin_email.'' . PHP_EOL; mail($admin_email, adopt($form_subject), $message, $headers );
Благодарю Вас заранее за ответ!
Дополнительно:
в самом начале напишите $message = 'Ничего нет';
Если в письме будет этот текст, то делайте выводы
согласно www.faqs.org/rfcs/rfc2822.html строки сообщения должны быть разделены символами CR LF (rn). Пункт 2.1.
Вы используете PHP_EOL, который в линуксе равен только переводу строки, без возврата каретки (n).
Используйте последовательность CRLF
$headers = "MIME-Version: 1.0" . "rn" . "Content-Type: text/html; charset=utf-8" . "rn" . |
$headers = "MIME-Version: 1.0" . "rn" . "Content-Type: text/html; charset=utf-8" . "rn" .
Я не гарантирую, что проблема в этом, просто это бросилось в глаза
- Почему у меня пушка не стреляет? Вот все на месте, колеса, затвор, завязанный узлом ствол
- Навскидку: у вас краска на щитке поцарапана
))))
Анна, у двух <input> и у одного <textarea> нет параметра name, вот совсем нет. И action у формы какой-то невнятный. Сделайте простейший var_dump($_POST);
Ну то есть вот так должно быть?
<textarea id="for_message" class="form_textarea" name= "что-то надо написать" placeholder="Ваш вопрос*"></textarea> |
<textarea id="for_message" class="form_textarea" name= "что-то надо написать" placeholder="Ваш вопрос*"></textarea>
Я пытаюсь во всем разобраться, к сожалению, шокируя публику своими вопросами)
И про action. Вот так надо?
Вот вы пишете,
<input type="hidden" name="project_name" value="Antik-Salon_88">
а потом в РНР
$_POST["project_name"]
и вопроса, что писать в name здесь у вас не возникает.
а двумя строчками ниже - вдруг полная остановка, что писать - непонятно.
Еще я добавила project_name в инпут и отобразилось имя, которое вводит человек.
<input name="project_name" id="name" class="form_input" type="text" placeholder="Ваше имя*"> |
<input name="project_name" id="name" class="form_input" type="text" placeholder="Ваше имя*">
но вот с textarea это не работает, если подставить name="project_name" в textarea, то текст сообщения выводится в месте, где должно быть имя человека, то есть вместо "письмо от Иван Иваныча" мы видим "оцените мой предмет", например. А поле для вывода самого текста сообщения так и остается пустым .
Согласно тексту скрипта
'From: '.adopt($project_name).' <'.$admin_email.'>' |
'From: '.adopt($project_name).' <'.$admin_email.'>'
, письмо считается отправленным с адреса $admin_email, то есть с адреса
<input type="hidden" name="admin_email" value="info@antik88.ru"> |
<input type="hidden" name="admin_email" value="info@antik88.ru">
. Поэтому и ответ идёт на этот info@antik88.ru, всё правильно.
А отправить письмо с "From:" в виде чужого адреса - это можно упереться в систему анти-спама.
Не надо хранить/передавать e-mail в HTML-форме. Он должен быть жестко зашит в PHP-скрипте, невидим web-пользователям, и снаружи не изменяться.
Ну и $admin_email переносите в скрипт, его не должно быть в HTML форме, вообще!
$admin_email = trim($_POST["admin_email"]);
и
$admin_email = trim($_GET["admin_email"]);
А в начале скрипта сделайте:
$method = $_SERVER['REQUEST_METHOD']; $admin_email = "info@antik88.ru"; |
$method = $_SERVER['REQUEST_METHOD']; $admin_email = "info@antik88.ru";
Ну и из формы уберите
<input type="hidden" name="admin_email" value="info@antik88.ru"> |
<input type="hidden" name="admin_email" value="info@antik88.ru">
тоже незачем адрес светить на весь Интернет.
Осталось только сделать, чтобы файлы тоже отправлялись, но, думаю, экспериментальным путем исправлю это.
Спасибо огромное Вам!)))
Сделайте простую форму из 4 строчек:
- форма
- текстария
- кнопка submit
- закрыть форму
у текстарии должно быть имя, у сабмита - не нужно.
после этого в РНР выведите массив $_POST и убедитесь что видите введенный текст.
Если видите, то добавляйте код отправки этого текста на почту.
Вы сделайте, и задавайте вопросы по ходу дела
$file = "act.jpg";
Мне показалось логичным это, и я добавила еще
$fileRead = fopen($file, "r"); // открываем файл $contentFile = fread($fileRead, filesize($file)); // считываем его до конца fclose($fileRead); // закрываем файл $bodyMail .= "Content-Type: application/octet-stream; name==?utf-8?B?".base64_encode(basename($file))."?=n"; $bodyMail .= "Content-Transfer-Encoding: base64n"; // кодировка файла $bodyMail .= "Content-Disposition: attachment; filename==?utf-8?B?".base64_encode(basename($file))."?=nn"; $bodyMail .= chunk_split(base64_encode($contentFile))."n"; // кодируем и прикрепляем файл $bodyMail .= "--".$separator ."--n"; |
$fileRead = fopen($file, "r"); // открываем файл $contentFile = fread($fileRead, filesize($file)); // считываем его до конца fclose($fileRead); // закрываем файл $bodyMail .= "Content-Type: application/octet-stream; name==?utf-8?B?".base64_encode(basename($file))."?=n"; $bodyMail .= "Content-Transfer-Encoding: base64n"; // кодировка файла $bodyMail .= "Content-Disposition: attachment; filename==?utf-8?B?".base64_encode(basename($file))."?=nn"; $bodyMail .= chunk_split(base64_encode($contentFile))."n"; // кодируем и прикрепляем файл $bodyMail .= "--".$separator ."--n";
Письма приходят по прежнему без загруженных изображений. Возможно, это совсем не то, что нужно и без jquery тут не обойтись? Или все-таки можно найти походящий код? Если спросить проще, насколько я близка к решению проблемы отправки файлов вот с этим кодом?
<?php var_dump($_POST); $method = $_SERVER['REQUEST_METHOD']; $admin_email = "info@antik88.ru"; $file = "act.jpg"; // файл //Script Foreach $c = true; if ( $method === 'POST' ) { $form_subject = trim($_POST["form_subject"]); foreach ( $_POST as $key => $value ) { if ( $value != "" && $key != "project_name" && $key != "admin_email" && $key != "form_subject" ) { $message .= " " . ( ($c = !$c) ? '<tr>':'<tr style="background-color: #f8f8f8;">' ) . " <td style='padding: 10px; border: #e9e9e9 1px solid;'><b>$key</b></td> <td style='padding: 10px; border: #e9e9e9 1px solid;'>$value</td> </tr> "; } } } else if ( $method === 'GET' ) { $project_name = trim($_GET["project_name"]); $admin_email = trim($_GET["admin_email"]); $form_subject = trim($_GET["form_subject"]); $fileRead = fopen($file, "r"); // открываем файл $contentFile = fread($fileRead, filesize($file)); // считываем его до конца fclose($fileRead); // закрываем файл $bodyMail .= "Content-Type: application/octet-stream; name==?utf-8?B?".base64_encode(basename($file))."?=n"; $bodyMail .= "Content-Transfer-Encoding: base64n"; // кодировка файла $bodyMail .= "Content-Disposition: attachment; filename==?utf-8?B?".base64_encode(basename($file))."?=nn"; $bodyMail .= chunk_split(base64_encode($contentFile))."n"; // кодируем и прикрепляем файл $bodyMail .= "--".$separator ."--n"; foreach ( $_GET as $key => $value ) { if ( $value != "" && $key != "project_name" && $key != "admin_email" && $key != "form_subject" ) { $message .= " " . ( ($c = !$c) ? '<tr>':'<tr style="background-color: #f8f8f8;">' ) . " <td style='padding: 10px; border: #e9e9e9 1px solid;'><b>$key</b></td> <td style='padding: 10px; border: #e9e9e9 1px solid;'>$value</td> </tr> "; } } } $message = "<table style='width: 100%;'>$message</table>"; function adopt($text) { return '=?UTF-8?B?'.Base64_encode($text).'?='; } $headers = "MIME-Version: 1.0" . PHP_EOL . "Content-Type: text/html; charset=utf-8" . PHP_EOL . 'From: '.adopt($project_name).' <'.$admin_email.'>' . PHP_EOL . 'Reply-To: '.$admin_email.'' . PHP_EOL; mail($admin_email, adopt($form_subject), $message, $headers ); |
<?php var_dump($_POST); $method = $_SERVER['REQUEST_METHOD']; $admin_email = "info@antik88.ru"; $file = "act.jpg"; // файл //Script Foreach $c = true; if ( $method === 'POST' ) { $form_subject = trim($_POST["form_subject"]); foreach ( $_POST as $key => $value ) { if ( $value != "" && $key != "project_name" && $key != "admin_email" && $key != "form_subject" ) { $message .= " " . ( ($c = !$c) ? '<tr>':'<tr style="background-color: #f8f8f8;">' ) . " <td style='padding: 10px; border: #e9e9e9 1px solid;'><b>$key</b></td> <td style='padding: 10px; border: #e9e9e9 1px solid;'>$value</td> </tr> "; } } } else if ( $method === 'GET' ) { $project_name = trim($_GET["project_name"]); $admin_email = trim($_GET["admin_email"]); $form_subject = trim($_GET["form_subject"]); $fileRead = fopen($file, "r"); // открываем файл $contentFile = fread($fileRead, filesize($file)); // считываем его до конца fclose($fileRead); // закрываем файл $bodyMail .= "Content-Type: application/octet-stream; name==?utf-8?B?".base64_encode(basename($file))."?=n"; $bodyMail .= "Content-Transfer-Encoding: base64n"; // кодировка файла $bodyMail .= "Content-Disposition: attachment; filename==?utf-8?B?".base64_encode(basename($file))."?=nn"; $bodyMail .= chunk_split(base64_encode($contentFile))."n"; // кодируем и прикрепляем файл $bodyMail .= "--".$separator ."--n"; foreach ( $_GET as $key => $value ) { if ( $value != "" && $key != "project_name" && $key != "admin_email" && $key != "form_subject" ) { $message .= " " . ( ($c = !$c) ? '<tr>':'<tr style="background-color: #f8f8f8;">' ) . " <td style='padding: 10px; border: #e9e9e9 1px solid;'><b>$key</b></td> <td style='padding: 10px; border: #e9e9e9 1px solid;'>$value</td> </tr> "; } } } $message = "<table style='width: 100%;'>$message</table>"; function adopt($text) { return '=?UTF-8?B?'.Base64_encode($text).'?='; } $headers = "MIME-Version: 1.0" . PHP_EOL . "Content-Type: text/html; charset=utf-8" . PHP_EOL . 'From: '.adopt($project_name).' <'.$admin_email.'>' . PHP_EOL . 'Reply-To: '.$admin_email.'' . PHP_EOL; mail($admin_email, adopt($form_subject), $message, $headers );
И еще такой вопрос. Этот емейл info@antik88.ru никто не должен видеть? нельзя размещать его на сайте в контактной информации? или все-таки можно?
По поводу файлов, прочитайте вот этот старый ответ.
По поводу емейла - как хотите
Спасибо Вам огромное, я попробую разобраться с php мейлером, хотя и инструкция на английском не готовит мне ничего хорошего... Я находила его на git и просто не рискнула взяться за него именно из-за отсутствия объяснения на русском, боюсь нахеровертить чего-то страшного и все испортить. Но, если Вы говорите, что это действительно хорошее решение, я попробую.
Странно, какой разительный контраст с кодом из удаленного вопроса.
Я уж хотел вспомнить молодость, поумиляться глубокомысленному коду $post = !empty($_POST) ? true : false;...
Но с другой стороны, в удаленном коде было непонятно, почему вообще письмо уходит, а здесь уже гораздо ближе к реальности.
обратить внимание надо, во-первых, на тег
<form action="#" id="form_body" class="form">
и посмотреть в примерах, что туда пишут.
После этого вывести результат var_dump($_POST); и внимательно его изучить.
После этого снова вернуться к форме и подумать, чего в ней не хватает
Ну и разумеется выкинуть часть с else if ( $method === 'GET' ) {
- Это я экспериментировала с кодом и случайно вставила в вопрос то, что не работало совсем)
Благодарю Вас за терпение) Подскажите, пожалуйста, как понять, что в них пишут? Зашла на сайт к конкурентам, в инструментах разработчика увидела<input class="wpcf7-form-control has-spinner wpcf7-submit btn" type="submit" value="Отправить на оценку" /> </p><div class="wpcf7-response-output" aria-hidden="true">
<input class="wpcf7-form-control has-spinner wpcf7-submit btn" type="submit" value="Отправить на оценку" /> </p><div class="wpcf7-response-output" aria-hidden="true">
откуда взять эти интересные наборы символов?
- эти наборы не должны вас волновать ни в малейшей степени
- Я имею ввиду, что у меня тоже что-то должно быть вместо символа решетки. В поисках примеров, что пишут туда вместо решеток я и полезла на другие сайты.
- но смотрите почему-то в тег input, а не form
- Ипатьев, Спасибо Вам большое за ответы. Чувствую себя глупо, так как методом подбора у меня ничего не вышло. Подскажите, пожалуйста, где можно подробнее узнать, как правильно заполнять атрибуты к этим "почтовым" тегам. Попробавала вставить method="post"
и ничего не изменилось. Посоветуйте, пожалуйста, что-то для изучения. Что-то, что помогло бы решить мою проблему) - после добавления post надо сделать то, что у меня написано дальше:
вывести результат var_dump($_POST);
- Ипатьев, спасибо большое Вам за совет. Было бы справедливо хорошенько на меня разозлиться. Вывести результат var_dump($_POST); нужно в какой части файла php? Не ругайте за тупость очень сильно, пожалуйста) код я подобрала в уроке и попыталась совместить его с html, я совершенно ничего не понимаю в php, позор мне
- Анна, ну лучше в самом верху.
Это действие называется "отладкой": выполнение действий, которые не нужны для штатной работы программы, но помогают разобраться в том, почему она не работает.Результат работы var_dump лучше смотреть в исходном коде страницы. то есть после того как отправили форму, надо нажать Ctrl-U.
Но я вижу, что вам вше уже помогли разобраться с POST. Но на будущее будете знать, что делать в первую очередь, если письмо приходит с пустыми полями
- Ипатьев, Спасибо большое, что делитесь профессиональными знаниями) буду учиться)
Хорошего Вам дня!)
1) Проверить что приходит в $_POST
2) Не использовать стандартную функцию mail(), так как она слишком плохо дебажится, да и в целом не айс.
3) Поставить нормальный мэйлер, типа пхпмэйлер/свифтмэйлер.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос



Проблема с получением пустых писем из формы обратной связи на почту хостинга может иметь несколько причин. Вот несколько возможных решений:
1. Проверьте код обработки формы: убедитесь, что все поля формы правильно передаются в скрипт обработки и правильно обрабатываются. Может быть, некоторые поля не передаются или обрабатываются неправильно, из-за чего письмо приходит пустым.
if(isset($_POST['submit'])) { $name = $_POST['name']; $email = $_POST['email']; $message = $_POST['message']; // Отправка письма }
2. Проверьте настройки почтового сервера хостинга: иногда почтовые сервера могут блокировать отправку писем с пустым телом из соображений безопасности. Убедитесь, что ваш хостинг разрешает отправку писем с пустым телом.
3. Проверьте формат письма: убедитесь, что все переменные, передаваемые в письмо, правильно форматируются и подставляются в тело письма. Возможно, письмо приходит пустым из-за ошибок в форматировании.
4. Проверьте спам-фильтры: иногда письма могут попадать в спам из-за некорректной конфигурации почтового сервера. Убедитесь, что письма из формы обратной связи не блокируются спам-фильтрами.
5. Проверьте логи ошибок: если у вас есть доступ к логам ошибок на хостинге, посмотрите, нет ли там каких-либо ошибок, связанных с отправкой писем. Возможно, там есть подсказки о том, почему письма приходят пустыми.
Следуя этим рекомендациям, вы сможете выявить и исправить причину пустых писем из формы обратной связи на почту хостинга.