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 连接。
我正在使用 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 连接。