Create SendMailsFromCSV.py
This commit is contained in:
commit
60f86a8dd3
1 changed files with 96 additions and 0 deletions
96
SendMailsFromCSV.py
Normal file
96
SendMailsFromCSV.py
Normal file
|
|
@ -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!")
|
||||
Loading…
Add table
Add a link
Reference in a new issue