2015-01-23 2 views
0

Я отображение простого списка сообщений электронной почты с использованием imap_* функции PHP:PHP imap работает только с IP-адресом, а не с доменным именем - проблема DNS?

$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: Соединение отклонено (errflg = 1) в Unknown в строке 0

Это уведомление отображается, когда я использую свое доменное имя или localhost (!) В качестве почтового сервера. Когда я использую свой IP-адрес или 127.0.0.1, все работает нормально. Я получил эту идею от this question.


Я сделал nslookup как для своего доменного имени, так и для localhost, из самой машины. Оба возвращают правильный 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 на удаленном компьютере с использованием того же соединения.

Я запускаю Ubuntu 14.04, PHP 5.5.9 и Dovecot 2.2.9 для сервера IMAP.

+0

@JeremiahWinsley спасибо, что помогает: теперь я могу подключиться с помощью 'localhost'. Однако использование моего доменного имени по-прежнему не работает. Должен ли я добавить запись в файл hosts, потому что теперь он также использует адрес ipv6? Или есть способ настроить dovecot для использования ipv6? Однако я попытался это сделать сейчас с http://efod.se/blog/archive/2008/11/29/dovecot-postfix-ipv6, но это не помогает. Должен ли я разместить мою конфигурацию договетов? – Keelan

+0

@JeremiahWinsley извините, исправление. Включение ipv6 в dovecot с моей конфигурацией должно быть выполнено с помощью http://www.dovecot.org/list/dovecot-cvs/2009-August/014295.html. Я сделал это, и теперь он отлично работает, когда я раскомментирую строку в файле hosts. Хотелось бы написать ответ, чтобы я мог выразить свою признательность? :) – Keelan

ответ

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=[::] 

В обоих случаях, это заставит голубятня слушать на обоих IPv4 и IPv6 соединения.