php - 通过代理的PHP套接字连接

标签 php sockets proxy pop3

我正在构建一个类似于webmail-client的应用程序,并且在通过我们心爱的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");
}

而现在,我们的代理人并没有放过我。情况我想知道如何还原。

最佳答案

首先,您是否已使用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

希望这可以帮助。

关于php - 通过代理的PHP套接字连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5067210/

相关文章:

php - 将 javascript 文件置于用户身份验证之后的最佳实践?

c++ - OpenCV - 套接字接收到失真图像

c - FTP使用Socket编程

python - 使用代理扭曲 getpage

Android : Intercept network calls (HTTP, HTTPS 等..)源 self 的应用程序内的第 3 方库

php - Laravel:限制嵌套关系

php - 将 JSON 响应插入具有多个响应的 MySQL 表中

从 Linux 编译到 Windows

Python urlopen 连接中止 - urlopen 错误 [Errno 10053]

javascript - 使用 javascript 快速连接到数据库