Как подключить (на сайт) отправку письма с формы обратной связи в phpmailer (+ yandex почта)
!!! Если не хотите знать подробностей, то в конце статьи есть весь код
1. В данной статье будет рассмотрено:
- Как скачать PHPMailer
- Как установить на сайт PHPMailer
- Какой скрипт написать для взаимодействия с PHPMailer, чтобы отправлять письма через него
- Как получить пароль SMTP почты яндекс для отправки писем через эту почту
Итак по порядку:
2. Как скачать PHPMailer с официального репозитория GitHub
- Переходим на GitHub официальный репозиторий https://github.com/PHPMailer/PHPMailer
- И нажимаем зелёную кнопку "Code"
- Затем нажимаем "Download ZIP"
Скриншот как скачать PHPMailer
3. Как разместить PHPMailer на веб-сайте
- Распаковываем скаченный архив PHPMailer
- Полученную папку переименовавыаем удалив окончание "-master" - оно нам не нужно
- И кладём папку PHPMailer в корень нашего веб-сайта
- Всё её больше не трогаем это библиотека отправки писем, её мы будем просто подключать
4. Как подключить и вызвать PHPMailer чтобы работать с ним
- В корне сайта создаём наш PHP файл "mail.php" при обращении к которому будет осуществляться отправка письма на почту через PHPMailer
- В этом файле прописываем код с базового примера библиотеки 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
- Заходим по ссылке
!!! Внимание: необходимо чтобы вы были авторизованы в яндексе именно под своей почтой, в нашем примере это:
test@yandex.ru
- Проставляем галки для разрешения авторизации - это надо чтобы авторизовать доступ к почтовому ящику для отправки с него писем
- Заходим в пароли приложений яндекс пароли приложений яндекс
- И создаём новый почтовый пароль
- Копируем его и закрываем окно
! Более детально здесь
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;
}
}
- Далее по коду проставляем наши переменные в переменные PHPMailer и комментируем (отключаем) не нужный сейчас код:
! Это выключаем (комментируем) чтобы небыло лишних сообщений об ошибках
// ! Это выключаем чтобы небыло лишних сообщений об ошибках
// $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));
}
- И заменяем вывод информации об ошибке пока что просто ответом
'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
После этого будет слаться форма на ваш почтовый ящик
Если что-то не понятно, пишите, попробуем разрешить