Отправка писем через сокеты

Тема в разделе "PHP", создана пользователем LEXAlForpostl, 4 апр 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    Здравствуйте.
    Есть скрипт, который отправляет письма через сокеты.
    Всё работает нормально, но если в тексте письма указать двоеточие :, то письмо приходит с пустым телом, т.е. как будто ничего в письме не писали.

    P.S.
    Работаю через внешний СМТП.
     
  2. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Там split или explode по этому двоеточию нигде не делается?

    Указать просто, где угодно в теле письма, или все тело письма состоит из одного двоеточия? То, что перед двоеточием - тоже не доходит?

    Только с этим smtp такое?

    Кодировку менять пробовал?

    Вообще по симптомам похоже на то, что у тебя каким-то образом лишний перевод строки затесался между хидерами и body. А хидеры возможно как раз и записываются через двоеточия, и оно их как раз и хавает. И возможно то, что идет в теле письма до двоеточия - ставится в key хидера, а то что после - в value. Ну и ессно потом режется.

    Посмотри на заголовки.
     
  3. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    PHP:
    <?


     function 
    read_smtp_answer($socket) {
            
    $read socket_read($socket1024);
           
            if (
    $read{0} != '2' && $read{0} != '3') {
                if (!empty(
    $read)) {
                    throw new 
    Exception('SMTP failed: '.$read."\n");
                } else {
                    throw new 
    Exception('Unknown error'."\n");
                }
            }
        }
       
        
    // Функция для отправки запроса серверу
        
    function write_smtp_response($socket$msg) {
            
    $msg $msg."\r\n";
            
    socket_write($socket$msgstrlen($msg));
        }
        
    header('Content-Type: text/plain;');
        
    error_reporting(E_ALL E_WARNING);
        
    ob_implicit_flush();
        
    header('Content-Type: text/plain;');
        
    error_reporting(E_ALL E_WARNING);
        
    ob_implicit_flush();


      
    $address = ; // адрес smtp-сервера
        
    $port    25;          // порт (стандартный smtp - 25)
       
        
    $login   = ;    // логин к ящику
        
    $pwd     = ;    // пароль к ящику
       
        
    $from    = ;  // адрес отправителя
        
    $to      = ;  // адрес получателя

        
        
    $subject = ;       // тема сообщения
        
    $message= ;
        try {
           
            
    // Создаем сокет
            
    $socket socket_create(AF_INETSOCK_STREAMSOL_TCP);
            if (
    $socket 0) {
                throw new 
    Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\n");
            }

            
    // Соединяем сокет к серверу
            
    echo 'Connect to \''.$address.':'.$port.'\' ... ';
            
    $result socket_connect($socket$address$port);
            if (
    $result === false) {
                throw new 
    Exception('socket_connect() failed: '.socket_strerror(socket_last_error())."\n");
            } else {
                echo 
    "OK\n";
            }
           
            
    // Читаем информацию о сервере
            
    read_smtp_answer($socket);
           
            
    // Приветствуем сервер
            
    write_smtp_response($socket'EHLO '.$login);
            
    read_smtp_answer($socket); // ответ сервера
           
            
    echo 'Authentication ... ';
               
            
    // Делаем запрос авторизации
            
    write_smtp_response($socket'AUTH LOGIN');
            
    read_smtp_answer($socket); // ответ сервера
           
            // Отравляем логин
            
    write_smtp_response($socketbase64_encode($login));
            
    read_smtp_answer($socket); // ответ сервера
           
            // Отравляем пароль
            
    write_smtp_response($socketbase64_encode($pwd));
            
    read_smtp_answer($socket); // ответ сервера
           
            
    echo "OK\n";
            echo 
    "Check sender address ... ";
           
            
    // Задаем адрес отправителя
            
    write_smtp_response($socket'MAIL FROM:<'.$from.'>');
            
    read_smtp_answer($socket); // ответ сервера
           
            
    echo "OK\n";
            echo 
    "Check recipient address ... ";
           
            
    // Задаем адрес получателя
            
    write_smtp_response($socket'RCPT TO:<'.$to.'>');
            
    read_smtp_answer($socket); // ответ сервера
           
            
    echo "OK\n";
            echo 
    "Send message text ... ";
           
            
    // Готовим сервер к приему данных
            
    write_smtp_response($socket'DATA');
            
    read_smtp_answer($socket); // ответ сервера
           
            // Отправляем данные
            
    $message "To: $to\r\n".$message// добавляем заголовок сообщения "адрес получателя"
            
    $message "Subject: $subject\r\n".$message// заголовок "тема сообщения"
            
    write_smtp_response($socket$message."\r\n.");
            
    read_smtp_answer($socket); // ответ сервера
           
            
    echo "OK\n";
            echo 
    'Close connection ... ';
           
            
    // Отсоединяемся от сервера
            
    write_smtp_response($socket'QUIT');
            
    read_smtp_answer($socket); // ответ сервера
           
            
    echo "OK\n";
           
        } catch (
    Exception $e) {
            echo 
    "\nError: ".$e->getMessage();
        }
       
        if (isset(
    $socket)) {
            
    socket_close($socket);
        }
       




        
    ?>
    P.S.
    В самом начале скрипта пустые переменные, это для примера. В скрипте они у меня все объявлены.

    Где угодно.

    Тело письма пустое доходит, ничего там нет.

    На другом смтп нет возможности попробовать, однако, если с Зэ Бэта отправлять через этот смтп то всё отлично без искажений доходит.

    Т.к. текст письма прямо в скрипте пишется, пробовал менять кодировку РНР скрипта (В Notepad++ перекодировать нажимал.) Не помогло.
     
  4. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    PHP:
    // Отправляем данные
    $message "To: $to\r\n".$message// добавляем заголовок 
    $message "Subject: $subject\r\n".$message// заголовок "тема сообщения"
    write_smtp_response($socket$message."\r\n.");
    Вот тут ошибка.

    Дело в том, что после заголовков должна идти пустая строка. Или пустая или состоящая из одного символа "точка", я сейчас точно не помню. Кажется просто пустая.

    Т.е. первый из заголовков (т.е. который будет ближе всего к самому $message, т.к. в твоем примере они почему-то в обратном порядке дописываются) должен добавляться как-то так
    PHP:
    $message "To: $to\r\n\r\n".$message// добавляем заголовок 
    или (для точки) так
    PHP:
    $message "To: $to\r\n.\r\n".$message// добавляем заголовок 
     
    LEXAlForpostl нравится это.
  5. allximik

    allximik Постоялец

    Регистр.:
    6 сен 2008
    Сообщения:
    114
    Симпатии:
    75
    А не могли вы вы выложить исправленный рабочий скрипт целиком. Надо скрипт сделать для отправки с помощью сокетов письмо, второй день не получается.
     
Статус темы:
Закрыта.