Отправка писем через SMTP в PHPMailer

В последнее время письма отправляемые с хостингов через функции mail() и mb_send_mail() часто попадают в спам или совсем не доходят до адресатов. Альтернатива – это отправка e-mail через SMTP с реального почтового ящика.

Проект на GitHub.com.

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

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

// Для более ранних версий PHPMailer
//require_once '/PHPMailer/PHPMailerAutoload.php';

$mail = new PHPMailer;
$mail->CharSet = 'UTF-8';

// Настройки SMTP
$mail->isSMTP();
$mail->SMTPAuth = true;
$mail->SMTPDebug = 0;

$mail->Host = 'ssl://smtp.gmail.com';
$mail->Port = 465;
$mail->Username = 'Логин';
$mail->Password = 'Пароль';

// От кого
$mail->setFrom('mail@snipp.ru', 'Snipp.ru');		

// Кому
$mail->addAddress('mail@site.com', 'Иван Петров');

// Тема письма
$mail->Subject = $subject;

// Тело письма
$body = '<p><strong>«Hello, world!» </strong></p>';
$mail->msgHTML($body);

// Приложение
$mail->addAttachment(__DIR__ . '/image.jpg');

$mail->send();
PHP

Если при отправки писем возникает ошибка «Could not connect to SMTP host», то необходимо добавить следующие строки:

$mail->SMTPOptions = array(
	'ssl' => array(
		'verify_peer' => false,
		'verify_peer_name' => false,
		'allow_self_signed' => true
	)
);
PHP
$mail->Host = 'ssl://smtp.yandex.ru';
$mail->Port = 465;
$mail->Username = 'Логин@yandex.ru';
$mail->Password = 'Пароль';
PHP

В настройках почты нужно разрешить доступ к почтовому ящику с помощью почтовых клиентов:

$mail->Host = 'ssl://smtp.mail.ru';
$mail->Port = 465;
$mail->Username = 'Логин@mail.ru';
$mail->Password = 'Пароль';
PHP
$mail->Host = 'ssl://smtp.gmail.com';
$mail->Port = 465;
$mail->Username = 'Логин@gmail.com';
$mail->Password = 'Пароль';
PHP

Если возникает ошибка при отправки почты, то нужно отключить двухфакторную авторизацию и разблокировать «ненадежные приложения» в настройках конфиденциальности аккаунта https://myaccount.google.com/security?pli=1

$mail->Host = 'ssl://smtp.rambler.ru';
$mail->Port = 465;
$mail->Username = 'Логин@rambler.ru';
$mail->Password = 'Пароль';
PHP
$mail->Host = 'ssl://smtp.mail.me.com';
$mail->Port = 587;
$mail->Username = 'Логин@icloud.com';
$mail->Password = 'Пароль';
PHP
$mail->Host = 'ssl://smtp.masterhost.ru';
$mail->Port = 465;
$mail->Username = 'Логин@домен.ru';
$mail->Password = 'Пароль';
PHP

Лимит – 2000 писем в день, но не более 5 в секунду.

$mail->Host = 'ssl://smtp.timeweb.ru';
$mail->Port = 465;
$mail->Username = 'Логин@домен.ru';
$mail->Password = 'Пароль';
PHP

Доступ к сторонним почтовым серверам по SMTP-портам (25, 465, 587) ограничен, разрешена отправка не более 300 сообщений в сутки.

$mail->Host = 'smtp.домен.ru';
$mail->SMTPSecure = 'TLS';
$mail->Port = 25;
$mail->Username = 'Логин@домен.ru';
$mail->Password = 'Пароль';
PHP

Лимит – 3000 писем в день.

$mail->Host = 'ssl://serverXXX.hosting.reg.ru';
$mail->Port = 465;
$mail->Username = 'Логин@домен.ru';
$mail->Password = 'Пароль';
PHP

Имя сервера можно узнать в разделе «Информация о включенных сервисах и паролях доступа»:

В разделе «Услуги» нужно включить опцию «SMTP-сервер»:

$mail->Host = 'ssl://smtp.jino.ru';
$mail->Port = 465;
$mail->Username = 'Логин@домен.ru';
$mail->Password = 'Пароль';
PHP

В настройках веб-сервера необходимо включить PHP расширение «openssl».

$mail->Host = 'ssl://mail.nic.ru';
$mail->Port = 465;
$mail->Username = 'Логин@домен.ru';
$mail->Password = 'Пароль';
PHP
$mail->Host = 'ssl://smtp.beget.com';
$mail->Port = 465;
$mail->Username = 'Логин@домен.ru';
$mail->Password = 'Пароль';
PHP
$mail->Host = 'ssl://smtp.ВАШ_ДОМЕН';
$mail->Port = 465;
$mail->Username = 'Логин@домен.ru';
$mail->Password = 'Пароль';
PHP
04.04.2018, обновлено 08.04.2022
128643
Предыдущая запись Адреса серверов POP3, IMAP и SMTP
Следующая запись Формирование файла sitemap.xml

Комментарии 4

Дмитрий Пронин Дмитрий Пронин
28 мая 2021 в 17:57
+2
Была ошибка 500, но поменял строчку создания экземпляра класса на
$mail = new PHPMailer\PHPMailer\PHPMailer();
и заработало.
Oleg Palgov Oleg Palgov
30 сентября 2021 в 10:05
-9
Ну не пашет же. Качаешь с гита репу а там нет даже класса автолоад чё за бред... мануал в топе выдачи, а не рабочий.
Алек Садлер Алек Садлер
14 июня 2022 в 16:10
-4
Может потому-что руки не из того места?
Radhab Magomedov Radhab Magomedov
22 июня 2023 в 20:51
-1
Спасибо. Всё отлично работает! Я как веб-мастер нашёл много полезного на вашем сайте!

, чтобы добавить комментарий.

Другие публикации

Отправка письма с вложением
Отправка e-mail в кодировке UTF-8 с вложенными файлами и возможные проблемы.
11054
+3
Использование API Яндекс Диска на PHP
Можно найти множество применений Яндекс Диска на своем сайте, например, хранение бекапов и отчетов, обновление прайсов,...
52243
+18
PHP класс для отправки E-mail
Отправка писем в кодировке UTF-8 и формате HTML, вложение файлов, дамп писем на сервере в файле eml.
15038
+3
Получить фото из Instagram без API
Так как Instagram и Fasebook ограничили доступ к API, а фото с открытого аккаунта всё же нужно периодически получать и...
23655
+7
Генерация QR-кода в PHP
Вопрос генерации QR-кодов в PHP достаточно освещён, есть много библиотек, одной из них является «PHP QR Code» – быстрый и легкий класс, рассмотрим его применение совместно с графической библиотекой...
57883
+17
Примеры использования cURL в PHP
cURL PHP – это библиотека предназначенная для получения и передачи данных через такие протоколы, как HTTP, FTP, HTTPS....
195733
+20