From 60f86a8dd3aaad5deccd7cbd1644022784d04bd9 Mon Sep 17 00:00:00 2001 From: Simeon Wallrath Date: Fri, 27 Feb 2026 17:35:25 +0100 Subject: [PATCH] Create SendMailsFromCSV.py --- SendMailsFromCSV.py | 96 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 SendMailsFromCSV.py diff --git a/SendMailsFromCSV.py b/SendMailsFromCSV.py new file mode 100644 index 0000000..dd3dc45 --- /dev/null +++ b/SendMailsFromCSV.py @@ -0,0 +1,96 @@ +import pandas as pd +import smtplib +from email.mime.text import MIMEText +from email.mime.multipart import MIMEMultipart +import getpass +from tkinter import Tk +from tkinter.filedialog import askopenfilename + +# Open file +Tk().withdraw() +file_path = askopenfilename( + title="Select CSV or XLSX file", + filetypes=[("CSV files", "*.csv"), ("Excel files", "*.xlsx"), ("All files", "*.*")] +) +if not file_path: + raise ValueError("No file selected. Exiting.") + + +if file_path.lower().endswith('.csv'): + df = pd.read_csv(file_path) +elif file_path.lower().endswith(('.xlsx', '.xls')): + df = pd.read_excel(file_path) +else: + raise ValueError("Unsupported file type. Only CSV or XLSX allowed.") + +# Recipient column +print(f"Available columns: {list(df.columns)}") +recipient_col = input("Enter the column name for recipients: ").strip() +if recipient_col not in df.columns: + raise ValueError(f"Column '{recipient_col}' not found.") + + +placeholders = {} +while True: + var_name = input("Enter a placeholder name (e.g., $Variable1) or press Enter to finish: ").strip() + if not var_name: + break + col_name = input(f"Enter the column name to use for {var_name}: ").strip() + if col_name not in df.columns: + print(f"Column '{col_name}' not found, try again.") + continue + placeholders[var_name] = col_name + +sender_email = input("Enter your sender email address: ").strip() + + +while True: + smtp_password = getpass.getpass("Enter your email password (hidden): ") + smtp_server = input("Enter your SMTP server (e.g., smtp.gmail.com): ").strip() + smtp_port = int(input("Enter your SMTP port (usually 587 for TLS): ").strip()) + try: + with smtplib.SMTP(smtp_server, smtp_port) as server: + server.starttls() + server.login(sender_email, smtp_password) + print("Login successful!") + break + except smtplib.SMTPAuthenticationError: + print("Authentication failed. Please try again.") + except Exception as e: + print(f"SMTP error: {e}. Please try again.") + +subject = input("Enter the email subject: ").strip() +print("Enter your email body. Use placeholders like $Variable1, $Variable2.") +print("Type 'END' on a new line to finish:") +lines = [] +while True: + line = input() + if line.strip().upper() == "END": + break + lines.append(line) +body_template = "\n".join(lines) + +# send +with smtplib.SMTP(smtp_server, smtp_port) as server: + server.starttls() + server.login(sender_email, smtp_password) + + for idx, row in df.iterrows(): + recipient = row[recipient_col] + body = body_template + for var, col in placeholders.items(): + body = body.replace(var, str(row[col])) + + msg = MIMEMultipart() + msg['From'] = sender_email + msg['To'] = recipient + msg['Subject'] = subject + msg.attach(MIMEText(body, 'plain')) + + try: + server.send_message(msg) + print(f"Email sent to {recipient}") + except Exception as e: + print(f"Failed to send email to {recipient}: {e}") + +print("All emails processed!")