使用PHP套接字从SMTP服务器获取响应

使用PHP套接字从SMTP服务器获取响应,php,sockets,stream,smtp,Php,Sockets,Stream,Smtp,我正在尝试使用PHP连接两个smtp主机(yahoo、mail、gmail等),并检查响应 更准确地说,绑定的IP超时来自特定主机 注意,我没有检查主IP是否能够访问SMTP主机,我需要检查接口上是否绑定了IP 我可以连接到套接字并绑定IP,但没有得到任何输出。 这是我的代码: <?php function error() { $strerr = socket_last_error(); $strmsg = socket_strerror($strerr); r

我正在尝试使用PHP连接两个smtp主机(yahoo、mail、gmail等),并检查响应

更准确地说,绑定的IP超时来自特定主机

注意,我没有检查主IP是否能够访问SMTP主机,我需要检查接口上是否绑定了IP

我可以连接到套接字并绑定IP,但没有得到任何输出。 这是我的代码:

<?php


function error() {
    $strerr = socket_last_error();
    $strmsg = socket_strerror($strerr);
    return $strmsg;
}

$ip = $argv[1];
$port = 25;
$hosts = array(
    "smtp.gmail.com",
    "mailin-01.mx.aol.com",
    "mx2.hotmail.com",
    "mta7.am0.yahoodns.net"
);
$host = "smtp.gmail.com";

   foreach ($hosts as $key) {
    if (!($sock = socket_create(AF_INET, SOCK_STREAM, 0))) {
        echo error();
    }
    if (!socket_bind($sock, $ip)) {
        echo "Unable to bind to specific IP.";
    }

    //Check can we connect to the socket
    if (!socket_connect($sock, $key, $port)) {
        echo error() . "\n";
    }
    else {

        if (socket_recv($sock, $buf, 150, MSG_PEEK) === FALSE) {
            echo error() . "\n";
        }
        echo $buf;

    }
    socket_shutdown($sock);
    socket_close($sock);
}

您正在等待服务器发送500字节。如果来自服务器的欢迎消息较短,您仍然需要等待500字节,因为您已显式设置了
MSG_WAITALL
。但是服务器不会发送更多数据,也不会关闭连接(这也会使recv返回),因为它正在等待客户端继续SMTP对话框。这意味着你被困在这条线上


您正在等待服务器发送500字节。如果来自服务器的欢迎消息较短,您仍然需要等待500字节,因为您已显式设置了
MSG_WAITALL
。但是服务器不会发送更多数据,也不会关闭连接(这也会使recv返回),因为它正在等待客户端继续SMTP对话框。这意味着您被困在这条线上。

Steffen Ullrich:谢谢您的帮助!我已经将标志改为
MSG_PEEK
,并且能够得到一些(某种)响应。有什么困扰我的,我不确定我是否收到了完整的缓冲区,并且该值可能会发生变化?我不需要与SMTP通信,我只需要查看来自特定IP服务器的回复。如果你看一下更新的代码,让我知道这是正确的方法,我将不胜感激。非常感谢@逃犯:我不知道你为什么不直接调用没有任何标志的
socket\u recv
。除此之外,要确保您获得了理解SMTP协议并相应地解析接收到的数据所需的一切。在最简单和最常见的情况下,您只得到一行,但可能会有更多行。有关更多信息,请参阅。Steffen Ullrich:谢谢您的帮助!我已经将标志改为
MSG_PEEK
,并且能够得到一些(某种)响应。有什么困扰我的,我不确定我是否收到了完整的缓冲区,并且该值可能会发生变化?我不需要与SMTP通信,我只需要查看来自特定IP服务器的回复。如果你看一下更新的代码,让我知道这是正确的方法,我将不胜感激。非常感谢@逃犯:我不知道你为什么不直接调用没有任何标志的
socket\u recv
。除此之外,要确保您获得了理解SMTP协议并相应地解析接收到的数据所需的一切。在最简单和最常见的情况下,您只得到一行,但可能会有更多行。有关更多信息,请参阅。
            if (socket_recv($sock, $buf, 500, MSG_WAITALL) === FALSE) {