import gradio as gr from mailparser import parse_from_string from bs4 import BeautifulSoup def accept_mail(name): email = parse_from_string(name) return email def clean_email(email): soup = BeautifulSoup(email.body, 'html.parser') for tag in soup.find_all(['style', 'link']): tag.decompose() cleaned_text = ' '.join(soup.get_text(separator=' ').split()) return cleaned_text def present(email_content): email = accept_mail(email_content) cleaned_text = clean_email(email) # Call clean_email to get cleaned text email_info = { "Subject": email.subject, "From": email.from_, "To": email.to, "Date": email.date, "Message ID": email.message_id, "Headers": email.headers, "Attachments": email.attachments } # Outputs are now organized as a list to match the structure for grouped outputs return [ [ email_info["Subject"], str(email_info["From"]), # Convert list to string for display str(email_info["To"]), # Convert list to string for display email_info["Date"], email_info["Message ID"], str(email_info["Headers"]), # Convert dictionary to string for display str(email_info["Attachments"]) # Convert list to string for display ], cleaned_text # Cleaned text is the second major block ] outputs = [ gr.components.Group( components=[ gr.components.Textbox(label="Subject"), gr.components.Textbox(label="From"), gr.components.Textbox(label="To"), gr.components.Textbox(label="Date"), gr.components.Textbox(label="Message ID"), gr.components.Textbox(label="Headers"), gr.components.Textbox(label="Attachments") ], label="Email Details" ), gr.components.Textbox(label="Cleaned Text") ] demo = gr.Interface( fn=present, inputs="text", outputs=outputs, title="Email Info", description="Enter the email content below to view its details.", layout="horizontal" # Arrange the major output groups horizontally ) demo.launch()