Как отловить ошибку бросаемую Imap
class PostReader
{
public function __construct(protected MailConfigInterface $mailConfig)
{
$this->resource = imap_open(
mailbox: $this->mailConfig->getImapAddress(),
user: $this->mailConfig->getUserName(),
password: $this->mailConfig->getPassword()
) ?: throw new MailRuntimeException(
message: "Ошибка подключения к: {$this->mailConfig->getImapAddress()}",
errorCode: MailRuntimeException::ERROR_CONNECTION,
imapLastError: imap_last_error()
);
}
}
При подключении к почте по imap, если я например заведомо задам не верны пароль от почты. Imap выдаст: imap_open(): Couldn't open stream {imap.yandex.ru:993/imap/ssl} и Unknown: Retrying PLAIN authentication after [AUTHENTICATIONFAILED] AUTHENTICATE invalid credentials or IMAP is disabled sc=q (errflg=1)
try {
$postMan = new PostReader($config);
} catch (Error $e) {
echo $e;
}
Игнорируя выброс моего кастомного исключения + у меня не получается в месте вызова через try \ catch отловить ту ошибку что бросает Imap через Throwable, Error, Exception. Если верить документации imap_open при возникновении ошибки должен вернуть False. Но этого не происходит. Собственно вопрос: как мне отловить ошибку от imap и заменить на свою? Ошибки и исключения от других методов ловит спокойно, проблема именно с imap_open()
Ответы (1 шт):
Все оказалось проще чем я думал. Меня спас один единственны символ "@":
public function __construct(protected MailConfigInterface $mailConfig)
{
error_reporting(error_level: 1); // моем случае что бы не светились notice
$this->resource = @imap_open( // @ подавляет ошибки метода
mailbox: $this->mailConfig->getImapAddress(),
user: $this->mailConfig->getUserName(),
password: $this->mailConfig->getPassword()
) ?: throw new MailRuntimeException(
message: "Ошибка подключения к: {$this->mailConfig->getImapAddress()}",
errorCode: MailRuntimeException::ERROR_CONNECTION,
imapLastError: imap_last_error()
);
}