Probably a parsing bug in email.utils.parseaddr. How to recreate: >>> import email.utils >>> test = 'Subject: I am a bug [Random]\r\nFrom: someone <some@email.address>\r\n\r\n' >>> email.utils.parseaddr(test) ('', 'I') >>> email.utils.parseaddr(test.replace('[', '').replace(']','')) ('someone', 'some@email.address') Expected behaviour: no need to remove the []'s
parseaddr is for parsing the contents of an address header, not for parsing any additional text. So the correct way to call it is parseaddress('someone <some@email.address>'). In any case, please look in to the new email policies, which provide a much more convenient API: >>> from email import message_from_bytes >>> from email.policy import default >>> m = message_from_bytes(b'Subject: I am a bug [Random]\r\nFrom: someone <some@email.address>\r\n\r\n', policy=default) >>> m['from'] 'someone <some@email.address>' >>> m['from'].addresses (Address(display_name='someone', username='some', domain='email.address'),) >>> m['from'].addresses[0].display_name 'someone' >>> m['from'].addresses[0].username 'some' >>> m['from'].addresses[0].addr_spec 'some@email.address'
I do get this data from an IMAP fetch statement, see my code below: rv, data = imap.fetch(num, "(BODY[HEADER.FIELDS (FROM SUBJECT)])") if rv != 'OK': logging.error("Error getting message sender and subject (" + num.decode("ascii") + ")") return logging.info("Got message " + num.decode("ascii")) sender_subject = data[0][1].decode("utf-8") sender = email.utils.parseaddr(sender_subject.replace('[', '').replace(']',''))[1].replace("\r\n", "") Thank you for providing this new API though, I will make sure to switch to that.
Unfortunately the imap module in the stdlib doesn't provide a whole lot in the way of tools for parsing the imap data, just for sending it back and forth to the server.
History
Date
User
Action
Args
2022-04-11 14:58:54
admin
set
github: 76239
2017-11-17 14:15:34
r.david.murray
set
messages: +
2017-11-17 14:12:07
tom de wulf
set
messages: +
2017-11-17 14:07:11
r.david.murray
set
status: open -> closedresolution: not a bugmessages: + stage: resolved