Browse Source

fix garbled base64 encoded mail

Pi 1 year ago
parent
commit
93c49cf867
1 changed files with 15 additions and 7 deletions
  1. 15 7
      mime-inject.py

+ 15 - 7
mime-inject.py

@@ -2,6 +2,7 @@
 # depends (debian) python3-lxml
 import sys
 import email
+from base64 import b64encode
 from lxml import html as HTML
 
 def iter(e):
@@ -32,16 +33,23 @@ INJECTED = {
     'text/html': False,
 }
 
+def recode(msg, payload, encoder):
+    _bytes = payload.encode("utf-8")
+    if encoder is email.encoders.encode_base64:
+        msg.set_payload(b64encode(_bytes))
+    else:
+        msg.set_payload(_bytes)
+    encoder(msg)
+
 def inject(m):
     c = m.get_content_type()
     e = m.get('Content-Transfer-Encoding','').lower()
-    payload = m.get_payload(decode=True).decode("utf-8")
+    payload = m.get_payload(decode=True).decode(m.get_content_charset("utf-8"))
 
     if c == 'text/plain' and txt not in payload:
-        payload = payload + f"""
-{txt}
-"""
-    if c == 'text/html':
+        payload += f"\n{txt}\n"
+
+    elif c == 'text/html':
         h = HTML.fromstring(payload)
         payload = drop_banner(h)
 
@@ -58,8 +66,8 @@ def inject(m):
         encode = email.encoders.encode_base64
     else:
         encode = email.encoders.encode_noop
-    m.set_payload(payload.encode("utf-8"))
-    encode(m)
+
+    recode(m, payload, encode)
     m.set_charset("utf-8")
 
 def visit(m):