Поэтому у меня есть небольшая проблема с PHP-скриптом, который я сейчас пишу. Для начала позвольте мне сказать, что сценарий должен подключаться к почтовому ящику IMAP, искать некоторые электронные письма и загружать их вложения. Все это уже закодировано и работает с моей учетной записью gmail. Проблема возникает, когда я пытаюсь подключиться к серверу обмена. Выдержка короткого кода:
$mbox = imap_open($host, $login, $password); echo '<br/>' . imap_last_error() . '<br/>'; $emails = imap_search($mbox, 'FROM "patate@patate.com"', SE_UID);
Я пробовал две основные $ host "версии" (с и без SSL):
1 – {server: 993 / imap / ssl / novalidate-cert} INBOX 2 – {сервер: 143 / imap / novalidate-cert} INBOX
Novimateate-cert заключает в себе ошибку сертификата. Я также пробовал параметры «notsl», для обоих из них, без каких-либо заметных результатов. Ошибка, которую я получаю, – это прекрасное сообщение, абсолютно не загадочное, форма или форма:
[CLOSED] IMAP connection broken (server response)
Кроме того, я также получаю эти уведомления:
Notice: Unknown: Unknown GSSAPI failure: An invalid name was supplied (errflg=1) in Unknown on line 0 Notice: Unknown: GSSAPI mechanism status: Hostname cannot be canonicalized (errflg=1) in Unknown on line 0 Notice: Unknown: Retrying PLAIN authentication after AUTHENTICATE failed. (errflg=1) in Unknown on line 0 Notice: Unknown: Retrying PLAIN authentication after AUTHENTICATE failed. (errflg=1) in Unknown on line 0 Notice: Unknown: Can not authenticate to IMAP server: AUTHENTICATE failed. (errflg=2) in Unknown on line 0 Notice: Unknown: [CLOSED] IMAP connection broken (server response) (errflg=1) in Unknown on line 0
Первые два особенно меня озадачили … Я попробовал этот скрипт на другом сервере, чтобы убедиться, что проблема не связана с моей локальной сетью. После многоголоса, я только получил это: http://www.phpfreaks.com/forums/index.php?topic=190628.0, который кажется несколько громоздким исправлением.
Есть идеи?
У меня такая же проблема, похоже, что ошибки генерируются, потому что сервер Exchange рекламирует протоколы аутентификации, которые он не поддерживает ( http://vision.eng.shu.ac.uk/mmvlwiki/index.php/Exchange ). Также кажется, что эта проблема изолирована от Linux-серверов, поскольку у меня нет проблем с тем же кодом в окне Windows. Это была давняя проблема, и PHP был недавно исправлен (v 5.3.2), чтобы вы могли отключить определенные протоколы аутентификации ( http://php.net/manual/en/function.imap-open.php ). Нижеприведенный код работает с перерывами для меня:
$this->inbox = imap_open("{server:993/imap/ssl/novalidate-cert}$inbox", $username, $password, NULL, 1, array('DISABLE_AUTHENTICATOR' => 'PLAIN')) or die(var_dump(imap_errors()));
Это также работает с перерывами:
$this->inbox = imap_open("{server:993/imap/ssl/novalidate-cert}$inbox", $username, $password, NULL, 1, array('DISABLE_AUTHENTICATOR' => 'GSSAPI')) or die(var_dump(imap_errors()));
Так что я гетто сфальсифицировал это, похоже, он работает … хотя у него есть потенциал для бесконечной атаки цикла / DOS на сервере обмена моей компании, но / помощи
Надеемся, что есть лучшее решение, но это должно помочь:
$tryCnt = 0; while(!is_resource($this->inbox)){ $this->inbox = imap_open("{server.com:993/imap/ssl/novalidate-cert}$inbox", $username, $password, NULL, 1, array('DISABLE_AUTHENTICATOR' => 'GSSAPI')); $tryCnt ++; if(!is_resource($this->inbox)){ $this->inbox = imap_open("{server.com:993/imap/ssl/novalidate-cert}$inbox", $username, $password, NULL, 1, array('DISABLE_AUTHENTICATOR' => 'PLAIN')); $tryCnt ++; } if($tryCnt > 20){ echo "Cannot Connect To Exchange Server:<BR>"; die(var_dump(imap_errors())); } }
в$tryCnt = 0; while(!is_resource($this->inbox)){ $this->inbox = imap_open("{server.com:993/imap/ssl/novalidate-cert}$inbox", $username, $password, NULL, 1, array('DISABLE_AUTHENTICATOR' => 'GSSAPI')); $tryCnt ++; if(!is_resource($this->inbox)){ $this->inbox = imap_open("{server.com:993/imap/ssl/novalidate-cert}$inbox", $username, $password, NULL, 1, array('DISABLE_AUTHENTICATOR' => 'PLAIN')); $tryCnt ++; } if($tryCnt > 20){ echo "Cannot Connect To Exchange Server:<BR>"; die(var_dump(imap_errors())); } }
У меня есть PHP-скрипт, который подключается к почтовому серверу OWA и возвращает содержимое электронной почты с помощью функции imap_open PHP. Используя этот контент, он создает страницу в экземпляре MindTouch.
Весь этот код работает правильно, но скрипт сообщал об ошибках сбоя GSSAPI, показанных выше. На моей странице веб-результатов был получен (правильно) отчет, но на странице также были отображены сообщения об ошибках GSSAPI.
То, что я обнаружил в своем коде, было то, что я error_reporting(E_ALL)
. Когда я изменил уровень отчетности, сообщение об ошибке исчезло.
Я знаю, что ошибка все еще существует, и я не знаю, почему. Но, поскольку весь мой код работает правильно, я просто хотел, чтобы сообщение об ошибке исчезло, потому что это путало моих пользователей.
Изменение уровня отчетности до более низкого уровня позаботилось об этом.