import csv from tempfile import NamedTemporaryFile import shutil import pandas as pd import source_code as sc from suggestion import suggest_email_domain import whois from popular_domains import emailDomains import streamlit as st from streamlit_extras.metric_cards import style_metric_cards st.set_page_config( page_title="Email verification", page_icon="✅", layout="centered", ) def label_email(email): if not sc.is_valid_email(email): return "Invalid" if not sc.has_valid_mx_record(email.split('@')[1]): return "Invalid" if not sc.verify_email(email): return "Unknown" if sc.is_disposable(email.split('@')[1]): return "Risky" return "Valid" def label_emails(input_file): file_extension = input_file.name.split('.')[-1].lower() if file_extension == 'csv': df = process_csv(input_file) elif file_extension == 'xlsx': df = process_xlsx(input_file) elif file_extension == 'txt': df = process_txt(input_file) else: st.warning("Unsupported file format. Please provide a CSV, XLSX, or TXT file.") def process_csv(input_file): # Read the uploaded file as a DataFrame if input_file: if isinstance(input_file, str): # For Streamlit sharing compatibility df = pd.read_csv(input_file, header=None) else: df = pd.read_csv(input_file, header=None) # Create a list to store the results results = [] # Process each row in the input DataFrame for index, row in df.iterrows(): email = row[0].strip() label = label_email(email) results.append([email, label]) # Create a new DataFrame for results result_df = pd.DataFrame(results, columns=['Email', 'Label']) result_df.index = range(1, len(result_df) + 1) # Starting index from 1 return result_df else: return pd.DataFrame(columns=['Email', 'Label']) def process_xlsx(input_file): df = pd.read_excel(input_file, header=None) results = [] for index, row in df.iterrows(): email = row[0].strip() label = label_email(email) results.append([email, label]) result_df = pd.DataFrame(results, columns=['Email', 'Label']) result_df.index = range(1, len(result_df) + 1) # Starting index from 1 # Display the results in a table st.dataframe(result_df) def process_txt(input_file): input_text = input_file.read().decode("utf-8").splitlines() # Create a list to store the results results = [] for line in input_text: email = line.strip() label = label_email(email) results.append([email, label]) # Create a DataFrame for the results result_df = pd.DataFrame(results, columns=['Email', 'Label']) result_df.index = range(1, len(result_df) + 1) # Starting index from 1 # Display the results in a table st.dataframe(result_df) def main(): with open('style.css') as f: st.markdown(f'', unsafe_allow_html=True) st.title("Email Verification Tool", help="This tool verifies the validity of an email address.") st.info("The result may not be accurate. However, it has 90% accuracy.") t1, t2= st.tabs(["Single Email", "Bulk Email Processing"]) with t1: # Single email verification email = st.text_input("Enter an email address:") if st.button("Verify"): with st.spinner('Verifying...'): result = {} # Syntax validation result['syntaxValidation'] = sc.is_valid_email(email) if result['syntaxValidation']: domain_part = email.split('@')[1] if '@' in email else '' if not domain_part: st.error("Invalid email format. Please enter a valid email address.") else: # Additional validation for the domain part if not sc.has_valid_mx_record(domain_part): st.warning("Not valid: MX record not found.") suggested_domains = suggest_email_domain(domain_part, emailDomains) if suggested_domains: st.info("Suggested Domains:") for suggested_domain in suggested_domains: st.write(suggested_domain) else: st.warning("No suggested domains found.") else: # MX record validation result['MXRecord'] = sc.has_valid_mx_record(domain_part) # SMTP validation if result['MXRecord']: result['smtpConnection'] = sc.verify_email(email) else: result['smtpConnection'] = False # Temporary domain check result['is Temporary'] = sc.is_disposable(domain_part) # Determine validity status and message is_valid = ( result['syntaxValidation'] and result['MXRecord'] and result['smtpConnection'] and not result['is Temporary'] ) st.markdown("**Result:**") # Display metric cards with reduced text size col1, col2, col3 = st.columns(3) col1.metric(label="Syntax", value=result['syntaxValidation']) col2.metric(label="MxRecord", value=result['MXRecord']) col3.metric(label="Is Temporary", value=result['is Temporary']) # Show SMTP connection status as a warning if not result['smtpConnection']: st.warning("SMTP connection not established.") # Show domain details in an expander with st.expander("See Domain Information"): try: dm_info = whois.whois(domain_part) st.write("Registrar:", dm_info.registrar) st.write("Server:", dm_info.whois_server) st.write("Country:", dm_info.country) except: st.error("Domain information retrieval failed.") # Show validity message if is_valid: st.success(f"{email} is a Valid email") else: st.error(f"{email} is a Invalid email") if result['is Temporary']: st.text("It is a disposable email") with t2: # Bulk email processing st.header("Bulk Email Processing") input_file = st.file_uploader("Upload a CSV, XLSX, or TXT file", type=["csv", "xlsx", "txt"]) if input_file: st.write("Processing...") if input_file.type == 'text/plain': process_txt(input_file) else: df = process_csv(input_file) st.success("Processing completed. Displaying results:") st.dataframe(df) if __name__ == "__main__": main()