Compare commits

...

4 commits

2 changed files with 30 additions and 1 deletions

7
.gitignore vendored
View file

@ -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

View file

@ -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