О web-разработке
и даже немного больше...

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

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

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

// Параметры почты
define ("SMTP_USERNAME","example@href.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;
}

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

Опубликован: 26.04.2013 г.

См. также:

Редакторы кода для PHP
Как просмотреть время загрузки страницы в PHP?
Генерация QR-кода в PHP
Загрузка файлов на сервер посредством Ajax
Импорт записей из Excel в WordPress
Парсинг XML в PHP
Установка IonCube на XAMPP
Создание PDF файлов в PHP

Комментарии

  1. Владислав пишет:

    такой код отсылает письмо и в поле "кому" ставит скрытый пользователь. а письмо доходит только из-за того что получатель почему то прописывается в скрытую копию.

    Есть идеи как решить проблему?

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

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

Комментарии
  • Загрузка...
Друзья сайта