• База знаний
  • /
  • Блог
  • /
  • Wiki
  • /
+380 (44) 364 05 71

После изменения политики обработки писем популярными почтовыми сервисами, такими как mail.ru, многие пользователи столкнулись с проблемами в отправки писем с сайта.

Поэтому мы решили рассказать каким еще методом, кроме РНР функции mail() можно отправлять письма с сайтов.

Этот способ достаточно распространен. Однако из-за того, что код скрипта содержит больше параметров нежели ф-ция mail, многие отказываются от него. А зря, поскольку он более надежен благодаря авторизации на почтовом сервере.

Итак рассмотрим РНР класс SendMailSmtpClass:

<?php
class SendMailSmtpClass {

public $smtp_username;
public $smtp_password;
public $smtp_host;
public $smtp_from;
public $smtp_port;
public $smtp_charset;

//конструктор класса, устанавливает параметры работы с SMTP

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;
}

//Отправка сообщения

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');
          }

          $server_name = $_SERVER["SERVER_NAME"];
          fputs($socket, "EHLO $server_name\r\n");
          if (!$this->_parseServer($socket, "250")) {
               fclose($socket);
               throw new Exception('Error of command sending: EHLO');
          }

         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');
        }

        $mailTo = ltrim($mailTo, '<');
        $mailTo = rtrim($mailTo, '>');
        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;
}
}

В файл с формой отправки (например страница конткаты) подключаете класс SendMailSmtpClass описанный выше и вставляете следующий код (который может быть получен из формы):

/*Авторизация*/
$smtp_username = "Ваш имейл";
$smtp_password = "пароль к ящику";
$smtp_host = "freemail.freehost.com.ua";
$smtp_from = "Обратный имейл";
$mailSMTP = new SendMailSmtpClass($smtp_username, $smtp_password, $smtp_host, $smtp_from);

/*Создаем письмо*/
$mailTo = "имейл получателя";
$subject = "Тема письма";

$message = "<!DOCTYPE html>
<html lang='ru'>
<head>
<title>SITENAME</title>
</head>
<body>
<div>Тело письма</div>
</body>
</html>
";

$headers = "Reply-To: ".$smtp_username."\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=\"".$mailSMTP->smtp_charset."\"\r\n";
$headers .= "Content-Transfer-Encoding: 8bit\r\n";
$headers .= "From: <".$smtp_username."> \r\n";
$headers .= "To: $mailTo <$mailTo>\r\n";
$headers .= "X-Priority: 3\r\n\r\n";

$result = $mailSMTP->send($mailTo, $subject, $message, $headers);

if($result === true){
    echo "Письмо успешно отправлено";
}else{
    echo "Письмо не отправлено. Ошибка: " . $result;

Дата: 21.06.2016
Автор: Александр
Голосование

Авторам статьи важно Ваше мнение. Будем рады его обсудить с Вами:

comments powered by Disqus
Спасибо, что выбираете FREEhost.UA