Sysop: | Amessyroom |
---|---|
Location: | Fayetteville, NC |
Users: | 28 |
Nodes: | 6 (0 / 6) |
Uptime: | 47:27:56 |
Calls: | 422 |
Files: | 1,024 |
Messages: | 90,391 |
From: =?utf-8?B?U8OpYmFzdGllbiBDcmlnbm9u?= <sebastien.crignon@amvs.fr>
I have a Python script that filters my incoming E-Mail. It has been
working OK (with various updates and improvements) for many years.
I now have a minor new problem when handling E-Mail with a From: that
has accented characters in it:-
From: Sébastien Crignon <sebastien.crignon@amvs.fr>
I use Python mailbox to parse the message:-
import mailbox
...
...
msg = mailbox.MaildirMessage(sys.stdin.buffer.read())
Then various mailbox methods to get headers etc.
I use the following to get the From: address:-
str(msg.get('from', "unknown").lower()
The result has the part with the accented character wrapped as follows:-
From: =?utf-8?B?U8OpYmFzdGllbiBDcmlnbm9u?= <sebastien.crignon@amvs.fr>
I know I have hit this issue before but I can't rememeber the fix. The problem I have now is that searching the above doesn't work as
expected. Basically I just need to get rid of the ?utf-8? wrapped bit altogether as I'm only interested in the 'real' address. How can I
easily remove the UTF8 section in a way that will work whether or not
it's there?
print(final_string)# From: Sébastien Crignon <sebastien.crignon@amvs.fr>Is there a simple[r] way to extract just the 'real' address between
the <>, that's all I actually need. I think it has the be the last
chunk of the From: doesn't it?
Chris Green <cl@isbd.net> wrote or quoted:
From: =?utf-8?B?U8OpYmFzdGllbiBDcmlnbm9u?= <sebastien.crignon@amvs.fr>
In Python, when you roll with decode_header from the email.header
module, it spits out a list of parts, where each part is like
a tuple of (decoded string, charset). To smash these decoded
sections into one string, you’ll want to loop through the list,
decode each piece (if it needs it), and then throw them together.
Here’s a straightforward example of how to pull this off:
from email.header import decode_header
# Example header
header_example = \
'From: =?utf-8?B?U8OpYmFzdGllbiBDcmlnbm9u?= <sebastien.crignon@amvs.fr>'
# Decode the header
decoded_parts = decode_header(header_example)
# Kick off an empty list for the decoded strings
decoded_strings = []
for part, charset in decoded_parts:
if isinstance(part, bytes):
# Decode the bytes to a string using the charset
decoded_string = part.decode(charset or 'utf-8')
else:
# If it’s already a string, just roll with it
decoded_string = part
decoded_strings.append(decoded_string)
# Join the parts into a single string
final_string = ''.join(decoded_strings)
print(final_string)# From: Sébastien Crignon <sebastien.crignon@amvs.fr>
Breakdown
decode_header(header_example): This line takes your email header
and breaks it down into a list of tuples.
Looping through decoded_parts: You check if each part is in
bytes. If it is, you decode it using whatever charset it’s
got (defaulting to 'utf-8' if it’s a little vague).
Appending Decoded Strings: You toss each decoded part into a list.
Joining Strings: Finally, you use ''.join(decoded_strings) to glue
all the decoded strings into a single, coherent piece.
Just a Heads Up
Keep an eye out for cases where the charset might be None. In those
moments, it’s smart to fall back to 'utf-8' or something safe.
Stefan Ram <ram@zedat.fu-berlin.de> wrote:
Chris Green <cl@isbd.net> wrote or quoted:
From: =?utf-8?B?U8OpYmFzdGllbiBDcmlnbm9u?= <sebastien.crignon@amvs.fr>
Is there a simple[r] way to extract just the 'real' address between
the <>, that's all I actually need. I think it has the be the last
chunk of the From: doesn't it?