-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
177 lines (140 loc) · 5.93 KB
/
Copy pathapp.py
File metadata and controls
177 lines (140 loc) · 5.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
from flask import Flask, render_template, request, redirect, url_for, jsonify
import smtplib
from datetime import datetime, timedelta
import re
import csv
app = Flask(__name__)
def sanitize_input(input_str):
"""Remove special characters from input to prevent issues."""
if input_str:
return re.sub(r'[^\w\s@.]+', '', input_str)
return input_str
@app.route('/', methods=['GET', 'POST'])
def home():
if request.method == 'POST':
return redirect(url_for('parameters'))
return render_template('index.html')
@app.route('/parameters', methods=['GET', 'POST'])
def parameters():
return render_template('parameters.html')
@app.route('/csvparameters', methods=['GET', 'POST'])
def csvparameters():
return render_template('csvparameters.html')
@app.route('/upload', methods=['POST'])
def handle_csvdata():
response = upload_file()
file = getFileName(response)
gmail_key = sanitize_input(request.form.get('gmailKey'))
user_email = sanitize_input(request.form.get('userEmail'))
initial_subject = (request.form.get('initialSubject'))
initial_body = (request.form.get('initialBody'))
emailData, num_emails = csvprocess(file, initial_subject, initial_body)
print(emailData)
initsend(emailData, user_email, gmail_key)
return render_template('confirm.html', num_emails=num_emails)
@app.route('/submit', methods=['POST'])
def submit():
# Step 1: Collect and sanitize Gmail key and user email
gmail_key = sanitize_input(request.form.get('gmailKey'))
user_email = sanitize_input(request.form.get('userEmail'))
# Step 2: Collect and sanitize Replace values
num_params = int(request.form.get('numParams'))
replace_values = [sanitize_input(request.form.get(f'replace{i}')) for i in range(1, num_params + 1)]
# Step 3: Collect and sanitize emails and their parameters
num_emails = int(request.form.get('numEmails'))
emails_data = []
for i in range(1, num_emails + 1):
email = sanitize_input(request.form.get(f'email{i}'))
params = [sanitize_input(request.form.get(f'email{i}_param{j}')) for j in range(1, num_params + 1)]
emails_data.append({"email": email, "parameters": params})
# Step 4: Collect and sanitize initial and follow-up email data
initial_subject = sanitize_input(request.form.get('initialSubject'))
initial_body = sanitize_input(request.form.get('initialBody'))
# Step 6: Prepare the data for email processing
data = {
"user_email": user_email,
"gmail_key": gmail_key,
"replace_values": replace_values,
"emails_data": emails_data,
"initial_subject": initial_subject,
"initial_body": initial_body,
#"followup_subject": followup_subject,
#"followup_body": followup_body,
#"followup_days": followup_days
}
# Send initial emails and schedule follow-ups
refined_data = process_data(data)
initsend(refined_data, user_email, gmail_key)
#followup_date = schedule_followup(refined_data, user_email, gmail_key, followup_days)
# Render the success page with relevant info
return render_template('confirm.html', num_emails=num_emails)
def upload_file():
if 'csvFile' not in request.files:
return "No file part", 400
file = request.files['csvFile']
if file.filename == '':
return "No selected file", 400
if file and file.filename.endswith('.csv'):
file.save(f"{file.filename}")
return {"message": "File uploaded successfully!", "file_name": file.filename}, 200
return "Invalid file type", 400
def getFileName(response):
if isinstance(response, tuple):
message, status_code = response
if status_code == 200:
file_name = message['file_name']
return file_name
else:
return f"Error: {message}"
else:
return f"Unexpected response: {response}"
def process_data(data):
"""Format the email data by replacing placeholders."""
formatted_emails = []
for email_data in data['emails_data']:
email = email_data['email']
params = email_data['parameters']
initial_subject = data['initial_subject']
initial_body = data['initial_body']
for placeholder, value in zip(data['replace_values'], params):
initial_subject = initial_subject.replace(placeholder, value)
initial_body = initial_body.replace(placeholder, value)
formatted_emails.append({
'email': email,
'initial_subject': initial_subject,
'initial_body': initial_body,
})
return formatted_emails
def csvprocess(csvfile, emailSubject, emailBody):
formatted_emails = []
with open(csvfile, 'r') as file:
csv_reader = csv.reader(file)
headers = next(csv_reader)
parameters = headers[1:]
for row in csv_reader:
email = row[0]
param_dict = dict(zip(parameters, row[1:]))
formatted_subject = emailSubject
formatted_body = emailBody
for param, value in param_dict.items():
formatted_subject = formatted_subject.replace(param, value)
formatted_body = formatted_body.replace(param, value)
formatted_emails.append({
"email": email,
"initial_subject": formatted_subject,
"initial_body": formatted_body
})
return (formatted_emails,len(formatted_emails))
def initsend(data, sender, key):
"""Send initial emails to the recipients."""
for entry in data:
receiver = entry['email']
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(sender, key)
text = f"Subject: {entry['initial_subject']}\n\n{entry['initial_body']}"
server.sendmail(sender, receiver, text)
print(f"Initial email sent to {receiver}")
server.quit()
if __name__ == '__main__':
app.run(debug=True)