База знаний Диагностика проблем Как отправлять почту при помощи PHPMailer?

Как отправлять почту при помощи PHPMailer?

Отправка почты с сайта - незаменимый инструмент для большей части сайтов. Корректная отправка почты даёт возможность пользователям сайта получать информационные письма, рассылки, информацию об акциях. Если отправка почты работает неправильно, пользователи Вашего сайта не смогут получить письма от Вас, что, в свою очередь, влечет за собой целый ряд проблем - снижение конверсий, поведенческих факторов, а также нередки и претензии в адрес хостинга. 

Классическая отправка почты в PHP чаще всего реализована при помощи функции mail() c определенным набором заголовков, которые делают письмо корректным и понимаемым большинством почтовых серверов. На нашем хостинге для работы mail() используется sendmail. Чаще всего, многие пользователи не устанавливают набор заголовков письма, отправляя его как есть, что в 99% случаев приведет к тому, что письмо не будет доставлено. Более того, на нашем бесплатном хостинге, функция mail() отключена и отправка почты должна осуществляться только при помощи SMTP-авторизации.

Нашим клиентам мы советуем использовать в таких случаях популярную библиотеку PHPMailer

Для того, чтобы начать использовать отправку почты с библиотеками PHP Mailer, рекомендуем ознакомиться с примером кода в файле examples/smtp.phps

Но, прежде всего, не забудьте поместить на ваш сервер три файла, они находятся в папке src оригинального репозитория PHPMailer:

  • PHPMailer.php
  • SMTP.php
  • Exception.php
Как настроить PHPMailer на работу с SMTP?

Подключите к Вашему сайту или скрипту отправки почты библиотеку PHPMailer, указав в первых строках путь до необходимых файлов:

<?php

require_once('PHPMailer.php');
require_once('SMTP.php');
require_once('Exception.php');

$mail = new PHPMailer\PHPMailer\PHPMailer();

$mail->isSMTP();
// IP или хостнейм сервера, на котором находится Ваш почтовый аккаунт. Этот адрес Вы можете найти в письме с данными от хостинг-аккаунта.

// так как мы используем 465 порт, то перед SERVER_ADDRESS надо указать ssl://
// если будем использовать 587 порт, то перед SERVER_ADDRESS надо указать tls://
// если используется 25 порт, то указывается только SERVER_ADDRESS

$mail->Host = 'ssl://SERVER_ADDRESS'; 

$mail->SMTPAuth = true;
// наименование почтового ящика, или логин на почтовом сервере. Как правило, Вы указываете его, когда создаете почтовый ящик.
$mail->Username = '[email protected]';
// пароль от почтового ящика.
$mail->Password = 'PASSWORD';

// при указании SMTPSecure = ssl, то используется порт 465
// при указании tls - порт 587
// рекомендуется сочетать с указанием протокола в переменной Host
$mail->SMTPSecure = 'ssl';
$mail->Port = '465';
$mail->SMTPOptions = [ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true, ] ];

// далее следует код, который отвечает за отправку письма
// укажите почтовый ящик отправителя. Рекомендуем указывать такой же, который указываем в авторизационных данных - [email protected]
$mail->From = 'ЯЩИК ОТПРАВИТЕЛЯ'; 
// укажите имя отправителя, например "Сайт DOMAIN.RU"
$mail->FromName = 'ИМЯ ОТПРАВИТЕЛЯ'; 
// укажите тему сообщения здесь
$mail->Subject = 'ТЕМА ВАШЕГО СООБЩЕНИЯ'; 
// текст сообщения
$mail->Body = 'ТЕКСТ СООБЩЕНИЯ';  
// кодировка, можете изменить на необходимую, но чаще всего используется UTF-8
$mail->CharSet = 'UTF-8';
//  укажите true вместо false, если хотите, чтобы сообщение обрабатывалось как HTML
$mail->isHTML(false); 
// укажите почтовый адрес получателя
$mail->AddAddress('ЯЩИК ПОЛУЧАТЕЛЯ');  
// укажите 4, если почта не отправляется, чтобы узнать, почему
$mail->SMTPDebug = 0; 
// отправляем письмо
if($mail->send()){
echo 'OK';
}else{
echo 'BAD';
}

Если письмо было отправлено, Вы увидите OK. Если не было - BAD.  Если Вы получаете BAD вместо отправки письма, то рекомендуется установить значение переменной SMTPDebug = 4, тогда на странице появится отладочная информация с ошибками, которые легко отследить.

Возможные ошибки и типы их решения
SMTP Error: Could not connect to SMTP host. Connection failed. stream_socket_enable_crypto(): Peer certificate CN=`xxx.hostiman.ru' did not match expected CN=`mail.yyy.ru'
В качестве Host указан сервер без сертификата. Проверьте, выпущен ли для почтового домена сертификат SSL и соответствует ли он указанному серверу в переменной Host.

Message could not be sent. Mailer Error: SMTP Error: Could not connect to SMTP host.
Проверьте настройки подключения к серверу

Рекомендуем также прочитать следующие статьи:
- Как создать почтовый ящик на ISPmanager?
- Какие порты используются при подключении к почте?

Данный код можно использовать для отправки почты на сторонних сервисах, например:
Создать почту для своего домена на Яндексе
Создать почту для своего домена на Mail.ru

Если у Вас что-то не получилось, то создайте запрос в технический отдел и мы поможем Вам!