Ошибка Warning: imap_open(): Couldn’t open stream

Ещё одна отрицательная особенность стандартной библиотеки функций в PHP для работы с почтовыми серверами — отсутствие удобной и адекватной работы с ошибками. Например, если указан не правильный логин или пароль, то библиотека просто выкидывает ошибку уровня warning:

Warning: imap_open(): Couldn't open stream {imap.mail.ru:993/imap/ssl}

И думай что хочешь, то ли что-то с сетью, почтовым сервером или ещё что. Чтобы получить детализацию, нужно вызвать функцию imap_last_error() которая вернёт адекватное сообщение о возникшей ошибке, например:

Can not authenticate to IMAP server: [AUTHENTICATIONFAILED] Authentication failed. Please verify your account by goin

Другое дело, так уже можно работать. Есть ещё интересная функция — imap_errors(), с помощью которой можно получить все произошедшие ошибки IMAP,  если они были с момента запроса текущей страницы или с момента последнего сброса стека ошибок. При этом в документации нет ни слова о том, как сбрасывать стек ошибок и что такое запрос текущей страницы. В случае неправильного логина или пароля будет возвращён подобный массив:

array(3) {
 [0] =>
 string(116) "Retrying PLAIN authentication after [AUTHENTICATIONFAILED] Authentication failed. Please verify your account by goin"
 [1] =>
 string(116) "Retrying PLAIN authentication after [AUTHENTICATIONFAILED] Authentication failed. Please verify your account by goin"
 [2] =>
 string(117) "Can not authenticate to IMAP server: [AUTHENTICATIONFAILED] Authentication failed. Please verify your account by goin"
}

Также есть функция imap_alerts() возвращающая все произошедшие предупредительные сообщения IMAP. Для данной ситуации функция вернёт false.