'Send a RETR or TOP command to retrieve all or part of a message from
the server.
@type index: L{int}
@param index: A 0-based message index.
@type consumer: L{None} or callable that takes
L{bytes}
@param consumer: A function which consumes each transformed line from a
multi-line response as it is received.
@type lines: L{None} or L{int}
@param lines: If specified, the number of lines of the message to be
retrieved.  Otherwise, the entire message is retrieved.
@rtype: L{Deferred <defer.Deferred>} which fires with L{list} of
L{bytes}, or callable that takes 2-L{tuple} of (0) L{int},
(1) L{object}
@return: A deferred which fires when the entire response has been
received.  When a consumer is not provided, the return value is a
list of the transformed lines.  Otherwise, it returns the consumer
itself.'

def retrieve(self, index, consumer=None, lines=None):

    idx = str((index + 1))
    if (lines is None):
        return self._consumeOrAppend('RETR', idx, consumer, _dotUnquoter)
    return self._consumeOrAppend('TOP', ('%s    %d' % (idx, lines)), consumer, _dotUnquoter)
