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






Добро пожаловать!

Отправка писем посредством SMTP

Старая добрая функция для отправки писем посредством SMTP — с авторизацией. С большой вероятностью похожий код уже может встречаться на многих страницах блогов, и не только, т.к. ему не первый год, но всё же, он продолжает работать. А поэтому я решил, что ему быть тут. Отстраняясь от болтологии ближе к делу.

Основные параметры хранятся в виде констант, и при использовании в проектах, хорошо бы их переместить в конфигурационный файл. Надеюсь, вы понимаете, о чём я:

// Параметры почты
define ("SMTP_USERNAME","example@yournet.kz"); // Имя почтового ящика
define ("SMTP_PORT","25"); // Порт
define ("SMTP_HOST","smtp.yornet.kz"); // Cервер отправки почты
define ("SMTP_PASS","w599o55w4a55"); // Пароль от почты
define ("SMTP_DEBUG",false); // Показ сообщений об ошибках
define ("SMTP_CHARSET","UTF-8"); // Кодировка письма
define ("SMTP_FROM","Блог о веб-разработке"); // поле "От кого"

При первоначальной настройке и отладке, скорее всего, понадобиться изменить значение константы SMTP_DEBUG на true. Тем самым мы будем видеть уведомления об ошибках при отправке письма. После успешной отладки, значение уведомление об ошибках стоит отключить, чтобы не кошмарить посетителей сайта.

Собственно основной код:

function smtpmail($mail_to, $subject, $message, $headers='') {
        // global $config;
		
        $SEND =   "Date: ".date("D, d M Y H:i:s") . " UT\r\n";
        $SEND .=   'Subject: =?'.SMTP_CHARSET.'?B?'.base64_encode($subject)."=?=\r\n";
        
		if ($headers) $SEND .= $headers."\r\n\r\n";
        else {
                $SEND .= "Reply-To: ".SMTP_USERNAME."\r\n";
                $SEND .= "MIME-Version: 1.0\r\n";
                $SEND .= "Content-Type: text/plain; charset=\"".SMTP_CHARSET."\"\r\n";
                $SEND .= "Content-Transfer-Encoding: 8bit\r\n";
                $SEND .= "From: \"".SMTP_FROM."\" <".SMTP_CHARSET.">\r\n";
                $SEND .= "To: $mail_to <$mail_to>\r\n";
                $SEND .= "X-Priority: 3\r\n\r\n";
        }
		
        $SEND .=  $message."\r\n";
		
         if( !$socket = fsockopen(SMTP_HOST, SMTP_PORT, $errno, $errstr, 30) ) {
            if (SMTP_DEBUG) echo $errno."&lt;br&gt;".$errstr;
            return false;
         }

            if (!server_parse($socket, "220", __LINE__)) return false;

            fputs($socket, "EHLO " . SMTP_HOST . "\r\n");
            if (!server_parse($socket, "250", __LINE__)) {
               if (SMTP_DEBUG) echo '<p>Не могу отправить HELO!</p>';
               fclose($socket);
               return false;
            }
            fputs($socket, "AUTH LOGIN\r\n");
            if (!server_parse($socket, "334", __LINE__)) {
               if (SMTP_DEBUG) echo '<p>Не могу найти ответ на запрос авторизаци.</p>';
               fclose($socket);
               return false;
            }
            fputs($socket, base64_encode(SMTP_USERNAME) . "\r\n");
            if (!server_parse($socket, "334", __LINE__)) {
               if (SMTP_DEBUG) echo '<p>Логин авторизации не был принят сервером!</p>';
               fclose($socket);
               return false;
            }
            fputs($socket, base64_encode(SMTP_PASS) . "\r\n");
            if (!server_parse($socket, "235", __LINE__)) {
               if (SMTP_DEBUG) echo '<p>Пароль не был принят сервером как верный! Ошибка авторизации!</p>';
               fclose($socket);
               return false;
            }
            fputs($socket, "MAIL FROM: <".SMTP_USERNAME.">\r\n");
            if (!server_parse($socket, "250", __LINE__)) {
               if (SMTP_DEBUG) echo '<p>Не могу отправить комманду MAIL FROM: </p>';
               fclose($socket);
               return false;
            }
            fputs($socket, "RCPT TO: <" . $mail_to . ">\r\n");

            if (!server_parse($socket, "250", __LINE__)) {
               if (SMTP_DEBUG) echo '<p>Не могу отправить комманду RCPT TO: </p>';
               fclose($socket);
               return false;
            }
            fputs($socket, "DATA\r\n");

            if (!server_parse($socket, "354", __LINE__)) {
               if (SMTP_DEBUG) echo '<p>Не могу отправить комманду DATA</p>';
               fclose($socket);
               return false;
            }
            fputs($socket, $SEND."\r\n.\r\n");

            if (!server_parse($socket, "250", __LINE__)) {
               if (SMTP_DEBUG) echo '<p>Не смог отправить тело письма. Письмо не было отправленно!</p>';
               fclose($socket);
               return false;
            }
            fputs($socket, "QUIT\r\n");
            fclose($socket);
            return TRUE;
}

function server_parse($socket, $response, $line = __LINE__) {
    $server_response = '';
    while (substr($server_response, 3, 1) != ' ') {
        if (!($server_response = fgets($socket, 256))) {
                   if (SMTP_DEBUG) echo "<p>Проблемы с отправкой почты!</p>$response<br>$line<br>";
                   return false;
                }
    }
    if (!(substr($server_response, 0, 3) == $response)) {
           if (SMTP_DEBUG) echo "<p>Проблемы с отправкой почты!</p>$response<br>$line<br>";
           return false;
        }
    return true;
}

Надеюсь пригодиться. Интегрируйте, переделывайте, пользуйте!

Добавил: htmaker, 26.04.2013 г.
 
плохослабосойдетхорошоотлично (Еще не оценили)
Загрузка...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Комментарии

  • Загрузка...

Наверх