diff -r a82d7e028458 Doc/library/poplib.rst --- a/Doc/library/poplib.rst Mon Jun 16 19:26:56 2014 -0400 +++ b/Doc/library/poplib.rst Wed Jul 02 03:23:54 2014 +0200 @@ -194,6 +194,15 @@ the unique id for that message in the form ``'response mesgnum uid``, otherwise result is list ``(response, ['mesgnum uid', ...], octets)``. + +.. method:: POP3.utf8() + + Try to switch to UTF-8 mode. Returns the server response if sucessful, + raises :class:`error_proto` if not. Specified in :RFC:`6856`. + + .. versionadded:: 3.5 + + .. method:: POP3.stls(context=None) Start a TLS session on the active connection as specified in :rfc:`2595`. diff -r a82d7e028458 Lib/poplib.py --- a/Lib/poplib.py Mon Jun 16 19:26:56 2014 -0400 +++ b/Lib/poplib.py Wed Jul 02 03:23:54 2014 +0200 @@ -71,6 +71,7 @@ UIDL [msg] uidl(msg = None) CAPA capa() STLS stls() + UTF8 utf8() Raises one exception: 'error_proto'. @@ -343,6 +344,12 @@ return self._longcmd('UIDL') + def utf8(self): + """Try to enter UTF-8 mode (see RFC 6856). Returns server response. + """ + return self._shortcmd('UTF8') + + def capa(self): """Return server capabilities (RFC 2449) as a dictionary >>> c=poplib.POP3('localhost') diff -r a82d7e028458 Lib/test/test_poplib.py --- a/Lib/test/test_poplib.py Mon Jun 16 19:26:56 2014 -0400 +++ b/Lib/test/test_poplib.py Wed Jul 02 03:23:54 2014 +0200 @@ -47,6 +47,7 @@ class DummyPOP3Handler(asynchat.async_chat): CAPAS = {'UIDL': [], 'IMPLEMENTATION': ['python-testlib-pop-server']} + enable_UTF8 = False def __init__(self, conn): asynchat.async_chat.__init__(self, conn) @@ -145,6 +146,11 @@ self.push(' '.join(_ln)) self.push('.') + def cmd_utf8(self, arg): + self.push('+OK I know RFC6856' + if self.enable_UTF8 + else '-ERR What is UTF8?!') + if SUPPORTS_SSL: def cmd_stls(self, arg): @@ -312,6 +318,16 @@ self.client.uidl() self.client.uidl('foo') + def test_utf8_raises_if_unsupported(self): + self.server.handler.enable_UTF8 = False + self.assertRaises(poplib.error_proto, self.client.utf8) + + def test_utf8(self): + self.server.handler.enable_UTF8 = True + expected = b'+OK I know RFC6856' + result = self.client.utf8() + self.assertEqual(result, expected) + def test_capa(self): capa = self.client.capa() self.assertTrue('IMPLEMENTATION' in capa.keys())