'Retrieve a specific section of one or more messages
@type messages: C{MessageSet} or L{str}
@param messages: A message sequence set
@type uid: C{bool}
@param uid: Indicates whether the message sequence set is of message
numbers or of unique message IDs.
@type headerType: L{str}
@param headerType: If specified, must be one of HEADER,
HEADER.FIELDS, HEADER.FIELDS.NOT, MIME, or TEXT, and will determine
which part of the message is retrieved.  For HEADER.FIELDS and
HEADER.FIELDS.NOT, C{headerArgs} must be a sequence of header names.
For MIME, C{headerNumber} must be specified.
@type headerNumber: L{int} or L{int} sequence
@param headerNumber: The nested rfc822 index specifying the
entity to retrieve.  For example, C{1} retrieves the first
entity of the message, and C{(2, 1, 3}) retrieves the 3rd
entity inside the first entity inside the second entity of
the message.
@type headerArgs: A sequence of L{str}
@param headerArgs: If C{headerType} is HEADER.FIELDS, these are the
headers to retrieve.  If it is HEADER.FIELDS.NOT, these are the
headers to exclude from retrieval.
@type peek: C{bool}
@param peek: If true, cause the server to not set the \Seen
flag on this message as a result of this command.
@type offset: L{int}
@param offset: The number of octets at the beginning of the result
to skip.
@type length: L{int}
@param length: The number of octets to retrieve.
@rtype: C{Deferred}
@return: A deferred whose callback is invoked with a mapping of
message numbers to retrieved data, or whose errback is invoked
if there is an error.'

def fetchSpecific(self, messages, uid=0, headerType=None, headerNumber=None, headerArgs=None, peek=None, offset=None, length=None):

    if (headerNumber is None):
        number = ''
    elif isinstance(headerNumber, int):
        number = intToBytes(headerNumber)
    else:
        number = '.'.join([networkString(str(n)) for n in headerNumber])
    if (headerType is None):
        header = ''
    elif number:
        header = ('.' + headerType)
    else:
        assert isinstance(headerType, bytes), headerType
        header = headerType
    if (header and (headerType not in ('TEXT', 'MIME'))):
        if (headerArgs is not None):
            payload = (('    (' + '    '.join(headerArgs)) + ')')
        else:
            payload = '    ()'
    else:
        payload = ''
    if (offset is None):
        extra = ''
    else:
        extra = (((('<' + intToBytes(offset)) + '.') + intToBytes(length)) + '>')
    fetch = ((uid and 'UID    FETCH') or 'FETCH')
    cmd = ((((((((messages + '    BODY') + ((peek and '.PEEK') or '')) + '[') + number) + header) + payload) + ']') + extra)
    d = self.sendCommand(Command(fetch, cmd, wantResponse=('FETCH',)))
    d.addCallback(self._cbFetch, (), False)
    return d
