python code to read EML files in zip for social science research

”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”)”

Leave a Reply

Your email address will not be published. Required fields are marked *