*/ final class LogoutCommand implements CommandInterface { public function name(): string { return 'LOGOUT'; } public function allowedStates(): array { return [ SessionState::NotAuthenticated, SessionState::Authenticated, SessionState::Selected, ]; } public function encode(string $tag, SessionContext $context): RequestFrame { unset($tag, $context); return new RequestFrame('LOGOUT'); } public function handle(ResponseStream $responses, SessionContext $context): CommandStatusResult { foreach ($responses as $response) { if ($response instanceof TaggedResponse) { if (!$response->isOk()) { throw new ImapException('LOGOUT failed: ' . $response->text()); } $context->setSelectedMailbox(null); $context->setState(SessionState::Logout); $context->connection()->disconnect(); return new CommandStatusResult($response->status(), $response->text()); } } throw new ImapException('LOGOUT did not receive a tagged completion response.'); } }