Проблема повторной отправки заголовков в PHP

Из-за повторной отправки письма по smtp выкидывает сообщение в браузер "headers already sent by..."
Однако все сообщения на почту приходят. Два письма нужно для отправки пользователю и админу.
Как можно увидеть в коде ниже, я просто "заткнул" php функциями ob_start и ob_end_clean. Также, в самом низу я уже заменил header('location') на то, что есть сейчас echo("<script>location.href = '/';</script>"); чтобы решить проблемы с отправкой заголовков.

Но вот что-то мне подсказывает, что это плохое решение - "затыкать" php считая, что все работает и так. В связи с этим возникает вопрос, а как сделать так, чтобы php не "ругался" и все при этом работало, как и предполагается? Придется как-то в разные файлы выносить отправки почты? Это было бы не очень удобно. При чем, когда я делал отправку только 1 раз, проблем с заголовками php не выкидывал, даже учитывая что в конце редирект через "header" стоял. После нескольких неудачных попыток гугления моего случая с phpMailer, решил попробовать написать сюда.

//mail.php
<?php
@session_start();
require_once "connection.php";

$user_name = $_POST['user_name'];
$email = $_POST['email'];
$company_name = $_POST['company_name'];
$phone = $_POST['phone'];
$message = $_POST['message'];

$errors = [];
if (strlen($user_name) === 0) {
    $errors[] = 'user_name';
}
if (strlen($company_name) === 0) {
    $errors[] = 'company_name';
}
if (strlen($phone) === 0) {
    $errors[] = 'phone';
}
if (strlen($message) === 0) {
    $errors[] = 'message';
}

if (count($errors)) {
    foreach ($errors as $error => $val) {
        echo "$val is required!<br/>\n";
    }
    die();
}

include "send-mail.php";
sendMail($user_name, $email, $company_name, $phone, $message);

try {
    $stmt = $pdo->prepare("INSERT INTO users (`user_name`, `email`, `company_name`, `phone`, `message`) VALUES (?, ?, ?, ?, ?)");
    $stmt->execute([$user_name, $email, $company_name, $phone, $message]);
    $_SESSION['SentEmail'] = "A letter sent successfully!";
} catch (PDOException $e) {
    die($e->getMessage());
}

echo("<script>location.href = '/#contact';</script>");


//send-mail.php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

//Load Composer's autoloader
require '../vendor/autoload.php';

function sendMail($user_name, $email, $company_name, $phone, $message) {
    $mail = new PHPMailer(true);
    ob_start();
    try {
        //Server settings
        $mail->SMTPDebug = SMTP::DEBUG_SERVER;
        $mail->isSMTP();
        $mail->Host       = 'smtp.gmail.com';
        $mail->SMTPAuth   = true;
        $mail->Username   = '[email protected]';       //SMTP username
        $mail->Password   = 'mypass';                 //SMTP password
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
        $mail->Port       = 587;
    
        $mail->setFrom('[email protected]', 'Mailer');
        $mail->addAddress('[email protected]');
        $mail->isHTML(true);  

        $mail->Subject = "subject";
        $mail->Body = "body";

        $mail->send();

        if ($email) {
            $mail->ClearAllRecipients();
            $mail->ClearAddresses();
            $mail->addAddress($email);
            $mail->isHTML(true);

            $mail->Subject = "subject2";
            $mail->Body = "body2";
    
            $mail->send();
        }
    } catch (Exception $e) {
        echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
        exit();
    } finally {
        ob_end_clean();
    }
}


Ответы (0 шт):