3 votes

Comment utiliser imap avec fsockopen derrière un proxy ?

<?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 user@hotmail.com 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);
?>

Est-il possible d'utiliser une connexion proxy pour lire le courrier d'un serveur imap à l'aide de l'outil PHP

il fonctionne bien sans proxy
s'il vous plaît si quelqu'un peut m'aider je ne veux pas utiliser curl

2voto

aziz mouhoud Points 36
<?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);

}
?>

la version de travail

0voto

Max Points 3119

Le proxy HTTP fournit un pipe muet après l'utilisation de l'option CONNECT verbe. Comme vous vous connectez à un service IMAP sécurisé, vous devez activer SSL/TLS après l'établissement de la connexion.

En cherchant un peu, il semble que vous pouvez utiliser stream_socket_enable_crypto après avoir obtenu un 200 réponse du serveur PROXY. Il est très probable que vous deviez lire la réponse avant d'utiliser la fonction stream_socket_enable_crypto sinon, une erreur se produira lors de la lecture des données inattendues.

0voto

aziz mouhoud Points 36
<?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);

}
?>

C'est le nouveau code mais avec un problème différent lorsque je choisis de passer en mode ssl la fonction stream_socket_enable_crypto() retourne toujours false je ne sais pas pourquoi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X