Всем привет. Имеется форма для отправки писем. Также имеются два файла: index.php и ajax.php. В index.php написан html код и JS. В ajax.php собственно сам код php. В input есть name=applicant, я его пытаюсь передать в $mail->Body = $_POST['applicant'], но мне выдаёт ошибку - Message could not be sent.Mailer Error: Message body empty. Хотя при отправке формы, указанный input имеет данные (заполняются мною). При этом если написать просто текст в $mail->Body, форма отправляется без проблем. Что я делаю не так, может кто подсказать? И как правильно написать код и где его правильно написать? Перечитал десяток сайтов с похожей проблемой, но решения я там себе не нашёл. Нашёл только головную боль... index.php -> form Код (Text): <form action="ajax.php" method="POST" name="request" id="request"> <h1>{{ title }}</h1> <div class="form-group"> <label>Номер магазина: </label> <select v-model="selectedUser" class="form-control"> <option name="number" v-for="site in sites" v-bind:value="site">{{site.name}}</option> </select> </div> <div class="form-group"> <label for="exampleInputPassword1">Адрес магазина: </label> <span v-if="selectedUser!==null" class="address form-control">{{selectedUser.address}}</span> </div> <div class="form-group"> <label for="">Заявитель (инициатор заявки)</label> <input name="applicant" type="text" class="form-control"><span></span> </div> <div class="form-group"> <label for="">Телефон заявителя</label> <input name="applicant_tel" type="text" class="form-control"><span></span> </div> <button type="submit" id="submit" name="submit" class="btn btn-primary">Submit</button><span></span> </form> ajax.php Код (Text): <?php require 'phpmailer/class.phpmailer.php'; require 'phpmailer/class.smtp.php'; ini_set('post_max_size', '20M'); $mail = new PHPMailer; $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->SMTPAuth = true; $mail->Username = '<username>@gmail.com'; // логин от вашей почты $mail->Password = '<password>'; // пароль от почтового ящика $mail->SMTPSecure = 'ssl'; $mail->Port = '465'; $mail->CharSet = 'UTF-8'; $mail->setFrom = '<username>@gmail.com'; // адрес почты, с которой идет отправка $mail->FromName = 'Александр'; // имя отправителя $mail->addAddress('<username>@gmail.com', 'Александр'); // $mail->SMTPDebug = 1; $mail->isHTML(true); $mail->Subject = 'Тема письма'; $mail->Body = $_POST['applicant']; if(!$mail->send()) { echo 'Message could not be sent.'; echo 'Mailer Error: ' . $mail->ErrorInfo; } else { echo 'ok'; } print_r($_POST); ?> Прошу тапками и прочими вещами меня не закидывать
По опыту пустой пост говорит о том, что где-то происходит ненужный редирект. Т.е. косяк с htaccess, перенаправлениями с www на без www, c http на https и прочее. Т.е. открываешь инструменты разработчика в браузере, и смотришь, нету ли редиректов при твоём post-запросе
вся эта муть пока открывается с помощью OpenServer. Здесь нет ещё никаких .htaccess файлов и перенаправлений...
судя по index.php вся та муть у вас с использование vue и код index.php неполный чего там нагорожено - хз
Да я уже тыкал вчера, куда только можно. Подскажите направления куда потыкать, я потыкаю. А Тим Виер, найдём если понадобиться, но не сегодня. --- Добавлено --- Vue действительно использую, полный код index.php могу только после 21 часов по МСК кинуть. Только в input с name=applicant нет кода vue. Туда пишу ручками буквы и цифры.
В ответе пустой массив... Полный index.php: Код (Text): <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <title>requestkraftway</title> <link rel="stylesheet" href="css/style.css"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> </head> <body> <div class="container"> <div class="row"> <div class="col-6 offset-3"> <div id="app"> <form action="ajax.php" method="POST" name="request" id="request"> <h1>{{ title }}</h1> <div class="form-group"> <label>Номер магазина: </label> <select v-model="selectedUser" class="form-control"> <option name="number" v-for="site in sites" v-bind:value="site">{{site.name}}</option> </select> </div> <div class="form-group"> <label for="exampleInputPassword1">Адрес магазина: </label> <span v-if="selectedUser!==null" class="address form-control">{{selectedUser.address}}</span> </div> <div class="form-group"> <label for="">Заявитель (инициатор заявки)</label> <input name="applicant" type="text" class="form-control"><span></span> </div> <div class="form-group"> <label for="">Телефон заявителя</label> <input name="applicant_tel" type="text" class="form-control"><span></span> </div> <button type="submit" id="submit" name="submit" class="btn btn-primary">Submit</button><span></span> </form> </div> </div> </div> </div> <script src="http://code.jquery.com/jquery-latest.js"></script> <script src="vue.js"></script> <script> var app = new Vue({ el: '#app', data: { sites:[ {name:'203', address:'!'}, {name:'452', address:'!'}, ], selectedUser: 'Выбери номер магазина', title: '!' }, }); $(function(){ 'use strict'; $('#request').on('submit', function(e){ e.preventDefault(); var errors = false; $(this).find('input, textarea').each(function(){ if( $.trim( $(this).val() ) == '' ) { errors = true; $(this).next().text( 'Не заполнено поле ' + $(this).prev().text() ); } }); if( !errors ) { var data = $('#request').serialize(); $.ajax({ url:'ajax.php', type: 'POST', data: data, contentType: false, processData:false, success: function(msg){ if(msg == 'ok'){ $('#request').find('input,textarea').val(''); $('#sumbit').next().text('Отправлено!'); }else{ $('#submit').next().text('Ошибка!'); } } }) } }) }) </script> </body> </html> По поводу vue. Убрал (см. закомментировал) код, который относится к vue, всё равно возвращает пустой массив. Но если код оставить, а закомментировать только ссылку на библиотеку vue, отправляет без проблем. Только сейчас это проделал и нифига не понял как так...
Ну и жуть ты пишешь... Нахрена там Vue? Хотя vue действительно не должна была повлиять, наживую надо в отладчике смотреть, что происходит, так не сказать
Изначально предполагалась форма на vue, можно сказать, в рамках самообучения, понимания работы. Но потом пришла идея, отправлять эту форму на почту через smtp и вот я оказался на форуме по php... Главное, если убрать полностью код vue, php код всё равно не работает. Выдаёт пустой массив. @mkramer, в какой части отладчика смотреть, что происходит? Я попробую сам покопаться. Что-то у меня ситуация возникает: Смотрю в книгу - вижу фигу.
Кстати, сегодня на досуге узнал, что Vue и Laravel неплохо дружат между собой, кто что сможет сказать. Если здесь получаются костыли, может рассмотреть связку Vue + Laravel (Laravel касаемо только отправки письма) или этот php фреймворк сложноват для большого новичка в php?
Всё смешалось, и люди, и кони PHP на сервере, Vue - на клиенте (может на сервере, но пока туда не лезем). Так что Vue наплевать, на чём серверная часть, чистый там PHP, Laravel или Slim или вообще Java В твоём случае я бы начал с отладки клиентской части, а вообще, отправляется ли это поле. Серилизуется ли оно верно. Вот покажи что внизу в вкладке headers у тебя? Если на клиенте всё работает, то уже смотреть, что не так на сервере. Ну с клиента ты по smtp в любом случае ничего не отправишь, значит надо как-то передать инфу на сервер
Повторюсь, Vue всё равно на чём Backend. Просто Laravel некоторые свои инструменты заточил в рассчёте на использование Vue. Но не надо лезть тебе в любой фреймворк пока.
Пост уходит в заголовке. --- Добавлено --- При всем моем уважении к людям на этом форуме, оставьте, пожалуйста, свои домыслы при себе.
имхо все-же че-то на стороне фронта попробуй после строчки Код (Javascript): var data = $('#request').serialize(); добавить вывод в консоль Код (Javascript): console.log(data); и посмотри в консоле .. что там (предугадывая немой вопрос - f12 - консоль)
form action="mailto:..." ) Правда я хз, работает ли оно в современных браузерах, но раньше таки отсылалось.
Смешной такой Ты пишешь это после того, как я скидывал скрины с консоли) (без обид) Там вот что: То есть данные передаются. Получается где-то на стороне сервера данные теряются...
Проблема решилась на 90%. Я подключил другой файл jq, а именно с последней версией. и с запроса ajax убрал contentType В 10% вошла ошибка, а точнее появление текста "Ошибка!" рядом с кнопкой, но это мелочи. Всем спасибо, кто пытался мне помочь!
@Turte_post, блин, а зачем ты contentType передавал false? Реально даже не заметил эту строчку, поскольку не ожидал, что до этого можно додуматься. Чтобы php сам обработал параметры, content type должен быть или application/x-www-form-urlencoded, или, если приложены файлы, multipart/form-data