2016-07-02 3 views
3
<?php 
set_time_limit(0); 
ignore_user_abort(true); 
ini_set('max_execution_time', 0); 


// 207.46.10.10:993 hotmail imap server 

$s = "\r\n"; 

$proxy = '13.89.36.103'; // proxy 
$port =53; 

$fp = fsockopen($proxy, $port); 
//socket_set_timeout($fp, 10, 0); 

fputs($fp, "CONNECT 207.46.10.10:993 HTTP/1.1".$s.$s); 
fputs($fp, "n1 login [email protected] userpassword".$s); 
fputs($fp, "n2 select Inbox".$s); 
fputs($fp, "n3 UID FETCH 100289 BODY[]".$s); 
fputs($fp, "n4 LOGOUT".$s.$s); 

while(!feof($fp)){ 
    $line = fgets($fp, 4000); 
    echo $line."\n"; 
} 
fclose($fp); 
?> 

Можно ли использовать соединение прокси для чтения почты с сервера IMAP с помощью РНРКак использовать IMAP с fsockopen за прокси

он отлично работает без прокси
пожалуйста, если кто-то может помогите мне, я не хочу использовать завиток

+0

После CONNECT вам нужно будет начать новый уровень связи SSL. Кроме того, вы используете HTTP-прокси на порту 53? – Max

+0

У вас также есть порт прокси, указанный дважды. – Max

+0

@Max это не мой прокси, это просто общедоступный прокси, вы можете дать более подробную информацию о ssl-слое после CONNECT, я уверен, что мне это не нужно, потому что я использую прокси-сервер, а не прямое подключение к серверу imap. –

ответ

0

HTTP-прокси обеспечивает немой трубку после использования глагола CONNECT. Поскольку вы подключаетесь к безопасной службе IMAP, вам необходимо включить SSL/TLS после установления соединения.

Для некоторых поисковых запросов, похоже, вы можете использовать stream_socket_enable_crypto после получения ответа от сервера PROXY 200. Очень вероятно, что вы должны прочитать ответ, прежде чем использовать stream_socket_enable_crypto, или он выкинет ошибку при чтении неожиданных данных.

+0

им так близко к решению знаю, что я тестирую stream_socket_enable_crypto, но я, кажется, не так просто, спасибо за вашу помощь, если я найду что-нибудь, что скажу вам –

0
<?php 
set_time_limit(0); 
ignore_user_abort(true); 
ini_set('max_execution_time', 0); 
$s = "\r\n"; 
$socket = stream_socket_client("tcp://61.19.250.51:3128", $errno, $errstr, 30); 

if($socket) { 
    echo "con"; 
    $buf = null; 

    fwrite($socket, "CONNECT imap-mail.outlook.com:993 HTTP/1.1\r\n"); 
    fwrite($socket, "Proxy-Connection: Keep-Alive\r\n\r\n"); 

    while (!feof($socket)) { 
     $buf .= fread($socket, 8190); 
    } 

    if(trim($buf)=="HTTP/1.1 200 Connection established"){ 
     echo $buf; 
     stream_set_blocking ($socket, true); 
     if(!stream_socket_enable_crypto ($socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)){ 
      echo "not changed to encrypted mode"; 
     } 
    } 
    fclose($socket); 

} 
?> 

это новый код, но с diffrent проблемой, когда я выбираю слишком адекватными для режима Ssl функция stream_socket_enable_crypto() всегда возвращает ложь я не знаю, почему

1
<?php 
set_time_limit(0); 
ignore_user_abort(true); 
ini_set('max_execution_time', 0); 
$s = "\r\n"; 
$socket = stream_socket_client("tcp://128.199.105.86:3128", $errno, $errstr, 30); 

if($socket) { 

    echo "con"; 
    $buf = null; 
    $buff = null; 

    fwrite($socket, "CONNECT imap-mail.outlook.com:993 HTTP/1.1\r\n"); 
    fwrite($socket,"Host: imap-mail.outlook.com:993\r\n"); 
    fwrite($socket, "Proxy-Connection: Keep-Alive\r\n\r\n"); 

    while(!feof($socket)){ 
    $buf .= fgets($socket, 4096); 
    if(preg_match('/^http/i', $buf)){ 

     break; 

    } 
} 

     $modes = array( 
    STREAM_CRYPTO_METHOD_TLS_CLIENT, 
    STREAM_CRYPTO_METHOD_SSLv3_CLIENT, 
    STREAM_CRYPTO_METHOD_SSLv23_CLIENT, 
    STREAM_CRYPTO_METHOD_SSLv2_CLIENT 
); 


$success = false; 
foreach($modes as $mode) { 
    $success = stream_socket_enable_crypto($socket, true, $mode); 
    if ($success) { 
     echo "done"; 
     break; 
    } 
} 

while(!feof($socket)){ 
    $buf .= fgets($socket, 4096); 
    if(preg_match('/^\* ok/i', $buf)){ 

     break; 

    } 
} 
echo $buf; 


    fclose($socket); 



} 
?> 

рабочая версия