88 lines
2.0 KiB
Python
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)
|