- Отправка писем через SMTP с авторизацией по протоколу SSL на php
- SMTP с авторизацией по протоколу SSL. Яндекс
- SMTP с авторизацией по протоколу SSL. Майл
- SMTP с авторизацией по протоколу SSL. Gmail
- Дополнения
- Отправка писем через SMTP в PHPMailer
- Яндекс Почта
- Mail.ru
- Gmail
- Рамблер
- iCloud
- Мастерхост
- Timeweb
- Хостинг Центр (hc.ru)
- REG.RU
- ДЖИНО
- nic.ru
- Бегет — beget.com
- Спринтхост — sprinthost.ru
- Отправка почты через SMTP с помощью PHP
- Готовый класс — PHP
- Настройка класса
- Прикрепление файлов к письму
Отправка писем через SMTP с авторизацией по протоколу SSL на php
Эта статья является продолжением ранее написанной, на тему Отправка писем через SMTP с авторизацией на php. В предыдущей статье я выкладывал исходники класса, который писал для своих нужд, работа которого заключалась в отправке писем через smtp Яндекса. Но статья стала популярной и многие читатели блога, стали присылать вопросы по работе класса. Главной проблемой стала работа через протокол SSL. А в последнее время эта проблема стала возникать еще чаще, поскольку все популярные почтовые сервера перешли на работу по защищенному протоколу SSL. В связи с этим я немного дописал класс, он теперь способен работать и по SSL, обновленную версию можете скачать тут.
Обновление 13.03.2018: Класс обновился, подробнее тут: Новая версия класса SendMailSmtpClass
SMTP с авторизацией по протоколу SSL. Яндекс
Для работы с почтовым сервером Яндекс ни чего не изменилось, единственное, что при вызове класса, необходимо указывать ссылку на хост, работающий через SSL и изменился номер порта: был 25, стал 465. Выглядит код отправки теперь вот так:
// пример использования require_once «SendMailSmtpClass.php»; // подключаем класс $mailSMTP = new SendMailSmtpClass(‘zhenikipatov@yandex.ru’, ‘****’, ‘ssl://smtp.yandex.ru’, ‘Evgeniy’, 465); // $mailSMTP = new SendMailSmtpClass(‘логин’, ‘пароль’, ‘хост’, ‘имя отправителя’); // заголовок письма $headers= «MIME-Version: 1.0\r\n»; $headers .= «Content-type: text/html; charset=utf-8\r\n»; // кодировка письма $headers .= «From: Evgeniy \r\n»; // от кого письмо $result = $mailSMTP->send(‘zhenikipatov@yandex.ru’, ‘Тема письма’, ‘Текст письма’, $headers); // отправляем письмо // $result = $mailSMTP->send(‘Кому письмо’, ‘Тема письма’, ‘Текст письма’, ‘Заголовки письма’); if($result === true)< echo "Письмо успешно отправлено"; >else
SMTP с авторизацией по протоколу SSL. Майл
Для работы с почтовым сервером Mail.ru обновленный класс тоже подходит, как и в случае я Яндексом, тут необходимо также указать ссылку на хост с ssl и ображаться к порту 465.
Помимо этого, для корректной работы с Mail.ru в заголовках письма необходимо указывать отправителя, точно такого же с которого происходит авторизация на сервере или e-mail отправителя не указывать вовсе.
Код отправки письма через почтовый сервер Mail.ru выглядит вот так:
// пример использования require_once «SendMailSmtpClass.php»; // подключаем класс $mailSMTP = new SendMailSmtpClass(‘ipatovsoft@mail.ru’, ‘****’, ‘ssl://smtp.mail.ru’, ‘Evgeniy’, 465); // создаем экземпляр класса // $mailSMTP = new SendMailSmtpClass(‘логин’, ‘пароль’, ‘хост’, ‘имя отправителя’); // заголовок письма $headers= «MIME-Version: 1.0\r\n»; $headers .= «Content-type: text/html; charset=utf-8\r\n»; // кодировка письма $headers .= «From: Evgeniy \r\n»; // от кого письмо . тут e-mail, через который происходит авторизация $result = $mailSMTP->send(‘zhenikipatov@yandex.ru’, ‘Тема письма’, ‘Текст письма’, $headers); // отправляем письмо // $result = $mailSMTP->send(‘Кому письмо’, ‘Тема письма’, ‘Текст письма’, ‘Заголовки письма’); if($result === true)< echo "Письмо успешно отправлено"; >else
SMTP с авторизацией по протоколу SSL. Gmail
Для работы с почтовым сервером gmail.com, необходимо указывать ссылку на хост, работающий через SSL и номер порта 465. Выглядит код отправки теперь вот так:
// пример использования require_once «SendMailSmtpClass.php»; // подключаем класс $mailSMTP = new SendMailSmtpClass(‘ipatovsoft@gmail.com’, ‘*****’, ‘ssl://smtp.gmail.com’, ‘Evgeniy’, 465); // создаем экземпляр класса // $mailSMTP = new SendMailSmtpClass(‘логин’, ‘пароль’, ‘хост’, ‘имя отправителя’); // заголовок письма $headers= «MIME-Version: 1.0\r\n»; $headers .= «Content-type: text/html; charset=utf-8\r\n»; // кодировка письма $headers .= «From: Evgeniy \r\n»; // от кого письмо $result = $mailSMTP->send(‘zhenikipatov@yandex.ru’, ‘gmail’, ‘Текст письма’, $headers); // отправляем письмо // $result = $mailSMTP->send(‘Кому письмо’, ‘Тема письма’, ‘Текст письма’, ‘Заголовки письма’); if($result === true)< echo "Письмо успешно отправлено"; >else
На этом пока все, жду комментариев о работе обновленного класса.
Дополнения
19.10.2014 Иван Ткаченко подсказал, что можно расширить возможности класса и отправлять письмо сразу нескольким получателям, за это ему большое спасибо!
Для отправки нескольким получателям через «,» заменить
Это:
fputs($socket, «RCPT TO: \r\n»); if (!$this->_parseServer($socket, «250»))
$email_to_array = explode(',', $mailTo); foreach($email_to_array as $key => $email) < $emails = ltrim($email, ''); fputs($socket, "RCPT TO: \r\n"); if (!$this->_parseServer($socket, "250")) < fclose($socket); throw new Exception('Error of command sending: RCPT TO'); >>
05.08.2016 Сегодня в комментарии подсказали по поводу проблемы с кодировкой, спасибо за это Евгению:
«Для тех у кого в теле и сабже полученного письма кракозябры — проверьте кодировку сервера по умолчанию и кодировку в которой написан сам скрипт. У меня windows-1251 так что прежде чем вызывать метод send использую»
$from_user=iconv("windows-1251", "utf-8" ,$from_user); $subject =iconv("windows-1251", "utf-8" , $subject); $message =iconv("windows-1251", "utf-8" , $message);
22.11.2016 Сегодня в комментарий добавили полезный код, который позволяет отправлять, с помощью класса, не только текст, но и файлы. Спасибо большое, за этот код Анжелике. Ниже код:
можно отправлять не только одно письмо но и файлы прикреплять к письму: // пример использования require_once «SendMailSmtpClass.php»; // подключаем класс $mailSMTP = new SendMailSmtpClass(‘xxx@mail.ru’, ‘xxx’, ‘ssl://smtp.mail.ru’, ‘NameSender’, 465); // создаем экземпляр класса // $mailSMTP = new SendMailSmtpClass(‘логин’, ‘пароль’, ‘хост’, ‘имя отправителя’); // заголовок письма $headers= «MIME-Version: 1.0\r\n»; //$headers .= «Content-type: text/html; charset=utf-8\r\n»; // кодировка письма //$headers .= «From: Anjelika \r\n»; // от кого письмо . тут e-mail, через который происходит авторизация $subject = «пробуем отправить файл»; $message =»Сообщение в теле письма при отправке файла»; // текст сообщения, здесь вы можете вставлять таблицы, рисунки, заголовки, оформление цветом и т.п. $filename = «имя файла например формата.zip»; // название файла $filepath = «./sending/полный путь к файлу.zip»; // месторасположение файла //исьмо с вложением состоит из нескольких частей, которые разделяются разделителем $boundary = «—-«.md5(uniqid(time())); // генерируем разделитель $headers .= «Content-Type: multipart/mixed; boundary=\»$boundary\»\r\n»; // кодировка письма// разделитель указывается в заголовке в параметре boundary $headers .= «From: NameSender \r\n»; $multipart = «—$boundary\r\n»; $multipart .= «Content-Type: text/html; charset=windows-1251\r\n»; $multipart .= «Content-Transfer-Encoding: base64\r\n»; $multipart .= «\r\n»; $multipart .= chunk_split(base64_encode(iconv(«utf8», «windows-1251″, $message))); // первая часть само сообщение // Открыли файл $fp = fopen($filepath,»r»); if (!$fp) < print «Не удается открыть файл22»; exit(); >$file = fread($fp, filesize($filepath)); // чтение файла fclose($fp); $message_part = «\r\n—$boundary\r\n»; $message_part .= «Content-Type: application/zip; name=\»$filename\»\r\n»; $message_part .= «Content-Disposition: attachment\r\n»; $message_part .= «Content-Transfer-Encoding: base64\r\n»; $message_part .= «\r\n»; $message_part .= chunk_split(base64_encode($file)); $message_part .= «\r\n—$boundary—\r\n»; // второй частью прикрепляем файл, можно прикрепить два и более файла $multipart .= $message_part; $result = $mailSMTP->send(‘xxx@xxx.ru’, $subject, $multipart, $headers); // отправляем письмо // $result = $mailSMTP->send(‘Кому письмо’, ‘Тема письма’, ‘Текст письма’, ‘Заголовки письма’); if($result === true)< echo «Письмо успешно отправлено»; >else
Отправка писем через 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 с помощью 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, и не попадет в спам.
Пишите свои вопросы, предложения в комментариях помогу Всем!