【问题标题】:PHP Socket connection through proxyPHP Socket 通过代理连接
【发布时间】:2011-02-21 14:35:31
【问题描述】:

我正在构建一个类似 webmail 客户端的应用程序,但在通过我们心爱的 corp 代理连接到 POP3 时遇到问题。

由于客户的要求,我有义务使用套接字与他们的 POP3 服务器通信(他们主动指定这是强制性的,他们还解释说他们在应用服务器和 POP 之间有一个代理)所以除了让我能够工作这是我唯一的选择。

有人知道怎么做吗?

更新添加:

这是我的套接字处理程序:

<?php
class Socket {
  protected $handle = null;
  protected static $status = null;
  public function __construct($server, $port){
    if(!$this->connect($server, $port)){
      throw new UnexpectedValueException("Server $server in port $port unreachable.");
    }
  }
  public static function getStatus(){
    return self::$status;
  }  
  public function write($string){
    fputs($this->handle, $string);
    return $this;
  }
  public function read($lines = 1){
    $lines = abs((int)$lines);//people can be morons
    for($i = 0; $i < $lines; $i++){
      $response []= $this->getLine();
    }
    if($lines==1){
      $response = $response[0];
    }
    return $response;
  }
  public function connect($server, $port){
    $errNo = 0;
    $handle = fsockopen($server, $port);
    if(!$handle){
      return false;
    }
    $this->handle = $handle;
    return $this;
  }
  public function disconnect(){
    if(gettype($this->handle)=='resource'){
      fclose($this->handle);
    }
  }
  public function __destruct(){
    $this->disconnect();
  }
  protected function getLine(){
    return fgets($this->handle);
  }
}

我是这样使用它的:

$plug = new Socket('mx.mailserver.com',110);
$plug->write("USER $username\n")->read();
$could = $plug->write("PASS $password\n")->read();
if(strpos($could,'+OK')!==false){
  $mails = $plug->write("STAT\n");
}

现在我们的代理不让我出去;我想知道如何恢复。

【问题讨论】:

  • 你到底尝试了什么?尝试发布您的代码。你到底有什么问题?

标签: php sockets proxy pop3


【解决方案1】:

首先,您是否使用 telnet 进行了测试 - 即,如果您在运行 PHP 脚本的同一服务器/工作站上,并且您发出:

telnet mx.mailserver.com 110

你收到问候了吗? (您也没有阅读该内容 - 因此您从发送用户名的命令中读取的内容将作为响应获得,因此您的代码可以正常工作,但主要是偶然的。

如果您无法通过 telnet 使其工作,请先停止并使其正常工作 - 否则没有意义。

您可能需要在每个命令的末尾发送 \r\n。

$plug->write("USER $username\r\n")->read();

所以你需要做类似的事情:

$plug = new Socket('mx.mailserver.com',110);
$greeting = $plug->read(); // check this said +OK
$plug->write("USER $username\r\n")->read(); // check this said +OK
$could = $plug->write("PASS $password\r\n")->read();
if(strpos($could,'+OK')!==false) {
    $mails = $plug->write("STAT\r\n");
}

我不完全确定您的 strpos() 行 - 但我现在无法测试。

正如我所说,在您执行任何操作之前,请先确认在 Telnet 上一切正常。

如果是,则监控服务器日志(如果可能)并查看您是否与 POP3 服务器取得联系以及它正在取得什么。

这是一个示例序列:

telnet pop.blah.com 110

+OK Welcome to MailEnable POP3 Server

用户马修

+OK

通过我的密码

+OK 

统计

+OK 0 0

希望这会有所帮助。

【讨论】:

  • 我找到了问题的根源;最后发生的事情是我们的公司代理没有做 SOCKS 代理。所以我得到的只是连接超时。不过感谢您的洞察力!
【解决方案2】:

将此用于客户端 https://github.com/clue/php-socks

将此用于代理服务器 https://github.com/clue/psocksd

如果您的服务器有多个公共 IP,并且您需要这些 IP 作为代理传出,请将其用于代理服务器 https://www.inet.no/dante/

将代理配置为具有多个传出 ip 的指南:http://www.inet.no/dante/doc/faq.html#multiple_external_ips

具有多个传出 ip 的示例配置:http://wiki.jokeru.ro/dante-socks-server

他们都为我工作

【讨论】:

    猜你喜欢
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2014-04-11
    • 2010-12-28
    • 1970-01-01
    相关资源
    最近更新 更多