0

знаю, что тема избитая, но 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 #

Что уже было испробовано:

  1. Оба файла, которые вылетают в ошибке (SMTP и мой php) не имеют пробелов в начале
  2. Имеют кодировку UTF-8 без BOM
  3. В php.ini output_buffering = On
  4. Изменение в output_buffering = 4096 на 14096 тоже не помогло
  5. 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'); ?>

  • 1
    Если вы сами включили отладочный вывод в phpmailer, то почему удивляетесь, что он что-то выводит? – Ипатьев Sep 29 '23 at 09:33
  • 1
    А в чем фишка писать ini_set('display_errors', '1'); в самом низу кода? Типа чтобы сообщения об ошибках не мешали программисту? :) – Ипатьев Sep 29 '23 at 09:45

0 Answers0