使用PHP从代理服务器后面使用fsockopen连接到SMTP服务器

时间:2011-02-01 12:48:04

标签: php proxy smtp fsockopen

我正在尝试从代理服务器后面连接到外部SMTP服务器。我想出了如何让fsockopen从代理后面获取一个网站,而不是如何连接到SMTP服务器。 SMTP服务器需要TLS连接以及用户名和密码身份验证。

我从代理服务器后面获取网页的代码如下:

<?
$proxy_fp = fsockopen('111.111.111.111', '80');

if (!$proxy_fp) {
    return false;
}

fputs($proxy_fp, "GET http://wwww.google.com HTTP/1.0\r\nHost: 111.111.111.111\r\n\r\n");
while (!feof($proxy_fp)) {
    $proxy_cont .= fread($proxy_fp, 4096);
}
fclose($proxy_fp);
$proxy_cont = substr($proxy_cont, strpos($proxy_cont, "\r\n\r\n") + 4);
return $proxy_cont;
?>

现在如何让代理连接到SMTP服务器?


---编辑---

<?
$s = "\r\n";

$proxy = '24.47.131.253';
$port = 8123;

$fp = fsockopen($proxy, $port);
socket_set_timeout($fp, 10, 0);

fputs($fp, "CONNECT smtp.domain.com:25 HTTP/1.0".$s.$s);

while(!feof($fp)){
    $line = fgets($fp, 4000);
    echo $line."\n";
}
fclose($fp);
?>

我现在根据答案得到这个。问题是我没有从SMTP服务器得到响应,只是打印空行。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

SMTP和HTTP不是相互兼容的协议;事实上,它们彼此完全不同。

您可以尝试使用HTTP CONNECT方法中的漏洞:而不是GET或POST,发送CONNECT yourserver:yourport HTTP/1.0 - 您应该获得到请求的主机和端口的TCP连接({{3更完整的参考)。请注意,某些代理会将允许的目标端口限制为443(HTTPS)或以其他方式检查CONNECT流量,以防止人们隧道连接到任何服务(例如SMTP)。

请注意,在大多数组织中,此类操作可能会被解释为“规避访问控制和/或安全策略”,因此请谨慎行事。

相关问题