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

Статус
В этой теме нельзя размещать новые ответы.

LEXAlForpostl

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

P.S.
Работаю через внешний СМТП.
 
Там split или explode по этому двоеточию нигде не делается?

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

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

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

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

Посмотри на заголовки.
 
PHP:
<?


 function read_smtp_answer($socket) {
        $read = socket_read($socket, 1024);
       
        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, $msg, strlen($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_INET, SOCK_STREAM, SOL_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($socket, base64_encode($login));
        read_smtp_answer($socket); // ответ сервера
       
        // Отравляем пароль
        write_smtp_response($socket, base64_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.
В самом начале скрипта пустые переменные, это для примера. В скрипте они у меня все объявлены.

Указать просто, где угодно в теле письма, или все тело письма состоит из одного двоеточия?
Где угодно.

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

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

Кодировку менять пробовал?
Т.к. текст письма прямо в скрипте пишется, пробовал менять кодировку РНР скрипта (В Notepad++ перекодировать нажимал.) Не помогло.
 
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; // добавляем заголовок
 
В самом начале скрипта пустые переменные, это для примера.
А не могли вы вы выложить исправленный рабочий скрипт целиком. Надо скрипт сделать для отправки с помощью сокетов письмо, второй день не получается.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху