【问题标题】:PHP imap only works with IP address, not with domain name - DNS issue?PHP imap 仅适用于 IP 地址,不适用于域名 - DNS 问题?
【发布时间】:2015-01-23 20:16:20
【问题描述】:

我正在使用 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 得到这个想法。


我从机器本身对我的域名和本地主机进行了 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 如何在 hosts 文件中给出 127.0.0.1 作为非权威答案。


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

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

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

我正在为 IMAP 服务器运行 Ubuntu 14.04、PHP 5.5.9 和 Dovecot 2.2.9。

【问题讨论】:

  • @JeremiahWinsley 谢谢,这有帮助:我现在也可以使用localhost 进行连接。但是,使用我的域名仍然不起作用。我应该在hosts文件中添加一条记录,因为它现在也使用ipv6地址吗?或者有没有办法将 dovecot 配置为使用 ipv6?我刚才用efod.se/blog/archive/2008/11/29/dovecot-postfix-ipv6 尝试过,但是没有帮助。我也应该发布我的鸽舍配置吗?
  • @JeremiahWinsley 对不起,纠正。使用我的配置在 dovecot 中启用 ipv6 应该使用 dovecot.org/list/dovecot-cvs/2009-August/014295.html 完成。我这样做了,现在它工作正常,当我取消注释主机文件中的行时也是如此。想写一个答案,让我表达我的感激之情? :)

标签: php email dns imap


【解决方案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 连接。

【讨论】:

  • "inet_listener, listen=" lines 去 dovecot.conf 对吧?
  • 我想我发现它是 /etc/dovecot/conf.d/10-master.conf
猜你喜欢
  • 2021-07-30
  • 2015-12-18
  • 2018-12-02
  • 1970-01-01
  • 2020-02-10
  • 2014-10-08
  • 2014-09-27
  • 1970-01-01
  • 2011-10-03
相关资源
最近更新 更多