【问题标题】:Getting response from SMTP server with PHP socket使用 PHP 套接字从 SMTP 服务器获取响应
【发布时间】:2017-09-13 15:43:30
【问题描述】:

我正在尝试使用 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);
}

我正在从 cli 运行脚本。

【问题讨论】:

    标签: php sockets stream smtp


    【解决方案1】:
                if (socket_recv($sock, $buf, 500, MSG_WAITALL) === FALSE) {
    

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

    【讨论】:

    • Steffen Ullrich:感谢您的帮助!我已将 flag 更改为 MSG_PEEK 并且能够得到一些(种类)响应。有什么困扰我,我不确定我是否收到完整的缓冲区,并且该值可能会有所不同?我不需要与 SMTP 通信,我只需要查看服务器对特定 IP 的回复。如果您查看更新的代码,我将不胜感激,并让我知道这是正确的方法。非常感谢!
    • @fugitive:我不知道你为什么不简单地打电话给socket_recv 没有任何标志。除此之外,为了确保您获得了解 SMTP 协议并相应地解析您收到的数据所需的一切。在最简单和最常见的情况下,您只会得到一行,但可能会有更多行。更多信息请参考the SMTP standard
    猜你喜欢
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2018-07-10
    • 2012-05-26
    • 2012-09-14
    • 1970-01-01
    相关资源
    最近更新 更多