【问题标题】:How to use imap with fsockopen behind proxy如何在代理后面使用 imap 和 fsockopen
【发布时间】:2016-11-04 12:28:12
【问题描述】:
<?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);
?>

是否可以使用代理连接从使用 PHP 的 imap 服务器读取邮件

没有代理也能正常工作
请如果有人可以帮助我,我不想使用 curl

【问题讨论】:

  • 您需要在 CONNECT 之后启动一个新的 SSL 通信层。另外,您是否在端口 53 上运行 HTTP 代理?
  • 您似乎还指定了两次代理端口。
  • @Max 这不是我的代理它只是公共代理,您可以在 CONNECT 之后提供有关 ssl 层的更多详细信息,我确定我不需要它,因为我使用代理而不是直接连接到 imap 服务器
  • 端口 993 是安全 imap:代理不会为您提供安全保护。在您发送 connect 和 200 响应后,您需要自己协商 SSL。顺便说一句,这就是 https 在代理上的工作方式:这是代理无法窥探您的数据。
  • @Max 我认为你是对的我在 smtp 服务器中测试它,它工作得很好,问题是 imap 连接中的 ssl 层我应该弄清楚如何让代理做 ssl 连接到 imap 服务器。

标签: php login proxy imap fsockopen


【解决方案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);



}
?>

工作版本

【讨论】:

    【解决方案2】:

    HTTP 代理在使用 CONNECT 动词后提供了一个哑管道。由于您要连接到安全的 IMAP 服务,因此您需要在建立连接后启用 SSL/TLS。

    对于一些搜索,看起来您可以在收到来自 PROXY 服务器的 200 响应后使用 stream_socket_enable_crypto。很有可能你必须在使用stream_socket_enable_crypto之前阅读响应,否则它会在读取意外数据时抛出错误。

    【讨论】:

    猜你喜欢
    • 2011-06-19
    • 2018-08-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    相关资源
    最近更新 更多