Модификация функции drupal_mail

Главные вкладки

Аватар пользователя Alex001 Alex001 4 апреля 2009 в 0:19

Доброго времени суток..

Сам занимаюсь давно с друпалом, но вот всё не как не доходили руки, что нить тут предложить из своих поделок,
так вот...

Возникла у меня однажды острая нужда отказаться от использования php функции mail, которая используется в функции друпала drupal_mail.
Решил я сделать по сути небольшой smtp клиент, который можно было бы настроить на существующий smtp сервер с поддержкой аутентификации. Всё сделано было с использованием сокетов.
Подробнее:

Исходный код:

<?php
function server_parse($socket$response$line __LINE__) {
//        echo "Step.server_parse.<br>";
//        echo "W: $server_response<br>";
//        global $config;
    
while (substr($server_response31) != ' ') {
        if (!(
$server_response fgets($socket256))) {
                   if (
$config['smtp_debug']) echo "<p>Проблемы с отправкой почты!</p>$response<br>$line<br>";
//                   echo "W: $server_response<br>";
                   
return false;
                   
                }
//    echo "W: $server_response<br>";
    
}
    if (!(
substr($server_response03) == $response)) {
           if (
$config['smtp_debug']) echo "<p>Проблемы с отправкой почты!</p>$response<br>$line<br>";
           return 
false;
        }
//        echo "W: $server_response<br>";
//        echo "W: $response<br>";
    
return true;
    
}

function 

drupal_mail($mailkey$mail_to$subject$message$mail_from NULL$headers = array()) {

//echo "D_Mail: $mailkey<br>";
//echo "D_Mail: $to<br>";
//echo "D_Mail: $subject<br>";
//echo "D_Mail: $body<br>";
//echo "D_Mail: $from<br>";
$config['smtp_username'] = 'webmaster@sait.ru';  //Имя пользователя для работы с сервером smtp (в моём случае это был email)
$config['smtp_port']     = '25'// Порт smtp
$config['smtp_host']     = 'smtp.sait.ru';  //smtp сервер для отправки почты
$config['smtp_password'] = 'SUPERMEN';  //Пароль для работы с smtp сервером
$config['smtp_debug']    = false;  //Видеть сообщения ошибок - true
$config['smtp_charset']  = 'UTF-8';   //кодировка сообщений. (например, UTF-8)
$config['smtp_from']     = 'My sait'//Имя Вашего сайта.
$replyto 'www.sait.ru'//URL Вашего сайта
$type 'plain'//Можно поменять на html; plain означяет: будет присылаться чистый текст.

// $subject = 'test';
   
   

$headers "To: $mail_to\r\n".
              
"From: \"$replyto\" <$mail_from>\r\n".
              
"Reply-To: $mail_from\r\n".
              
"Content-Type: text/$type; charset=\"$config['smtp_charset']\"\r\n";

        

$SEND =   "Date: ".date("D, d M Y H:i:s") . " UT\r\n";
        
$SEND .=   'Subject: =?'.$config['smtp_charset'].'?B?'.base64_encode($subject)."=?=\r\n";
        if (
$headers$SEND .= $headers."\r\n\r\n";
        else
        {
                
$SEND .= "Reply-To: ".$config['smtp_username']."\r\n";
                
$SEND .= "MIME-Version: 1.0\r\n";
                
$SEND .= "Content-Type: text/plain; charset=\"".$config['smtp_charset']."\"\r\n";
                
$SEND .= "Content-Transfer-Encoding: 8bit\r\n";
                
$SEND .= "From: \"".$config['smtp_from']."\" <".$config['smtp_username'].">\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.sait.ru', '25', $errno, $errstr, 30) ) {
         
if( !$socket fsockopen($config['smtp_host'], $config['smtp_port'], $errno$errstr30) ) {
            if (
$config['smtp_debug']) echo $errno."&lt;br&gt;".$errstr;
            return 
false;
         }
 
            if (!
server_parse($socket"220"__LINE__)) return false;

          

fputs($socket"EHLO  " $config['smtp_host'] . "\r\n");
            if (!
server_parse($socket"250"__LINE__)) {
               if (
$config['smtp_debug']) echo '<p>Не могу отправить EHLO!</p>';
               
fclose($socket);
               return 
false;
            } 

            

fputs($socket"AUTH LOGIN\r\n");
            if (!
server_parse($socket"334"__LINE__)) {
               if (
$config['smtp_debug']) echo '<p>Не могу найти ответ на запрос авторизаци.</p>';
               
fclose($socket);
               return 
false;
            }
            
fputs($socketbase64_encode($config['smtp_username']) . "\r\n");
            if (!
server_parse($socket"334"__LINE__)) {
               if (
$config['smtp_debug']) echo '<p>Логин авторизации не был принят сервером!</p>';
               
fclose($socket);
               return 
false;
            }
            
fputs($socketbase64_encode($config['smtp_password']) . "\r\n");
            if (!
server_parse($socket"235"__LINE__)) {
               if (
$config['smtp_debug']) echo '<p>Пароль не был принят сервером как верный! Ошибка авторизации!</p>';
               
fclose($socket);
               return 
false;
            }
            
fputs($socket"MAIL FROM: <".$config['smtp_username'].">\r\n");
            if (!
server_parse($socket"250"__LINE__)) {
               if (
$config['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 (
$config['smtp_debug']) echo '<p>Не могу отправить комманду RCPT TO: </p>';
               
fclose($socket);
               return 
false;
            }
            
fputs($socket"DATA\r\n");

            if (!

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

            if (!

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

}

?>

функция server_parse - используеться для получения ответов от smtp сервера.

В своём коде использовал исходник:
http://www.rucable.net/We-send-mail-with-smtp-auth.html

P.S.: Данный код опробован на smtp сервере ht-system.ru (smtp.ht-systems.ru). На хостинге от 1gb уже не получилось на полную использовать, сервера типа mail.ru не подойдут...

в данном примере много чего можно доработать и уменьшить, но я тут решил показать просто принцип, как можно сделать

Комментарии