otakana icon

Recursive extract email attachments from maildir

otakana | PRO | 06/10/20 08:02:08 AM UTC | 0 ⭐ | 2103 👁️ | Never ⏰ | []
Python |

1.68 KB

|

None

|

0 👍

/

0 👎

import os
import sys
import mailparser
import hashlib
import traceback
import base64
from mailparser.mailparser import MailParser
 
def write_sample(binary, payload, path, filename):
    if not os.path.exists(path):
        os.makedirs(path)
 
    sample = os.path.join(path, filename)
 
    if binary:
        with open(sample, "wb") as f:
            f.write(base64.b64decode(payload))
    else:
        with open(sample, "w") as f:
            f.write(payload)
 
def write_attachments(attachments, base_path):
    for a in attachments:
        realdir=os.path.dirname(os.path.join(base_path,a["filename"]))
        os.makedirs(realdir,exist_ok=True)
        write_sample(
            binary=a["binary"],
            payload=a["payload"],
            path=base_path,
            filename=a["filename"],
        )
        
for directory, dirnames, filenames in os.walk("."):
    for f in filenames:
        filename=os.path.join(directory,f)
        print("Handling {}".format(filename))
        try:
            with open(filename,"r",encoding="latin-1") as infile:
                data=infile.read()
                h=hashlib.sha256(data.encode('utf-16')).hexdigest()
                outpath="../{}/".format(h)
                os.makedirs(outpath,exist_ok=True)
                mail = mailparser.parse_from_string(data)
                with open("mail.txt","w",encoding="utf-8") as outfile:
                    outfile.write("filename:{}\n".format(f)))
                    outfile.write("\n".join(mail.text_plain))
                write_attachments(mail.attachments,outpath)
        except Exception as e:
            print(e)
            print(traceback.format_exc())

Comments