files_converter / app.py
joyjonesmark's picture
Add application file
172c649
import streamlit as st
import mailbox
from fpdf import FPDF
import os
from datetime import datetime
# Function to convert mbox to PDF
def mbox_to_pdf(mbox_file, output_pdf):
# Create PDF object
pdf = FPDF()
pdf.set_auto_page_break(auto=True, margin=15)
# Open mbox file
mbox = mailbox.mbox(mbox_file)
# Process each email
for message in mbox:
pdf.add_page()
# Set font
pdf.set_font("Arial", size=12)
# Add email headers
subject = message['subject'] if message['subject'] else 'No Subject'
from_ = message['from'] if message['from'] else 'Unknown Sender'
date = message['date'] if message['date'] else 'No Date'
# Write headers to PDF
pdf.cell(0, 10, f"Subject: {subject}", ln=True)
pdf.cell(0, 10, f"From: {from_}", ln=True)
pdf.cell(0, 10, f"Date: {date}", ln=True)
pdf.cell(0, 10, "----------------------------------------", ln=True)
# Add email body
try:
if message.is_multipart():
for part in message.walk():
if part.get_content_type() == 'text/plain':
content = part.get_payload(decode=True)
if content:
# Decode content and handle potential encoding issues
try:
content = content.decode('utf-8')
except:
content = content.decode('latin-1', errors='replace')
# Split content into lines and add to PDF
for line in content.split('\n'):
# Ensure line is not too long for PDF
line = line[:180] if len(line) > 180 else line
pdf.multi_cell(0, 10, line)
else:
content = message.get_payload(decode=True)
if content:
try:
content = content.decode('utf-8')
except:
content = content.decode('latin-1', errors='replace')
for line in content.split('\n'):
line = line[:180] if len(line) > 180 else line
pdf.multi_cell(0, 10, line)
except Exception as e:
pdf.multi_cell(0, 10, f"Error processing message content: {str(e)}")
# Save PDF
pdf.output(output_pdf)
return output_pdf
# Streamlit app
def main():
st.title("MBOX to PDF Converter")
st.write("Upload an MBOX file to convert it to PDF format")
# File uploader
uploaded_file = st.file_uploader("Choose an MBOX file", type=['mbox'])
if uploaded_file is not None:
# Save uploaded file temporarily
temp_mbox = "temp.mbox"
with open(temp_mbox, "wb") as f:
f.write(uploaded_file.getvalue())
# Convert button
if st.button("Convert to PDF"):
with st.spinner("Converting..."):
try:
# Generate output filename with timestamp
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
output_pdf = f"converted_email_{timestamp}.pdf"
# Convert mbox to pdf
pdf_path = mbox_to_pdf(temp_mbox, output_pdf)
# Provide download link
with open(pdf_path, "rb") as f:
st.download_button(
label="Download PDF",
data=f,
file_name=output_pdf,
mime="application/pdf"
)
st.success("Conversion completed successfully!")
# Clean up temporary files
os.remove(temp_mbox)
os.remove(pdf_path)
except Exception as e:
st.error(f"Error during conversion: {str(e)}")
if os.path.exists(temp_mbox):
os.remove(temp_mbox)
if __name__ == "__main__":
main()