PHP imap 仅适用于 IP 地址,不适用于域名 - DNS 问题?

PHP imap only works with IP address, not with domain name - DNS issue?

我正在使用 PHP 的 imap_* 函数显示一个简单的电子邮件列表:

$connection = "{mail-server:993/ssl/novalidate-cert}INBOX";
$imap = imap_open($connection, 'my-login', 'my-pass');
$check = imap_check($imap);
$overview = imap_fetch_overview($imap, "1:{$check->Nmsgs}", 0);
foreach ($overview as $msg) {
    echo "{$msg->msgno} ({$msg->date}), from {$msg->from}: {$msg->subject}\n";
}
imap_close($imap);

我正在连接到同一台机器。这工作得很好,我看到了电子邮件列表。但是,在页面的最底部,显示了一条通知:

Notice: Unknown: Can't connect to mail-server,993: Connection refused (errflg=1) in Unknown on line 0

当我使用我的域名或本地主机 (!) 作为邮件服务器时,会显示此通知。当我使用我的 IP 地址或 127.0.0.1 时,一切正常。我从 this question.

那里得到了这个想法

我从机器本身对我的域名和本地主机进行了 nslookup。两者都return正确的IP地址,然而,两者也显示是'Non-authoritative answer'。

这里是/etc/hosts的内容:

127.0.0.1   localhost
# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

我不明白 nslookup localhost 如何将 127.0.0.1 作为非权威答案给出(如果它在主机文件中)。


无论如何,PHP 发出此通知是因为 DNS 不具有权威性,我说得对吗?如果是这样,我该如何解决?如果没有,我该如何解决?

我没有遇到任何其他 DNS 问题。我可以使用它的域名从任何地方访问这台机器。另请注意,当我使用域名时,PHP 实际上 可以 连接 - 它也会发出通知。

此外,在使用相同连接的远程计算机上使用 thunderbird 也没有问题。

我是 运行 Ubuntu 14.04,PHP 5.5.9,IMAP 服务器是 Dovecot 2.2.9。

当您的查找解析为 IPv6 地址,但您的服务器未配置为支持 IPv6 时,可能会发生这种情况。客户端将首先尝试 IPv6 地址,然后在失败时尝试 IPv4 地址。

您可以通过从以下行中删除 localhost 来检查是否属于这种情况:

::1     localhost ip6-localhost ip6-loopback

在您的 hosts 文件中。

Authoritative/non-authoritative DNS 查询在这里没有区别。有关详细信息,请参阅 https://serverfault.com/q/413124/265582

你也可以让dovecot接受ipv6连接。如何做到这一点取决于您的配置。如果您有 inet_listener 个块,请确保 address 行包含 ::。例如:

inet_listener {
  address = *, ::
  port = 143
}
inet_listener {
  address = *, ::
  port = 993
  ssl = yes
}

如果您没有 inet_listener 块,请将 listen 指令更改为:

listen=[::]

在这两种情况下,这将使 dovecot 监听 ipv4 和 ipv6 连接。