'Initiates a \'STARTTLS\' request and negotiates the TLS / SSL
Handshake.
@param contextFactory: The TLS / SSL Context Factory to
leverage.  If the contextFactory is None the IMAP4Client will
either use the current TLS / SSL Context Factory or attempt to
create a new one.
@type contextFactory: C{ssl.ClientContextFactory}
@return: A Deferred which fires when the transport has been
secured according to the given contextFactory, or which fails
if the transport cannot be secured.'

def startTLS(self, contextFactory=None):

    assert (not self.startedTLS), 'Client    and    Server    are    currently    communicating    via    TLS'
    if (contextFactory is None):
        contextFactory = self._getContextFactory()
    if (contextFactory is None):
        return defer.fail(IMAP4Exception('IMAP4Client    requires    a    TLS    context    to    initiate    the    STARTTLS    handshake'))
    if ('STARTTLS' not in self._capCache):
        return defer.fail(IMAP4Exception('Server    does    not    support    secure    communication    via    TLS    /    SSL'))
    tls = interfaces.ITLSTransport(self.transport, None)
    if (tls is None):
        return defer.fail(IMAP4Exception('IMAP4Client    transport    does    not    implement    interfaces.ITLSTransport'))
    d = self.sendCommand(Command('STARTTLS'))
    d.addCallback(self._startedTLS, contextFactory)
    d.addCallback((lambda _: self.getCapabilities()))
    return d
