- Отправка писем через SMTP на PHP
- Сколько писем можно отправлять с бесплатных (SMTP) почтовых ящиков?
- Отправка писем через SMTP в PHPMailer
- Яндекс Почта
- Mail.ru
- Gmail
- Рамблер
- iCloud
- Мастерхост
- Timeweb
- Хостинг Центр (hc.ru)
- REG.RU
- ДЖИНО
- nic.ru
- Бегет — beget.com
- Спринтхост — sprinthost.ru
- Как подключится к SMTP Yandex?
- Отправка почты через SMTP с помощью PHP
- Готовый класс — PHP
- Настройка класса
- Прикрепление файлов к письму
Отправка писем через SMTP на PHP
Некоторое время назад, я заметил, что письма, отправляемые с моего сервера, перестали доходить до адресата. Редко, попадали в папку Спам, чаще совсем не доходили. Сразу было понятно, что проблема в функции mail();
Пути решения было два: Читать много мануалов и настраивать сервак так, чтобы функция mail() корректно отправляла всю корреспонденцию или отправлять письма через SMTP. Как вы понимаете, путь я выбрал второй.
$config [ ‘smtp_debug’ ] = true ; //Если Вы хотите видеть сообщения ошибок, укажите true вместо false
$config [ ‘smtp_from’ ] = ‘МегаСервис’ ; //Ваше имя — или имя Вашего сайта. Будет показывать при прочтении в поле «От кого»
$SEND . = ‘Subject: =?’ . $config [ ‘smtp_charset’ ] . ‘?B?’ . base64_encode ( $subject ) . «=?=\r\n» ;
$SEND . = «From: \»=?» . $config [ ‘smtp_charset’ ] . «?B?» . base64_encode ( $config [ ‘smtp_from’ ] ) . «=?=\» <" . $config [ 'smtp_username' ] . ">\r\n» ;">
if ( ! $socket = fsockopen ( $config [ ‘smtp_host’ ] , $config [ ‘smtp_port’ ] , $errno , $errstr , 30 ) )
if ( $config [ ‘smtp_debug’ ] ) echo ‘
Не могу отправить HELO!
‘ ;
if ( $config [ ‘smtp_debug’ ] ) echo ‘
Не могу найти ответ на запрос авторизаци.
‘ ;
if ( $config [ ‘smtp_debug’ ] ) echo ‘
Логин авторизации не был принят сервером!
‘ ;
if ( $config [ ‘smtp_debug’ ] ) echo ‘
Пароль не был принят сервером как верный! Ошибка авторизации!
‘ ;
if ( $config [ ‘smtp_debug’ ] ) echo ‘
Не могу отправить комманду MAIL FROM:
‘ ;
if ( $config [ ‘smtp_debug’ ] ) echo ‘
Не могу отправить комманду RCPT TO:
‘ ;
if ( $config [ ‘smtp_debug’ ] ) echo ‘
Не могу отправить комманду DATA
‘ ;
if ( $config [ ‘smtp_debug’ ] ) echo ‘
Не смог отправить тело письма. Письмо не было отправленно!
‘ ;
if ( $config [ ‘smtp_debug’ ] ) echo «
Проблемы с отправкой почты!
$response
$line
» ;
if ( $config [ ‘smtp_debug’ ] ) echo «
Проблемы с отправкой почты!
$response
$line
» ;
Использовать её можно так-же как и обычную функцию mail:
smtpmail ( ‘Имя получателя’ , ’email-получателя@mail.ru’ , ‘Тема письма’ , ‘HTML или обычный текст письма’ ) ;
Сколько писем можно отправлять с бесплатных (SMTP) почтовых ящиков?
- mail.ru — не более 1 письма в минуту
- yandex.ru — не более 150 писем в сутки, не более 25 адресатов в одном письме
- gmail.com, tut.by — не более 500 писем в сутки (хотя в справке гугла фигурирует 2000), не более 500 получателей в одном письме за раз при отправке через интерфейс gmail.com (через web-интерфейс, т.е. при входе через браузер), не более 100 получателей в одном письме за раз при отправке через ваш почтовый клиент
- rambler.ru — не более 200 писем в час
- ukr.net — не более 250 писем в сутки
- meta.ua — не более 200 писем в сутки
- aol.com — не более 500 писем в сутки
- lycos.com — не более 250 писем в сутки
Рекомендую отправлять количества писем на 20-30 % меньше лимита.
Gmail может заблокировать (первый раз на сутки) ваш аккаунт и при меньшем чем 500 числе адресатов в письме. Очень важно, чтобы адреса были живые, работающие. При нескольких десятках мертвых адресов в одном письме c gmail вероятность блокировки очень велика.
Отправка писем через SMTP в PHPMailer
В последнее время письма отправляемые с хостингов через функции mail() и mb_send_mail() часто попадают в спам или совсем не доходят до адресатов. Альтернатива – это отправка e-mail через SMTP с реального почтового ящика.
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 = '«Hello, world!»
'; $mail->msgHTML($body); // Приложение $mail->addAttachment(__DIR__ . '/image.jpg'); $mail->send();
Если при отправки писем возникает ошибка « Could not connect to SMTP host », то необходимо добавить следующие строки:
$mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ) );
Яндекс Почта
$mail->Host = 'ssl://smtp.yandex.ru'; $mail->Port = 465; $mail->Username = 'Логин@yandex.ru'; $mail->Password = 'Пароль';
В настройках почты нужно разрешить доступ к почтовому ящику с помощью почтовых клиентов:
Mail.ru
$mail->Host = 'ssl://smtp.mail.ru'; $mail->Port = 465; $mail->Username = 'Логин@mail.ru'; $mail->Password = 'Пароль';
Gmail
$mail->Host = 'ssl://smtp.gmail.com'; $mail->Port = 465; $mail->Username = 'Логин@gmail.com'; $mail->Password = 'Пароль';
Если возникает ошибка при отправки почты, то нужно отключить двухфакторную авторизацию и разблокировать «ненадежные приложения» в настройках конфиденциальности аккаунта https://myaccount.google.com/security?pli=1
Рамблер
$mail->Host = 'ssl://smtp.rambler.ru'; $mail->Port = 465; $mail->Username = 'Логин@rambler.ru'; $mail->Password = 'Пароль';
iCloud
$mail->Host = 'ssl://smtp.mail.me.com'; $mail->Port = 587; $mail->Username = 'Логин@icloud.com'; $mail->Password = 'Пароль';
Мастерхост
$mail->Host = 'ssl://smtp.masterhost.ru'; $mail->Port = 465; $mail->Username = 'Логин@домен.ru'; $mail->Password = 'Пароль';
Timeweb
$mail->Host = 'ssl://smtp.timeweb.ru'; $mail->Port = 465; $mail->Username = 'Логин@домен.ru'; $mail->Password = 'Пароль';
Хостинг Центр (hc.ru)
Доступ к сторонним почтовым серверам по SMTP-портам (25, 465, 587) ограничен, разрешена отправка не более 300 сообщений в сутки.
$mail->Host = 'smtp.домен.ru'; $mail->SMTPSecure = 'TLS'; $mail->Port = 25; $mail->Username = 'Логин@домен.ru'; $mail->Password = 'Пароль';
REG.RU
$mail->Host = 'ssl://serverXXX.hosting.reg.ru'; $mail->Port = 465; $mail->Username = 'Логин@домен.ru'; $mail->Password = 'Пароль';
ДЖИНО
$mail->Host = 'ssl://smtp.jino.ru'; $mail->Port = 465; $mail->Username = 'Логин@домен.ru'; $mail->Password = 'Пароль';
nic.ru
$mail->Host = 'ssl://mail.nic.ru'; $mail->Port = 465; $mail->Username = 'Логин@домен.ru'; $mail->Password = 'Пароль';
Бегет — beget.com
$mail->Host = 'ssl://smtp.beget.com'; $mail->Port = 465; $mail->Username = 'Логин@домен.ru'; $mail->Password = 'Пароль';
Спринтхост — sprinthost.ru
$mail->Host = 'ssl://smtp.ВАШ_ДОМЕН'; $mail->Port = 465; $mail->Username = 'Логин@домен.ru'; $mail->Password = 'Пароль';
Как подключится к SMTP Yandex?
Здравствуйте! У меня не получается отправлять почту через PHPMailer, вчера целый день убил на этот этот вопрос.
Возможно я упускаю какую-то мелочь. Буду благодарен за любую помощь.
- В своём аккаунте yandex создал и подтвердил домен mydomain.ru
- Прописал mx.yandex.ru в записях
- Cоздал почту noreply@mydomain.ru (чтобы отправлять сервисные сообщения регистрация, восстановление . )
- Отправляю через PHPMailer 6.1.5
- Думал не верно логин и пароль прописываю, перебрал все сочетания.
- Создал отдельный пароль для приложения, не помогло
- Пробовал разные настройки портов и ENCRYPTION_xxx
Пример кода взял из исходника
Как правильно настроить эти параметры?
//Server settings $mail->SMTPDebug = SMTP::DEBUG_SERVER; // Enable verbose debug output $mail->isSMTP(); // Send using SMTP $mail->Host = '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 = PHPMailer::ENCRYPTION_SMTPS; // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` encouraged $mail->Port = 465; // TCP port to connect to, use 465 for `PHPMailer::ENCRYPTION_SMTPS` above
В зависимости от насторек получаю 2 типа ошибок
2020-05-25 15:29:38 SMTP ERROR: Failed to connect to server: (0) SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting Message could not be sent. Mailer Error: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting или 2020-05-25 15:39:14 SERVER -> CLIENT: 2020-05-25 15:39:14 SMTP NOTICE: EOF caught while checking if connected SMTP Error: Could not connect to SMTP host. SMTP Error: Could not connect to SMTP host. Message could not be sent. Mailer Error: SMTP Error: Could not connect to SMTP host.
Простой 12 комментариев
Отправка почты через SMTP с помощью PHP
Здравствуйте дорогие читатели. В этой записи я расскажу Вам как отправить письмо с вашего сайта через SMTP сервер. Перед тем, как отправлять письма через SMTP необходимо обязательно настроить DMARC, DKIM, SPF. Если не настроить, ваши письма будут попадать в спам, но нам этого не нужно. Статья — Как настроить DMARC, SPF, DKIM подпись на своем сайте.
Готовый класс — PHP
Для начала загрузите готовый класс, по ссылке — SendMailSmtpClass.php.zip
Распаковываем архив, и размещаем в любую директорию на Вашем сайте.
Настройка класса
Настройка очень простая. Разместите этот код на странице, которая присутствует на каждой. Обычно это — страница конфига.
require_once "SendMailSmtpClass.php"; // подключаем класс //ДЛЯ YANDEX.RU $mailSMTP = new SendMailSmtpClass('mail@yandex.ru', 'pass', 'ssl://smtp.yandex.ru', 465, "UTF-8"); //ДЛЯ MAIL.RU $mailSMTP = new SendMailSmtpClass('mail@mail.ru', 'pass', 'ssl://smtp.mail.ru', 465, "UTF-8"); //РАСШИФРОВКА ЗНАЧЕНИЙ $mailSMTP = new SendMailSmtpClass('логин', 'пароль', 'хост', 'порт', 'кодировка письма');
Код отправки самого письма:
$from = array("Блог программиста", // Имя отправителя "support@212d.ru" // почта отправителя ); $result = $mailSMTP->send('Кому письмо, можно через , два получателя', 'Тема письма', 'Текст письма', $from);
$result возвращает либо true — успешная отправка, либо false — ошибка.
Прикрепление файлов к письму
$mailSMTP->addFile("file1.jpg"); $mailSMTP->addFile("file2.jpg");
В итоге, если Вы все настроили правильно Ваше письмо будет отправляется через этот SMTP сервер с подписей DKIM, и не попадет в спам.
Пишите свои вопросы, предложения в комментариях помогу Всем!