”import os
import glob
import patoolib
from email import policy
from email.parser import BytesParser
def parse_eml(file_path):
“””Parses an .eml file and returns metadata and body text.”””
try:
with open(file_path, ‘rb’) as f:
msg = BytesParser(policy=policy.default).parse(f)
subject = msg['subject'] or "No Subject"
date_str = msg['date'] or "Unknown Date"
body = ""
if msg.is_multipart():
for part in msg.iter_parts():
if part.get_content_type() == 'text/plain':
payload = part.get_content()
if isinstance(payload, str):
body = payload
break
else:
payload = msg.get_content()
if isinstance(payload, str):
body = payload
return {
'filename': os.path.basename(file_path),
'subject': subject,
'date': date_str,
'body': body.strip()
}
except Exception as e:
print(f"Error parsing {file_path}: {e}")
return None
def summarize_text(text, max_lines=3):
“””Basic extractive summarizer taking the first few meaningful lines.”””
if not text:
return “No content available to summarize.”
lines = [line.strip() for line in text.split(‘\n’) if line.strip()]
summary_lines = lines[:max_lines]
return ” “.join(summary_lines) if summary_lines else “Empty email body.”
def process_rar_robustly(rar_path, output_file_path, extract_dir=”extracted_emails”):
if not os.path.exists(rar_path):
print(f”RAR file not found: {rar_path}”)
return
print(f"Extracting {rar_path} using patool...")
os.makedirs(extract_dir, exist_ok=True)
try:
patoolib.extract_archive(rar_path, outdir=extract_dir)
print("Extraction completed successfully.")
except Exception as e:
print(f"Extraction error: {e}")
return
# Find all .eml files recursively in the extracted directory
search_path = os.path.join(extract_dir, '**', '*.eml')
eml_files = glob.glob(search_path, recursive=True)
total_files = len(eml_files)
print(f"Found {total_files} .eml files. Processing and deduplicating...")
seen_timestamps = set()
unique_emails = []
for idx, file_path in enumerate(eml_files, 1):
if idx % 500 == 0:
print(f"Processed {idx}/{total_files} files...")
email_data = parse_eml(file_path)
if not email_data:
continue
timestamp = email_data['date']
if timestamp in seen_timestamps:
continue
seen_timestamps.add(timestamp)
unique_emails.append(email_data)
print(f"\nRetained {len(unique_emails)} unique emails out of {total_files} total files.")
# Write combined output to a single file
with open(output_file_path, 'w', encoding='utf-8') as out_f:
out_f.write("=" * 70 + "\n")
out_f.write(f"COMBINED EMAIL SUMMARIES REPORT ({len(unique_emails)} Unique Files)\n")
out_f.write("=" * 70 + "\n\n")
for idx, item in enumerate(unique_emails, 1):
summary = summarize_text(item['body'])
out_f.write(f"[{idx}] File: {item['filename']}\n")
out_f.write(f"Subject: {item['subject']}\n")
out_f.write(f"Date/Time: {item['date']}\n")
out_f.write(f"Summary:\n{summary}\n")
out_f.write("-" * 70 + "\n\n")
print(f"Successfully wrote combined output to: {output_file_path}")
if name == “main“:
process_rar_robustly(“spammaillist.rar”, “combined_summary.txt”)”
