diff --git a/.gitignore b/.gitignore index 68ecb9b..5deb70a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,9 @@ venv/ +__pycache__/ .idea/ -testing.py +# misc testing scripts +testing*.py +# i have a symlink here so testing scripts can import gpgmymail +# as python expects `import gpgmymail` to be importing `gpgmymail.py` +gpgmymail.py diff --git a/gpgmymail b/gpgmymail index a3c230f..21c46e6 100755 --- a/gpgmymail +++ b/gpgmymail @@ -49,6 +49,26 @@ def is_message_encrypted(message: email.message.Message) -> bool: return message.get_content_subtype() == "encrypted" +def decode_email(message: email.message.Message) -> email.message.Message: + """Turn a quoted-printable or base64 encoded email into a 7or8bit encoded + email + + :param message: email.message.Message to be decoded + :return: decoded email.message.Message""" + if message.is_multipart(): + payload = [] + for part in message.walk(): + if not part.is_multipart(): + payload.append(part.get_payload(decode=True)) + + message.set_payload(payload) + else: + message.set_payload(message.get_payload(decode=True)) + + message["Content-Transfer-Encoding"] = "7bit" + + return message + def encrypt( message: email.message.Message, recipients: typing.List[str], @@ -67,10 +87,14 @@ def encrypt( :return: The encrypted email as a string""" + # exclusion criteria: # some mail clients like Thunderbird don't like twice-encrypted emails, # so we return the message as-is if it's already encrypted if is_message_encrypted(message) and not unconditionally_encrypt: return message.as_string() + + # make necessary changes to message + message = decode_email(message) gpg = gnupg.GPG() gpg.encoding = encoding