Compare commits
3 commits
6590baafd1
...
f1a07cb1e0
Author | SHA1 | Date | |
---|---|---|---|
f1a07cb1e0 | |||
f559fef2ed | |||
10f25158bf |
1 changed files with 22 additions and 8 deletions
28
gpgmymail
28
gpgmymail
|
@ -60,6 +60,7 @@ 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
|
# 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
|
# string but i couldn't get it to work any other way
|
||||||
# decoding needed:
|
# decoding needed:
|
||||||
|
# as_string() gives us str, encode() gives us bytes
|
||||||
decoded_bytes = message.as_bytes()
|
decoded_bytes = message.as_bytes()
|
||||||
decoded_bytes = quopri.decodestring(decoded_bytes)
|
decoded_bytes = quopri.decodestring(decoded_bytes)
|
||||||
|
|
||||||
|
@ -78,15 +79,26 @@ def decode_email(message: email.message.Message) -> email.message.Message:
|
||||||
# lol
|
# lol
|
||||||
quopri_decoded_message = email.message_from_bytes(decoded_bytes)
|
quopri_decoded_message = email.message_from_bytes(decoded_bytes)
|
||||||
if quopri_decoded_message.is_multipart():
|
if quopri_decoded_message.is_multipart():
|
||||||
|
most_recent_boundary = None
|
||||||
for part in quopri_decoded_message.walk():
|
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":
|
if part.get("Content-Transfer-Encoding") == "base64":
|
||||||
new_part = part
|
b64_str = part.get_payload()
|
||||||
new_part.replace_header("Content-Transfer-Encoding", "7bit")
|
# remove the boundary as we don't want to change this
|
||||||
new_part.set_payload(part.get_payload(decode=True))
|
b64_str = b64_str.replace(most_recent_boundary, "")
|
||||||
|
# sometimes we have leftover hyphens from a boundary, so strip:
|
||||||
|
# hyphens not in base64 so we know not to use them
|
||||||
|
# strip whitespace first
|
||||||
|
b64_str = b64_str.strip()
|
||||||
|
b64_str = b64_str.strip('-')
|
||||||
|
b64_str = b64_str.encode() # turn into bytes-like object
|
||||||
|
decoded_b64_str = part.get_payload(decode=True)
|
||||||
decoded_bytes = decoded_bytes.replace(
|
decoded_bytes = decoded_bytes.replace(
|
||||||
part.as_bytes(),
|
b64_str,
|
||||||
new_part.as_bytes()
|
decoded_b64_str
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
# TODO
|
# TODO
|
||||||
|
@ -97,7 +109,9 @@ def decode_email(message: email.message.Message) -> email.message.Message:
|
||||||
b'Content-Transfer-Encoding: 7bit'
|
b'Content-Transfer-Encoding: 7bit'
|
||||||
)
|
)
|
||||||
|
|
||||||
return email.message_from_bytes(decoded_bytes)
|
# if i do message_from_bytes it bizarrely changes it back to base64?
|
||||||
|
# utf-8 has encoding issues so do latin1
|
||||||
|
return email.message_from_string(decoded_bytes.decode("latin1"))
|
||||||
|
|
||||||
def encrypt(
|
def encrypt(
|
||||||
message: email.message.Message,
|
message: email.message.Message,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue