Почему не отправляется форма через phpMailer?
*разобрался, не тратьте время
Использовал fetch-запрос + phpMailer. Сам запрос уходит хорошо, статус 200, приходит тоже на мою почту. Но почему то саму инфу с полей формы не присылает(48стр в js), только то, что я записал непосредственно через formData.set(). Знаю только JS, с PHP вообще не знаком. Мне кажется что-то поменять надо в php-файле, но я опять же, не могу знать что. Буду благодарен, если подскажете, в чём дело
document.addEventListener('DOMContentLoaded', function () { function validation() {}// возвращает true/false, делает валидацию полей async function postSend(e) { e.preventDefault() let formData = new FormData(this) formData.set('Имя разработчика:', 'Данила') if (validation()) { let response = await fetch('mailer.php', { method: 'POST', body: formData }) if (response.ok) { formOverlay.classList.add('active-form') return await response.json() } else { alert('Ошибка на сервере!') this.reset() } } } let formOverlay = document.querySelector('.form-done') let allForms = document.querySelectorAll('form') allForms.forEach((form) => { form.addEventListener('submit', postSend) }) }) |
document.addEventListener('DOMContentLoaded', function () { function validation() {}// возвращает true/false, делает валидацию полей async function postSend(e) { e.preventDefault() let formData = new FormData(this) formData.set('Имя разработчика:', 'Данила') if (validation()) { let response = await fetch('mailer.php', { method: 'POST', body: formData }) if (response.ok) { formOverlay.classList.add('active-form') return await response.json() } else { alert('Ошибка на сервере!') this.reset() } } } let formOverlay = document.querySelector('.form-done') let allForms = document.querySelectorAll('form') allForms.forEach((form) => { form.addEventListener('submit', postSend) }) })
<?php // Файлы phpmailer require 'phpMailer/PHPMailer.php'; require 'phpMailer/SMTP.php'; require 'phpMailer/Exception.php'; $title = "Тема письма"; $file = $_FILES['file']; $c = true; // Формирование самого письма $title = "Заголовок письма"; foreach ( $_POST as $key => $value ) { if ( $value != "" && $key != "project_name" && $key != "admin_email" && $key != "form_subject" ) { $body .= " " . ( ($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> "; } } $body = "<table style='width: 100%;'>$body</table>"; // Настройки PHPMailer $mail = new PHPMailerPHPMailerPHPMailer(); try { $mail->isSMTP(); $mail->CharSet = "UTF-8"; $mail->SMTPAuth = true; // Настройки вашей почты $mail->Host = 'smtp.gmail.com'; // SMTP сервера вашей почты $mail->Username = 'idemvpered76@gmail.com'; // Логин на почте $mail->Password = 'работающийпароль(скрыл)'; // Пароль на почте $mail->SMTPSecure = 'ssl'; $mail->Port = 465; $mail->setFrom('Заявка с вашего сайта'); // Адрес самой почты и имя отправителя // Получатель письма $mail->addAddress('idemvpered76@gmail.com'); // Отправка сообщения $mail->isHTML(true); $mail->Subject = $title; $mail->Body = $body; $mail->send(); } catch (Exception $e) { $status = "Сообщение не было отправлено. Причина ошибки: {$mail->ErrorInfo}"; } |
<?php // Файлы phpmailer require 'phpMailer/PHPMailer.php'; require 'phpMailer/SMTP.php'; require 'phpMailer/Exception.php'; $title = "Тема письма"; $file = $_FILES['file']; $c = true; // Формирование самого письма $title = "Заголовок письма"; foreach ( $_POST as $key => $value ) { if ( $value != "" && $key != "project_name" && $key != "admin_email" && $key != "form_subject" ) { $body .= " " . ( ($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> "; } } $body = "<table style='width: 100%;'>$body</table>"; // Настройки PHPMailer $mail = new PHPMailerPHPMailerPHPMailer(); try { $mail->isSMTP(); $mail->CharSet = "UTF-8"; $mail->SMTPAuth = true; // Настройки вашей почты $mail->Host = 'smtp.gmail.com'; // SMTP сервера вашей почты $mail->Username = 'idemvpered76@gmail.com'; // Логин на почте $mail->Password = 'работающийпароль(скрыл)'; // Пароль на почте $mail->SMTPSecure = 'ssl'; $mail->Port = 465; $mail->setFrom('Заявка с вашего сайта'); // Адрес самой почты и имя отправителя // Получатель письма $mail->addAddress('idemvpered76@gmail.com'); // Отправка сообщения $mail->isHTML(true); $mail->Subject = $title; $mail->Body = $body; $mail->send(); } catch (Exception $e) { $status = "Сообщение не было отправлено. Причина ошибки: {$mail->ErrorInfo}"; }
Дополнительно:
По умолчанию PHPMail не выбрасывает исключение. Он просто возвращает статус true/false.
Для работы с исключениями необходимо явно указать режим при создании экземпляра.
- $mail = new PHPMailerPHPMailerPHPMailer(); + $mail = new PHPMailerPHPMailerPHPMailer(true); |
- $mail = new PHPMailerPHPMailerPHPMailer(); + $mail = new PHPMailerPHPMailerPHPMailer(true);
запрос уходит за 0.022с, хотя раньше уходил за >1.5с
Вы смотрели какой запрос уходит из браузера? DevTools - Сеть - Нужный запрос - Полезная нагрузка. Там должны быть все передаваемые данные.
Ответы:
Вы уверены, что в let formData = new FormData(this) this указывает именно на форму? Я бы заменил на e.target.
- Да по идее this на форму указывает. This в функции, которая вызвана в слушателе событий относится к элементу, на который повесили слушатель
То есть там перебор всех форм через forEach, и на каждую форму при submit
- вызываем функцию postSend. Так что this в этой функции = formВроде так?
- Да и this.reset() работает
Так что да, this в данном случае = form
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос




Прежде всего, если у вас возникают проблемы с отправкой формы через PHPMailer, важно проверить несколько ключевых моментов:
1. Проверьте настройки SMTP: убедитесь, что вы правильно сконфигурировали свой SMTP сервер, включая адрес сервера, порт, учетные данные (логин и пароль) и тип шифрования (например, SSL или TLS).
2. Проверьте, не блокирует ли ваш хостинг провайдер исходящий SMTP трафик: некоторые хостинг провайдеры могут блокировать исходящий SMTP трафик для предотвращения спама. Убедитесь, что ваш хостинг провайдер разрешает исходящий SMTP трафик.
3. Убедитесь, что вы правильно настроили ваш PHPMailer объект: убедитесь, что вы правильно указали адрес отправителя, адрес получателя, тему письма и тело письма. Также убедитесь, что вы вызвали метод `send()` для отправки письма.
4. Проверьте логи ошибок: PHPMailer может записывать ошибки в лог, который поможет вам понять, почему письмо не отправляется. Убедитесь, что вы включили логирование ошибок и проверьте логи для нахождения причины проблемы.
Вот пример кода на PHP, который использует PHPMailer для отправки письма:
isSMTP(); $mail->Host = 'smtp.example.com'; $mail->SMTPAuth = true; $mail->Username = 'your@example.com'; $mail->Password = 'your_password'; $mail->SMTPSecure = 'tls'; $mail->Port = 587; $mail->setFrom('from@example.com', 'Your Name'); $mail->addAddress('recipient@example.com', 'Recipient Name'); $mail->isHTML(true); $mail->Subject = 'Subject'; $mail->Body = 'This is the HTML message body'; $mail->send(); echo 'Message has been sent'; } catch (Exception $e) { echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo; } ?>
Если после проверки всех вышеперечисленных пунктов проблема с отправкой писем по-прежнему остается, рекомендуется обратиться к документации PHPMailer или обратиться за помощью к сообществу разработчиков для получения дополнительной поддержки.