Проблема повторной отправки заголовков в 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();
}
}