使用 PHP 代理通过 fsockopen 连接到 SMTP 服务器

发布于 2024-10-15 01:31:31 字数 951 浏览 6 评论 0原文

我正在尝试从代理后面连接到外部 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 服务器的响应,它只打印空行。有人能指出我正确的方向吗?

I'm trying to connect to a external SMTP server from behind a proxy. I figured out how to let fsockopen get a website from behind a proxy, but not how to connect to a SMTP server. The SMTP server requires a TLS connection and username and password authentication.

What I have for getting a webpage from behind a proxy is the following code.

<?
$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;
?>

Now how do I let the proxy connect to the SMTP server?

--- EDIT ---

<?
$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);
?>

I now have this based on the answers. The problem is that I don't get a response from the SMTP server, it just prints empty lines. Could someone point me in the right direction?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

冷…雨湿花 2024-10-22 01:31:31

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

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

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

SMTP and HTTP aren't mutually compatible protocols; in fact, they are completely different from each other.

What you could try is to use a loophole in the HTTP CONNECT method: instead of GET or POST, send CONNECT yourserver:yourport HTTP/1.0 - you should get a TCP connection to the requested host and port (see this for a more complete reference). Note that some proxies will limit the allowed destination port to 443 (HTTPS) or otherwise inspect the CONNECT traffic, to prevent people from tunneling to any service (e.g. SMTP).

Note that in most organizations, such actions might be interpreted as "circumventing access controls and/or security policy", so proceed with caution.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文