/** * Gets a line from the incoming stream and parses it. * * @param mixed $code Expected reply code(s) (integer or array). * @param string $error On error, 'logout' or 'reset'? * * @return array An array with the response text. * @throws Horde_Smtp_Exception */ protected function _getResponse($code, $error = null) { $text = array(); while ($read = $this->_connection->read()) { $read = trim(rtrim($read, "\r\n")); $replycode = intval(substr($read, 0, 3)); $text[] = ltrim(substr($read, 4)); if ($read[3] != '-') { break; } } if (!is_array($code)) { $code = array($code); } if (in_array($replycode, $code)) { return $text; } /* Check for enhanced status codes (RFC 2034). */ $details = reset($text); if (!is_null($this->_extensions) && $this->queryExtension('ENHANCEDSTATUSCODES')) { list($enhanced, $details) = explode(' ', $details, 2); } else { $enhanced = null; } $e = new Horde_Smtp_Exception($details); $e->details = $details; $e->setSmtpCode($replycode); $e->setEnhancedSmtpCode($enhanced); switch ($error) { case 'logout': $this->logout(); break; case 'reset': /* RFC 3207: If we see 530, no need to send reset command. */ if ($code != 530) { $this->resetCmd(); } break; } throw $e; }