我正在构建一个类似Webmail客户端的应用程序,我遇到了通过我们心爱的公司代理连接到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");
}
现在我们的代理人不让我出局;情况我想知道如何恢复。
答案 0 :(得分: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()行 - 但我现在无法测试。
正如我所说,在你做 ANYTHING 之前,确认它在Telnet上都能正常工作。
如果是,请监控服务器日志(如果可能),看看您是否正在接触POP3服务器及其获取的内容。
以下是一个示例序列:
telnet pop.blah.com 110
+OK Welcome to MailEnable POP3 Server
USER matthew
+OK
通过mypassword
+OK
STAT
+OK 0 0
希望这有帮助。
答案 1 :(得分:0)
将此用于客户端 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
他们都为我工作