diff -r 119af59911a0 Lib/email/message.py --- a/Lib/email/message.py Mon Sep 05 11:43:18 2016 -0700 +++ b/Lib/email/message.py Tue Sep 06 21:55:13 2016 -0400 @@ -1022,7 +1022,7 @@ maintype, subtype = self.get_content_type().split('/') if maintype != 'multipart' or subtype == 'alternative': return - parts = self.get_payload() + parts = self.get_payload().copy() if maintype == 'multipart' and subtype == 'related': # For related, we treat everything but the root as an attachment. # The root may be indicated by 'start'; if there's no start or we diff -r 119af59911a0 Lib/test/test_email/test_message.py --- a/Lib/test/test_email/test_message.py Mon Sep 05 11:43:18 2016 -0700 +++ b/Lib/test/test_email/test_message.py Tue Sep 06 21:55:13 2016 -0400 @@ -732,6 +732,16 @@ m.set_param('filename', 'abc.png', 'Content-Disposition') self.assertTrue(m.is_attachment()) + def test_iter_attachments_mutation(self): + # We had a bug where iter_attachments was mutating the list. + m = self._make_message() + m.set_content('arbitrary text as main part') + m.add_related('more text as a related part') + m.add_related('yet more text as a second "attachment"') + orig = m.get_payload().copy() + self.assertEqual(len(list(m.iter_attachments())), 2) + self.assertEqual(m.get_payload(), orig) + class TestEmailMessage(TestEmailMessageBase, TestEmailBase): message = EmailMessage