46 lines
1.5 KiB
Python
46 lines
1.5 KiB
Python
import argparse
|
|
from pathlib import Path
|
|
|
|
SEP = "\n\n" + ("=" * 78) + "\n" # visible separator between messages
|
|
|
|
def main():
|
|
p = argparse.ArgumentParser(description="Concatenate .eml files into one all-emails.eml")
|
|
p.add_argument("folder", nargs="?", default=".", help="Folder containing .eml files (default: current folder)")
|
|
p.add_argument("--output", default="all-emails.eml", help="Output file name (default: all-emails.eml)")
|
|
p.add_argument("--sort", choices=["name", "mtime"], default="mtime",
|
|
help="Sort input files by name or modification time (default: mtime)")
|
|
args = p.parse_args()
|
|
|
|
folder = Path(args.folder).expanduser().resolve()
|
|
if not folder.is_dir():
|
|
raise SystemExit(f"Not a folder: {folder}")
|
|
|
|
emls = list(folder.glob("*.eml"))
|
|
if not emls:
|
|
raise SystemExit(f"No .eml files found in {folder}")
|
|
|
|
if args.sort == "name":
|
|
emls.sort(key=lambda x: x.name.lower())
|
|
else:
|
|
emls.sort(key=lambda x: x.stat().st_mtime)
|
|
|
|
out_path = folder / args.output
|
|
|
|
with out_path.open("wb") as out:
|
|
for i, f in enumerate(emls, 1):
|
|
data = f.read_bytes()
|
|
|
|
# Ensure each message ends with a newline
|
|
if data and not data.endswith(b"\n"):
|
|
data += b"\n"
|
|
|
|
out.write(data)
|
|
# Add separator so messages don't run together
|
|
out.write(SEP.encode("utf-8"))
|
|
|
|
print(f"Wrote {len(emls)} emails to {out_path}")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|