Skip to content

Commit d232944

Browse files
[3.13] pythongh-78319: Fix implementation of IMAP APPEND UTF8 (pythonGH-9436) (pythonGH-139407)
pythongh-78319: Fix implementation of IMAP APPEND UTF8 (pythonGH-9436) Make UTF8 support for the IMAP APPEND command RFC 6855 compliant. (cherry picked from commit 408154d) Co-authored-by: Gordon Messmer <[email protected]>
1 parent a461f25 commit d232944

File tree

3 files changed

+26
-12
lines changed

3 files changed

+26
-12
lines changed

Lib/imaplib.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -420,8 +420,6 @@ def append(self, mailbox, flags, date_time, message):
420420
else:
421421
date_time = None
422422
literal = MapCRLF.sub(CRLF, message)
423-
if self.utf8_enabled:
424-
literal = b'UTF8 (' + literal + b')'
425423
self.literal = literal
426424
return self._simple_command(name, mailbox, flags, date_time)
427425

@@ -1011,7 +1009,11 @@ def _command(self, name, *args):
10111009
literator = literal
10121010
else:
10131011
literator = None
1014-
data = data + bytes(' {%s}' % len(literal), self._encoding)
1012+
if self.utf8_enabled:
1013+
data = data + bytes(' UTF8 (~{%s}' % len(literal), self._encoding)
1014+
literal = literal + b')'
1015+
else:
1016+
data = data + bytes(' {%s}' % len(literal), self._encoding)
10151017

10161018
if __debug__:
10171019
if self.debug >= 4:

Lib/test/test_imaplib.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,11 @@ def cmd_AUTHENTICATE(self, tag, args):
325325
self._send_tagged(tag, 'OK', 'FAKEAUTH successful')
326326
def cmd_APPEND(self, tag, args):
327327
self._send_textline('+')
328-
self.server.response = yield
328+
self.server.response = args
329+
literal = yield
330+
self.server.response.append(literal)
331+
literal = yield
332+
self.server.response.append(literal)
329333
self._send_tagged(tag, 'OK', 'okay')
330334
client, server = self._setup(UTF8AppendServer)
331335
self.assertEqual(client._encoding, 'ascii')
@@ -336,10 +340,13 @@ def cmd_APPEND(self, tag, args):
336340
self.assertEqual(code, 'OK')
337341
self.assertEqual(client._encoding, 'utf-8')
338342
msg_string = 'Subject: üñí©öðé'
339-
typ, data = client.append(None, None, None, msg_string.encode('utf-8'))
343+
typ, data = client.append(
344+
None, None, None, (msg_string + '\n').encode('utf-8'))
340345
self.assertEqual(typ, 'OK')
341346
self.assertEqual(server.response,
342-
('UTF8 (%s)\r\n' % msg_string).encode('utf-8'))
347+
['INBOX', 'UTF8',
348+
'(~{25}', ('%s\r\n' % msg_string).encode('utf-8'),
349+
b')\r\n' ])
343350

344351
def test_search_disallows_charset_in_utf8_mode(self):
345352
class UTF8Server(SimpleIMAPHandler):
@@ -764,7 +771,11 @@ def test_enable_UTF8_True_append(self):
764771
class UTF8AppendServer(self.UTF8Server):
765772
def cmd_APPEND(self, tag, args):
766773
self._send_textline('+')
767-
self.server.response = yield
774+
self.server.response = args
775+
literal = yield
776+
self.server.response.append(literal)
777+
literal = yield
778+
self.server.response.append(literal)
768779
self._send_tagged(tag, 'OK', 'okay')
769780

770781
with self.reaped_pair(UTF8AppendServer) as (server, client):
@@ -778,12 +789,12 @@ def cmd_APPEND(self, tag, args):
778789
self.assertEqual(client._encoding, 'utf-8')
779790
msg_string = 'Subject: üñí©öðé'
780791
typ, data = client.append(
781-
None, None, None, msg_string.encode('utf-8'))
792+
None, None, None, (msg_string + '\n').encode('utf-8'))
782793
self.assertEqual(typ, 'OK')
783-
self.assertEqual(
784-
server.response,
785-
('UTF8 (%s)\r\n' % msg_string).encode('utf-8')
786-
)
794+
self.assertEqual(server.response,
795+
['INBOX', 'UTF8',
796+
'(~{25}', ('%s\r\n' % msg_string).encode('utf-8'),
797+
b')\r\n' ])
787798

788799
# XXX also need a test that makes sure that the Literal and Untagged_status
789800
# regexes uses unicode in UTF8 mode instead of the default ASCII.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
UTF8 support for the IMAP APPEND command has been made RFC compliant.

0 commit comments

Comments
 (0)