- PHP ОТПРАВКА ПОЧТЫ ЧЕРЕЗ SMTP ЯНДЕКСА
- Отправка почты через SMTP с помощью PHP
- Готовый класс — PHP
- Настройка класса
- Прикрепление файлов к письму
- Отправка писем на PHP через SMTP
- ApMailer
- Подключение ApMailer
- Инициализация
- Рабочий пример
- Отправка почты на старых версиях PHP
- Отправка писем через SMTP в PHPMailer
- Яндекс Почта
- Mail.ru
- Gmail
- Рамблер
- iCloud
- Мастерхост
- Timeweb
- Хостинг Центр (hc.ru)
- REG.RU
- ДЖИНО
- nic.ru
- Бегет — beget.com
- Спринтхост — sprinthost.ru
PHP ОТПРАВКА ПОЧТЫ ЧЕРЕЗ SMTP ЯНДЕКСА
Для отправки почты через SMTP Яндекса на языке PHP необходимо использовать библиотеку PHPMailer. Для начала нужно загрузить ее с помощью Composer:
composer require phpmailer/phpmailer
Далее, создается экземпляр класса PHPMailer и настраиваются параметры сервера SMTP:
$mail = new PHPMailer\PHPMailer\PHPMailer();$mail->isSMTP();$mail->Host = ‘smtp.yandex.ru’;$mail->Port = 465;$mail->SMTPSecure = ‘ssl’;$mail->SMTPAuth = true;$mail->Username = ‘username@yandex.ru’;$mail->Password = ‘password’;
Затем, настраиваются параметры письма, такие как отправитель, получатели, тема и текст:
$mail->setFrom(‘username@yandex.ru’, ‘Имя отправителя’);$mail->addAddress(‘recipient1@example.com’, ‘Имя получателя1’);$mail->addAddress(‘recipient2@example.com’, ‘Имя получателя2’);$mail->Subject = ‘Тема письма’;$mail->Body = ‘Текст письма’;
Наконец, вызывается метод send() для отправки письма:
Готовый код для отправки письма через SMTP Яндекса на PHP:
require ‘vendor/autoload.php’;$mail = new PHPMailer\PHPMailer\PHPMailer();// SMTP settings$mail->isSMTP();$mail->Host = ‘smtp.yandex.ru’;$mail->Port = 465;$mail->SMTPSecure = ‘ssl’;$mail->SMTPAuth = true;$mail->Username = ‘username@yandex.ru’;$mail->Password = ‘password’;// Email content$mail->setFrom(‘username@yandex.ru’, ‘Имя отправителя’);$mail->addAddress(‘recipient1@example.com’, ‘Имя получателя1’);$mail->addAddress(‘recipient2@example.com’, ‘Имя получателя2’);$mail->Subject = ‘Тема письма’;$mail->Body = ‘Текст письма’;// Send emailif(!$mail->send()) < echo 'Ошибка отправки письма: ' . $mail->ErrorInfo;> else
Как настроить SMTP на Яндекс почте
Как настроить E-mail уведомление через SMTP Yandex?
How To Send Email Using PHP With PHP Mailer — PHP Send Email — Full Step By Step
SMTP Gmail для отправки писем с сайта
Как работает электронная почта: SMTP, POP3 и IMAP
Почта в OpenServer. Настройка почты и отправка письма по SMTP в OpenServer.
Отправка писем на PHP. Функция mail
Отправка почты через 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, и не попадет в спам.
Пишите свои вопросы, предложения в комментариях помогу Всем!
Отправка писем на PHP через SMTP
Отправлять письма через PHP намного проще, чем кажется. Всего-то надо сформировать правильный EML, подключиться к SMTP и отправить письмо. Ну ещё может быть, хотя и не факт, надо где-то как-то залогировать отправку, а то потом потеряют письмо, скажут, что и не было никаких писем. И виноватый опять ты, хотя ты бел и пушист. А ещё бы хорошо сделать хоть какую-то обработку ошибок, а то вдруг эксепшин, или серевер устал, или коннект не пошёл, а тут суперважный клиент. И уж совсем замечательно хранить где-то письма на случай «я потеряль», «мне не дошло», «а вышлите мне ещё раз». А ещё мы хотим отправлять письма на сайте, который видел расцвет динозавров. А ещё. мне кажется, что список ещё может расширяться не хуже нашей вселенной.
Для решения всех этих проблем я решил написать небольшой инструмент — ApMailer.
ApMailer
ApMailer — это небольшая библиотека, единственной целью которой является отправка почты. Я постарался сделать её максимально простой и удобной. Вы можете скачать всего один файл и отправлять письма и из консоли, и из web-скриптов!
Подключение ApMailer
Скачайте из репозитория файл mailer.phar или src/lib.php (если не нужна консольная версия). После этого подключите lib.php:
// Если скачали phar include 'phar:///path/to/mailer.phar/lib.php'; // Если скачали исходный код include '/path/to/lib.php';
После этого будет доступна функция Mailer() :
Mailer()->init(include 'config.php'); $message = Mailer()->newHtmlMessage(); $message->setSubject($messageSubject); $message->setSenderEmail($messageFrom); $message->addRecipient($messageTo); $message->addContent(file_get_contents('mail-header.html')); $message->addContent($messageText); $message->addContent(file_get_contents('mail-footer.html')); $message->addRelatedFile('signature.png'); if (isset($_FILES['attachment']['size']) && $_FILES['attachment']['size'] > 0) < $message->addAttachmentFile( $_FILES['attachment']['tmp_name'], $_FILES['attachment']['name'], $_FILES['attachment']['type'] ); > Mailer()->sendMessage($message);
Инициализация
Перед отправкой писем Mailer надо проинициализировать. Делается это так:
Конфиг представляет из себя многомерный массив, в котором указываются адрес отправителя по умолчанию, хуки для обработки ошибок и ведения логов и транспортёры:
$config = [ 'defaultFrom' => 'mymail@example.org', 'onError' => function($error, $message, $transport) < echo $error; >, 'afterSend' => function($text, $message, $layer) < echo $text; >, 'transports' => [ // Сохранение всех писем в папке ['file', 'dir' => __DIR__ .'/mails'], // Отправка писем через Yandex, используя SSL и авторизацию ['smtp', 'host' => 'smtp.yandex.ru', 'ssl' => true, 'port' => '465', 'login' => '****@yandex.ru', 'password' => '******'], ], ];
В качестве транспортов можно использовать file и smtp . Тип транспорёта всегда должен передаваться первым элементом массива, дальше идут его настройки.
Транспортёр file сохраняет письмо в виде EML в папку. Доступны следующие настройки:
- dir — папка, а которую будут сохраняться письма. Если предполагается много писем, лучше хранить их с разбивкой по дате ‘dir’ => strftime( ‘/path/to/mails/%Y/%m/%d’ )
Транспортёр smtp отправляет письмо через SMTP. Доступны следующие настройки:
- host — адрес SMTP-сервера
- ssl — использовать SSL при подключении (обязательно для google, yandex и других популярных сервисов)
- port — порт подключения (обычно 25 для подключения без SSL и 465 для подклюения с SSL)
- login — логин для авторизации (если логин не указан, то используется подключение без авторизации)
- password — пароль для авторизации (не используется, если логин не указан)
- onError — срабатывает на ошибку транспортёра (удобно делать лог ошибок отправки писем)
- afterSend — срабатывает после отправки письма (удобно делать общий лог отправки писем)
Настройка defaultFrom нужна, чтобы не указывать каждый раз адрес отправителя. Если система не подразумевает работу нескольких человек, которые могут отсылать почту, то этот адрес обычно постоянный.
Рабочий пример
В качестве примера я сделал форму отправки письма:
Отправка почты на старых версиях PHP
Поскольку библиотека умеет работать через консоль, то можно формировать команду, которая сможет отправлять письма. Единственное, что нужно, наличие скомпилированного бинарника PHP 5.6.
function sendMail($message) < $keys = array( 'subject' => '-s', 'from' => '-f', 'text' => '-t', 'reciient' => array('-r'), 'to' => array('-r'), 'related' => array('-i'), 'attachment' => array('-a'), 'config' => array('-c'), ); $args = array(); // Если отправляют HTML if (isset($message['html'])) < $args[] = '--html'; // Подключаем шаблон $textArray = array(); // Header $textArray[] = ''; if (isset($message['html'])) < $textArray[] = join((array) $message['html']); > // Footer $textArray[] = ''; $message['text'] = join($textArray); > foreach ($keys as $key => $argument) < if (!isset($message[$key])) < continue; > if (is_array($argument)) < $argument = array_shift($argument); foreach ((array) $message[$key] as $value) < $args[] = $argument .' '. escapeshellarg($value); > > else < $args[] = $argument .' '. escapeshellarg($message[$key]); > > $command = 'php5.6 /path/to/mailer.phar '. join(' ', $args); exec($command); >;
А дальше уже можно отправлять письма:
sendMail(array( 'to' => array('someone@exmaple.org', 'someoneelse@exmaple.org'), 'subject' => 'Привет, мир!', 'html' => 'Hello
', ));
Отправка писем через 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 = 'Пароль';