Как подключить (на сайт) отправку письма с формы обратной связи в phpmailer (+ yandex почта)

!!! Если не хотите знать подробностей, то в конце статьи есть весь код

1. В данной статье будет рассмотрено:

Итак по порядку:

2. Как скачать PHPMailer с официального репозитория GitHub

Скриншот как скачать PHPMailer Скачиваем PHPMailer с официального репозитория GitHub

3. Как разместить PHPMailer на веб-сайте

4. Как подключить и вызвать PHPMailer чтобы работать с ним

<?
//Import PHPMailer classes into the global namespace
//These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

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

//Create an instance; passing `true` enables exceptions
$mail = new PHPMailer(true);

try {
  //Server settings
  $mail->SMTPDebug = SMTP::DEBUG_SERVER;           //Enable verbose debug output
  $mail->isSMTP();                                 //Send using SMTP
  $mail->Host       = 'smtp.example.com';          //Set the SMTP server to send through
  $mail->SMTPAuth   = true;                        //Enable SMTP authentication
  $mail->Username   = 'user@example.com';          //SMTP username
  $mail->Password   = 'secret';                    //SMTP password
  $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; //Enable implicit TLS encryption
  $mail->Port       = 465;                         //TCP port to connect to; use 587 if you have set 
                                                   //`SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`

  //Recipients
  $mail->setFrom('from@example.com', 'Mailer');
  $mail->addAddress('joe@example.net', 'Joe User'); //Add a recipient
  $mail->addAddress('ellen@example.com');                 //Name is optional
  $mail->addReplyTo('info@example.com', 'Information');
  $mail->addCC('cc@example.com');
  $mail->addBCC('bcc@example.com');

  //Attachments
  $mail->addAttachment('/var/tmp/file.tar.gz');              //Add attachments
  $mail->addAttachment('/tmp/image.jpg', 'new.jpg');   //Optional name

  //Content
  $mail->isHTML(true);                                      //Set email format to HTML
  $mail->Subject = 'Here is the subject';
  $mail->Body    = 'This is the HTML message body <b>in bold!</b>';
  $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

  $mail->send();
  echo 'Message has been sent';
} catch (Exception $e) {
  echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}

require 'vendor/autoload.php'; на

require './PHPMailer/src/PHPMailer.php'; 
require './PHPMailer/src/SMTP.php'; 
require './PHPMailer/src/Exception.php'; 

Потому что мы скачали библиотеку из репозитория и у нас нет файла "vendor/autoload.php" который создаётся при установки PHPMailer через менеджер пакетов "Composer"

// Это моя почта куда я буду принимать письма с сайта   
$toMail = 'testphpmailer@artemsites.ru';  
$toName = 'Мне';  
// Это почта аккаунта яндекс через который будут слаться письма с сайта      
$fromEmail = 'testphpmailer@yandex.ru';  
$fromName = 'Письмо от ВАШЕ НАЗВАНИЕ'; 
$smtpHost = 'ssl://smtp.yandex.ru'; 
// Это почта аккаунта яндекс через который будут слаться письма с сайта     
$smtpMail = 'testphpmailer@yandex.ru'; 
// Это пароль который выдал яндекс 
$smtpPass = 'SDLFgliSDfgb'; 

! В переменную $smtpPass необходимо положить пароль который выдаст яндекс

5. Как получить специальный пароль к нашему почтовому ящику яндекс, чтобы использовать его в SMTP классе PHPMailer

6. Продолжаем настройку mail.php

$smtpPass = 'f&#%C^BG#&*(QGh';
$subject = isset($_POST['subject']) ? $_POST['subject'] : 'Нет темы письма'; // обязательный параметр в $_POST
// Далее формируем тело письма:
$message = '';
$messageWithoutHTML = '';

! Это универсальное формирование тела письма, для этого необходимо отправить данные определённым образом из HTML и JavaScript - об этом будет расказано ниже

// ! Это универсальное формирование тела письма, для этого необходимо отправить данные определённым образом из JavaScript - об этом будет расказано ниже
foreach($_POST as $key => $value) {
  if ($key!=='subject') {
    $message .= '<b>' . $key . '</b>: ' . $value;
    $message .= '<br>';
    $messageWithoutHTML .= $key . ': ' . $value;
  }
}

! Это выключаем (комментируем) чтобы небыло лишних сообщений об ошибках

// ! Это выключаем чтобы небыло лишних сообщений об ошибках
// $mail->SMTPDebug  = SMTP::DEBUG_SERVER;//Enable verbose debug output

Продолжаем подстановку переменных:

$mail->isSMTP();//Send using SMTP
// ! Тут наша переменная $smtpHost
$mail->Host       = $smtpHost;//Set the SMTP server to send through
$mail->SMTPAuth   = true;//Enable SMTP authentication
// ! Тут наша переменная $smtpMail
$mail->Username   = $smtpMail;//SMTP username
// ! Тут наша переменная $smtpPass
$mail->Password   = $smtpPass;//SMTP password
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;//Enable implicit TLS encryption
$mail->Port       = 465;//TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`

//Recipients
// ! Тут наша переменная $fromEmail и $fromName
$mail->setFrom($fromEmail, $fromName);
// ! Тут наша переменная $toMail и $toName
$mail->addAddress($toMail, $toName);//Add a recipient
// $mail->addAddress('ellen@example.com');//Name is optional
// $mail->addReplyTo('info@example.com', 'Information');
// $mail->addCC('cc@example.com');
// $mail->addBCC('bcc@example.com');

//Attachments
// $mail->addAttachment('/var/tmp/file.tar.gz');//Add attachments
// $mail->addAttachment('/tmp/image.jpg', 'new.jpg');//Optional name

Установка кодировки в PHPMailer чтобы письмо на русском приходило вместо каракуль!

// ! Установка кодировки в PHPMailer чтобы письмо на русском приходило вместо каракуль!
$mail->CharSet = "UTF-8";
$mail->isHTML(true);//Set email format to HTML
// ! Тут наша переменная $subject
$mail->Subject = $subject;
// ! Тут наша переменная $message
$mail->Body    = $message;
// ! Тут наша переменная $messageWithoutHTML
$mail->AltBody = $messageWithoutHTML;
// $mail->send();
// echo 'Message has been sent';
if ($mail->send()) { 
  echo json_encode(array('success' => 1));
} else {
  echo json_encode(array('success' => 0));
}
} catch (Exception $e) {
  echo json_encode(array('success' => 0));
  // Код примера комментируем пока что:
  // echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}

7. Весь код взаимодействия с PHPMailer выглядит так

<?
//Import PHPMailer classes into the global namespace
//These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require './PHPMailer/src/PHPMailer.php';
require './PHPMailer/src/SMTP.php';
require './PHPMailer/src/Exception.php';



// Это моя почта куда я буду принимать письма с сайта
$toMail = 'testphpmailer@artemsites.ru';
$toName = 'Мне';
// Это моя почта яндекс с которой будут слаться письма с сайта
$fromEmail = 'testphpmailer@yandex.ru';
$fromName = 'Письмо от ВАШЕ НАЗВАНИЕ';
$smtpHost = 'ssl://smtp.yandex.ru';
// Это моя почта яндекс с которой будут слаться письма с сайта
$smtpMail = 'testphpmailer@yandex.ru';
// Это пароль который выдал яндекс
$smtpPass = 'SDLFgliSDfgb';



$subject = isset($_POST['subject']) ? $_POST['subject'] : 'Нет темы письма'; // обязательный параметр в $_POST
// Далее формируем тело письма:
$message = '';
$messageWithoutHTML = '';

// ! Это универсальное формирование тела письма, для этого необходимо отправить данные определённым образом из JavaScript - об этом будет расказано ниже
foreach($_POST as $key => $value) {
  if ($key!=='subject') {
    $message .= '<b>' . $key . '</b>: ' . $value;
    $message .= '<br>';
    $messageWithoutHTML .= $key . ': ' . $value;
  }
}



//Create an instance; passing `true` enables exceptions
$mail = new PHPMailer(true);

try {
  //Server settings
  // ! Это выключаем чтобы небыло лишних сообщений об ошибках
  // $mail->SMTPDebug  = SMTP::DEBUG_SERVER;//Enable verbose debug output
  $mail->isSMTP();//Send using SMTP
  // ! Тут наша переменная $smtpHost
  $mail->Host       = $smtpHost;//Set the SMTP server to send through
  $mail->SMTPAuth   = true;//Enable SMTP authentication
  // ! Тут наша переменная $smtpMail
  $mail->Username   = $smtpMail;//SMTP username
  // ! Тут наша переменная $smtpPass
  $mail->Password   = $smtpPass;//SMTP password
  $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;//Enable implicit TLS encryption
  $mail->Port       = 465;//TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`

  //Recipients
  // ! Тут наша переменная $fromEmail и $fromName
  $mail->setFrom($fromEmail, $fromName);
  // ! Тут наша переменная $toMail и $toName
  $mail->addAddress($toMail, $toName);//Add a recipient
  // $mail->addAddress('ellen@example.com');//Name is optional
  // $mail->addReplyTo('info@example.com', 'Information');
  // $mail->addCC('cc@example.com');
  // $mail->addBCC('bcc@example.com');

  //Attachments
  // $mail->addAttachment('/var/tmp/file.tar.gz');//Add attachments
  // $mail->addAttachment('/tmp/image.jpg', 'new.jpg');//Optional name

  //Content
  // ! Установка кодировки в PHPMailer чтобы письмо на русском приходило вместо каракуль!
  $mail->CharSet = "UTF-8";
  $mail->isHTML(true);//Set email format to HTML
  // ! Тут наша переменная $subject
  $mail->Subject = $subject;
  // ! Тут наша переменная $message
  $mail->Body    = $message;
  // ! Тут наша переменная $messageWithoutHTML
  $mail->AltBody = $messageWithoutHTML;



  if ($mail->send()) {
    echo json_encode(array('success' => 1));
  } else {
    echo json_encode(array('success' => 0));
  }



} catch (Exception $e) {
  echo json_encode(array('success' => 0));
  // echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}

8. Как отправить данные из формы веб-сайта в скрипт PHPMailer

Для этого есть статья

Как отправить данные с веб-формы html на сервер - универсальный скрипт

https://gist.github.com/artemsites/ed3b0aba228e2cf43d13fda7de410c04

После этого будет слаться форма на ваш почтовый ящик
Если что-то не понятно, пишите, попробуем разрешить