我使用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);
我正在连接同一台机器。这完全正常,我看到了电子邮件列表。但是,在页面的最底部,会显示一条通知:
注意:未知:无法连接到邮件服务器,993:第0行的未知连接被拒绝(errflg = 1)
当我使用我的域名或localhost(!)作为邮件服务器时,会显示此通知。当我使用我的IP地址或127.0.0.1时,一切正常。我从this question得到了这个想法。
我从机器本身对我的域名和localhost进行了nslookup。两者都返回正确的IP地址,但是,两者都表明它是一个非权威的答案'。
这里是/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也没问题。
我正在为IMAP服务器运行Ubuntu 14.04,PHP 5.5.9和Dovecot 2.2.9。
答案 0 :(得分:1)
当您的查找解析为IPv6地址但您的服务器未配置为支持IPv6时,可能会发生这种情况。客户端将首先尝试IPv6地址,然后在失败时尝试IPv4地址。
您可以通过从行中删除localhost
来检查是否属于这种情况:
::1 localhost ip6-localhost ip6-loopback
在hosts
文件中。
权威/非权威的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连接。