PHP Socket соединение через прокси - PullRequest
1 голос
/ 21 февраля 2011

Я создаю приложение, подобное клиенту веб-почты, и у меня возникают проблемы с подключением к POP3 через наш любимый прокси-сервер corp.

Из-за требований клиента я обязан использовать сокеты для связи со своим сервером 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");
}

И сейчаснаш прокси не выпускает меня;Ситуация, которую я хотел бы знать, как вернуться.

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Во-первых, проверили ли вы 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

PASS mypassword

+OK 

STAT

+OK 0 0

Надеюсь, это поможет.

0 голосов
/ 09 апреля 2015

Используйте это для клиента 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

Они все работают на меня

...