знаю, что тема избитая, но 3 дня на форумах не помогли справиться конкретно с этим случаем. В php новичок. Делаю форму для сайта, которая отправляет введённые данные на почту заказчика, валидатор js и phpmailer. Форма отправляется на почту, но нет сообщения для пользователя об успешной отправке и форма не очищается. Понимаю, что ошибка скорее всего из-за файла SMTP, но не знаю, можно ли его как-то грамотно изменить, либо перенести мой заголовок перед ним, чтобы не сломать и всё продолжало работать.
Warning: Cannot modify header information - headers already sent by (output started at C:\phpmailer\src\SMTP.php:306) in C:\sendmail.php on line #
Что уже было испробовано:
- Оба файла, которые вылетают в ошибке (SMTP и мой php) не имеют пробелов в начале
- Имеют кодировку UTF-8 без BOM
- В php.ini output_buffering = On
- Изменение в output_buffering = 4096 на 14096 тоже не помогло
- ob_start(); и ob_end_flush(); но возможно не туда вставляю
Файлы phpmailer на всякий случай: https://github.com/PHPMailer/PHPMailer/blob/master/src/SMTP.php
код script.js
"use strict"
document.addEventListener('DOMContentLoaded', function () {
const form = document.getElementById('form');
form.addEventListener('submit', formSend);
async function formSend(e) {
e.preventDefault();
let error = formValidate(form);
let formData = new FormData(form);
if (error === 0) {
let response = await fetch('sendmail.php', {
method: 'POST',
body: formData
});
if (response.ok){
let result = await response.json();
alert(result.message);
// alert("Данные отправлены! С Вами свяжутся в ближайшее время");
form.reset();
} else {
alert("Что-то пошло не так, попробуйте, пожалуйста, ещё раз");
}
} else {
alert('Пожалуйста, заполните обязательные поля');
}
}
function formValidate(form) {
let error = 0;
let formReq = document.querySelectorAll('._req');
for (let index = 0; index < formReq.length; index++) {
const input = formReq[index];
formRemoveError(input);
if (input.getAttribute("type") === "checkbox" && input.checked === false) {
formAddError(input);
error++;
} else {
if (input.value === '') {
formAddError(input);
error++;
}
}
}
return error;
}
function formAddError(input) {
input.parentElement.classList.add('_error');
input.classList.add('_error');
}
function formRemoveError(input) {
input.parentElement.classList.remove('_error');
input.classList.remove('_error');
}
});
код sendmail.php
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP;
require_once 'phpmailer/src/PHPMailer.php';
require_once 'phpmailer/src/Exception.php';
require_once 'phpmailer/src/SMTP.php';
$mail = new PHPMailer(true);
$mail->CharSet = 'UTF-8';
$mail->setLanguage('ru', 'phpmailer/language/');
$mail->isSMTP();
$mail->SMTPAuth = true;
$mail->SMTPDebug = 1;
$mail->Host = 'ssl://smtp.gmail.com';
$mail->Port = 465;
$mail->Username = 'example@gmail.com';
$mail->Password = 'secret';
//from
$mail->setFrom('example@gmail.com', 'Do You Speak?');
//to
$mail->addAddress('mymail@gmail.com');
$mail->IsHTML(true);
//theme
$mail->Subject = "[Заявка с формы]";
$body = '<h1>Привет! Это письмо пришло, потому что кто-то оставил заявку на сайте.</h1>';
if (trim(!empty($_POST['name']))){
$body.='<p><strong>Имя:</strong> '.$_POST['name'].'</p>';
}
if (trim(!empty($_POST['number']))){
$body.='<p><strong>Телефон:</strong> '.$_POST['number'].'</p>';
}
if (trim(!empty($_POST['email']))){
$body.='<p><strong>E-mail:</strong> '.$_POST['email'].'</p>';
}
$mail->Body = $body;
if(!$mail->send()) {
$message = 'Ошибка';
} else {
$message = 'Данные отправлены! С Вами свяжутся в ближайшее время :)';
}
$response = ['message'=> $message];
header('Content-type: application/json');
echo json_encode($response);
//ошибки
error_reporting(E_ALL);
ini_set('display_startup_errors', 1);
ini_set('display_errors', '1');
?>