1
0
Fork 0
python-3-script-collection/src/eml_attach_generator.py

88 lines
2.0 KiB
Python

#!/usr/bin/python3
import os
import base64
import mimetypes
import random
import string
from datetime import datetime
random_breaker = lambda: "".join(
random.choices(
string.ascii_uppercase + string.ascii_lowercase + string.digits, k=24
)
)
def get_file_stats(filename):
stats = []
stats.append(f"Date Created: {datetime.fromtimestamp(os.path.getctime(filename))}")
stats.append(f"Date Modified: {datetime.fromtimestamp(os.path.getmtime(filename))}")
stats.append(f"Date Accessed: {datetime.fromtimestamp(os.path.getatime(filename))}")
file_size = os.path.getsize(filename)
stats.append(f"File Size: {file_size} bytes ({file_size / 1024:.2f} KiB)")
return "\n\n".join(stats)
def pack_file(filename):
with open(filename, "rb") as f:
data = f.read()
basename = os.path.basename(filename)
mime_type = guess_mime_type(filename)
b64_data = base64.b64encode(data).decode()
breaker = random_breaker()
output = f"""\
Content-Type: multipart/mixed; boundary="------------{breaker}"
MIME-Version: 1.0
Subject: File '{basename}'
This is a multi-part message in MIME format.
--------------{breaker}
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
{get_file_stats(filename)}
--------------{breaker}
Content-Type: {mime_type}; name="{basename}"
Content-Disposition: attachment; filename="{basename}"
Content-Transfer-Encoding: base64
{wrap_base64(b64_data)}"""
return output
def guess_mime_type(filename):
mime_type, _ = mimetypes.guess_type(filename)
if mime_type is None:
mime_type = "application/octet-stream"
return mime_type
def wrap_base64(b64_string):
result = ""
for i in range(0, len(b64_string), 72):
result += b64_string[i : i + 72] + "\n"
return result
if __name__ == "__main__":
import sys
if len(sys.argv) < 2:
print("Fatal: No specified file as argument")
raise SystemExit
filename = sys.argv[1]
packed = pack_file(filename)
print(packed)