iamlorddop
@iamlorddop

Почему при отправке данных на почте пустые сроки?

На сайте есть форма, когда сабмичу выходит алерт "Данные отправлены", на самой почте данные отсутствуют (в таком случае я прописала что "данные были утеряны" в коде). Почему так происходит? Использую PHPMailer для отправки на почту. В девтулсах смотрю в нетворк данные отправленные отображаются.

PHP

<?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();
?>

  • Вопрос задан
  • 60 просмотров
Решения вопроса 2
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Вариантов, собсно, 2:
1) Не туда
2) Не так

В первом случае убедитесь что вы отправляете данные на нужный роут. Вероятность не большая, но есть.

Во втором случае достаточно проверить в каком формате вы отправляете данные, и какие данные приходят. Формат отправки можно посмотреть в нетворке, а в коде первыми строками проверить что приходит в $_POST - var_dump($_POST);exit(); Возможно (и похоже на то) что вы отправляете форму аяксом, а данные передаете в теле как жсон например. Естественно, при этом ловить что либо в пост переменных бесполезно ), тут нужно будет щупать php://input
Ответ написан
iamlorddop
@iamlorddop Автор вопроса
Проблема решена. С фронта приходили данные в формате JSON, но в PHP-скрипте использовалась суперглобальная переменная $_POST, которая принимала данные в виде array, а надо было в string. $_POST была заменена на file_get_contents('php://input').

PHP

<?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();
?>

Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы