Почему при отправке данных на почте пустые сроки?
На сайте есть форма, когда сабмичу выходит алерт "Данные отправлены", на самой почте данные отсутствуют (в таком случае я прописала что "данные были утеряны" в коде).
Почему так происходит?
Использую PHPMailer для отправки на почту. В девтулсах смотрю в нетворк данные отправленные отображаются.
<?php
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
//Load Composer's autoloader
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
$mail->isSMTP(); //Send using SMTP
$mail->Host = 'ssl://smtp.yandex.ru'; //Set the SMTP server to send through
$mail->SMTPAuth = true; //Enable SMTP authentication
$mail->Username = 'username'; //SMTP username
$mail->Password = 'password'; //SMTP password
$mail->SMTPSecure = "ssl"; //Enable implicit TLS encryption
$mail->Port = 465;
$mail->CharSet = "UTF-8";
$mail->IsHTML(true);
$mail->setFrom("username", "Линия доставки");
// send to
$mail->addAddress("username", "Линия доставки");
$theme = '[ДАННЫЕ ИЗ ФОРМЫ ЛИНИЯ ДОСТАВКИ]';
$mail->Subject = $theme;
// letter's body
$body = '<h1>Данные формы:</h1>';
if(isset($_POST["tel"])){
$tel = $_POST["tel"];
}else{
$tel = "Данные телефона были утерены";
}
if (trim(!empty($tel))) {
$body .= '<p><strong>Телефон:</strong> ' . $tel . '</p>';
}
$mail->Body = $body;
// send
if (!$mail->send()) {
$message = 'Ошибка';
} else {
$message = 'Данные отправлены!';
}
$response = ['message' => $message];
header('Content-type: application/json');
echo json_encode($response);
$mail->smtpClose();
?>
Ответы (2 шт):
Автор решения: user334685
→ Ссылка
- возьмите в try\catch весь код отправки $mail.
- вы папку спам проверяли у получателя письма?
- $mail->smtpClose(); лучше разместить перед $response
- после $mail->send(), выведите var_dump($mail->ErrorInfo), может все-таки есть ошибки.
Автор решения: Yulia Khavaeva
→ Ссылка
Проблема решена. С фронта приходили данные в формате JSON, но в PHP-скрипте использовалась суперглобальная переменная $_POST, которая принимала данные в виде array, а надо было в string. $_POST была заменена на file_get_contents('php://input').
<?php
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
//Load Composer's autoloader
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
$mail->isSMTP(); //Send using SMTP
$mail->Host = 'ssl://smtp.yandex.ru'; //Set the SMTP server to send through
$mail->SMTPAuth = true; //Enable SMTP authentication
$mail->Username = '****@yandex.ru'; //SMTP username
$mail->Password = '****'; //SMTP password
$mail->SMTPSecure = "ssl"; //Enable implicit TLS encryption
$mail->Port = 465;
$mail->CharSet = "UTF-8";
$mail->IsHTML(true);
$mail->setFrom("****@yandex.ru", "Линия доставки");
// send to
$mail->addAddress("****@yandex.ru", "Линия доставки");
$theme = '[ДАННЫЕ ИЗ ФОРМЫ ЛИНИЯ ДОСТАВКИ]';
$mail->Subject = $theme;
// letter's body
$body = '<h1>Данные формы:</h1>';
$json = file_get_contents('php://input');
$data = json_decode($json, true);
if (trim(!empty($data['tel']))) {
$tel = $data['tel'];
$body .= '<p><strong>Телефон:</strong> ' . $tel . '</p>';
}else{
$body .= '<p><strong>Телефон:</strong> ' . 'Данные телефона были утеряны' . '</p>';
}
$mail->Body = $body;
// send
if (!$mail->send()) {
$message = 'Ошибка';
} else {
$message = 'Данные отправлены!';
}
$response = ['message' => $message];
header('Content-type: application/json');
echo json_encode($response);
$mail->smtpClose();
?>