7or8bit-decode #5
1 changed files with 14 additions and 7 deletions
21
gpgmymail
21
gpgmymail
|
@ -36,6 +36,7 @@ import email.mime.message
|
|||
import typing
|
||||
# for decode_email:
|
||||
import quopri
|
||||
import base64
|
||||
|
||||
# see: https://gnupg.readthedocs.io/en/latest/
|
||||
import gnupg
|
||||
|
@ -60,7 +61,8 @@ def decode_email(message: email.message.Message) -> email.message.Message:
|
|||
# this is a kinda hacky way to do this by manipulating the message as a
|
||||
# string but i couldn't get it to work any other way
|
||||
# decoding needed:
|
||||
decoded_bytes = message.as_bytes()
|
||||
# as_string() gives us str, encode() gives us bytes
|
||||
decoded_bytes = message.as_string().encode()
|
||||
decoded_bytes = quopri.decodestring(decoded_bytes)
|
||||
|
||||
# replace any instances of the Content-Transfer-Encoding header
|
||||
|
@ -78,15 +80,20 @@ def decode_email(message: email.message.Message) -> email.message.Message:
|
|||
# lol
|
||||
quopri_decoded_message = email.message_from_bytes(decoded_bytes)
|
||||
if quopri_decoded_message.is_multipart():
|
||||
most_recent_boundary = None
|
||||
for part in quopri_decoded_message.walk():
|
||||
if not part.is_multipart():
|
||||
# multipart and has boundary (not None)
|
||||
if part.is_multipart() and part.get_boundary():
|
||||
most_recent_boundary = part.get_boundary()
|
||||
else:
|
||||
if part.get("Content-Transfer-Encoding") == "base64":
|
||||
new_part = part
|
||||
new_part.replace_header("Content-Transfer-Encoding", "7bit")
|
||||
new_part.set_payload(part.get_payload(decode=True))
|
||||
b64_str = part.get_payload()
|
||||
# remove the boundary as we don't want to change this
|
||||
b64_str = b64_str.replace(most_recent_boundary, "")
|
||||
decoded_b64_str = base64.b64decode(b64_str)
|
||||
decoded_bytes = decoded_bytes.replace(
|
||||
part.as_bytes(),
|
||||
new_part.as_bytes()
|
||||
b64_str,
|
||||
decoded_b64_str
|
||||
)
|
||||
else:
|
||||
# TODO
|
||||
|
|
Loading…
Reference in a new issue