Сегодня разберём как отправить письмо с помощью PHP через SMPT. Электронные письма от стандартной функции mail в php могут попадать в спам. Это связанно с неверными настройками отправляемого письма, с подозрительными заголовками, а так же ip сервера, с которого отправляется e-mail, может числится в чёрных листах.
Эту проблему можно решить, отправляя письмо с помощью SMPT. Сервер и пароль для отправки почты можно узнать у своего хостинга, либо использовать известные сервера, предоставляющие услуги электронной почты (Yandex, GOOGle и т.д. ). Правда у бесплатных серверов существуют ограничения на количество отправляемых писем (Которые можно узнать в документации у самих почтовых компаний.)

Класс отправки писем через SMPT на PHP.
class SendMailSmtpClass { public $smtp_username; public $smtp_password; public $smtp_host; public $smtp_from; public $smtp_port; public $smtp_charset; public function __construct($smtp_username, $smtp_password, $smtp_host, $smtp_from, $smtp_port = 25, $smtp_charset = "utf-8") { $this->smtp_username = $smtp_username; $this->smtp_password = $smtp_password; $this->smtp_host = $smtp_host; $this->smtp_from = $smtp_from; $this->smtp_port = $smtp_port; $this->smtp_charset = $smtp_charset; } /** * Отправка письма * * @param string $mailTo - получатель письма * @param string $subject - тема письма * @param string $message - тело письма * @param string $headers - заголовки письма * * @return bool|string В случаи отправки вернет true, иначе текст ошибки * */ function send($mailTo, $subject, $message, $headers) { $contentMail = "Date: " . date("D, d M Y H:i:s") . " UT\r\n"; $contentMail .= 'Subject: =?' . $this->smtp_charset . '?B?' . base64_encode($subject) . "=?=\r\n"; $contentMail .= $headers . "\r\n"; $contentMail .= $message . "\r\n"; try { if(!$socket = @fsockopen($this->smtp_host, $this->smtp_port, $errorNumber, $errorDescription, 30)){ throw new Exception($errorNumber.".".$errorDescription); } if (!$this->_parseServer($socket, "220")){ throw new Exception('Connection error'); } fputs($socket, "HELO " . $this->smtp_host . "\r\n"); if (!$this->_parseServer($socket, "250")) { fclose($socket); throw new Exception('Error of command sending: HELO'); } fputs($socket, "AUTH LOGIN\r\n"); if (!$this->_parseServer($socket, "334")) { fclose($socket); throw new Exception('Autorization error'); } fputs($socket, base64_encode($this->smtp_username) . "\r\n"); if (!$this->_parseServer($socket, "334")) { fclose($socket); throw new Exception('Autorization error'); } fputs($socket, base64_encode($this->smtp_password) . "\r\n"); if (!$this->_parseServer($socket, "235")) { fclose($socket); throw new Exception('Autorization error'); } fputs($socket, "MAIL FROM: ".$this->smtp_username."\r\n"); if (!$this->_parseServer($socket, "250")) { fclose($socket); throw new Exception('Error of command sending: MAIL FROM'); } fputs($socket, "RCPT TO: " . $mailTo . "\r\n"); if (!$this->_parseServer($socket, "250")) { fclose($socket); throw new Exception('Error of command sending: RCPT TO'); } fputs($socket, "DATA\r\n"); if (!$this->_parseServer($socket, "354")) { fclose($socket); throw new Exception('Error of command sending: DATA'); } fputs($socket, $contentMail."\r\n.\r\n"); if (!$this->_parseServer($socket, "250")) { fclose($socket); throw new Exception("E-mail didn't sent"); } fputs($socket, "QUIT\r\n"); fclose($socket); } catch (Exception $e) { return $e->getMessage(); } return true; } private function _parseServer($socket, $response) { while (@substr($responseServer, 3, 1) != ' ') { if (!($responseServer = fgets($socket, 256))) { return false; } } if (!(substr($responseServer, 0, 3) == $response)) { return false; } return true; } }
Вызываем класс с параметрами
require_once "SendMailSmtpClass.php"; // подключаем класс $mailSMTP = new SendMailSmtpClass('zzz@yandex.ru', '****', 'smtp.yandex.ru', 'Admin'); // создаем экземпляр класса // $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('xxxx@yandex.ru', 'Тема письма', 'Текст письма', $headers); // отправляем письмо // $result = $mailSMTP->send('Кому письмо', 'Тема письма', 'Текст письма', 'Заголовки письма'); if($result === true){ echo "Письмо успешно отправлено"; }else{ echo "Письмо не отправлено. Ошибка: " . $result; }
Скачать класс PHP для отправки письма через через SMPT
Счастливого программирования!
Оставить коментарий: