<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def read_response(self, timeout: NumType = None) -> SMTPResponse: """ Get a status reponse from the server. Returns an SMTPResponse namedtuple consisting of: - server response code (e.g. 250, or such, if all goes well) - server response string corresponding to response code (multiline responses are converted to a single, multiline string). """

        if self._stream_reader is None:
            raise SMTPServerDisconnected("Client not connected")

        code = None
        response_lines = []

        while True:
            async with self._io_lock:
                line = await self._readline(timeout=timeout)
            try:
                code = int(line[:3])
            except ValueError:
                pass

            message = line[4:].strip(b" \t\r\n").decode("utf-8", "surrogateescape")
            response_lines.append(message)

            if line[3:4] != b"-":
                break

        full_message = "\n".join(response_lines)

        if code is None:
            raise SMTPResponseException(
                SMTPStatus.invalid_response.value,
                "Malformed SMTP response: {}".format(full_message),
            )

        return SMTPResponse(code, full_message)