From d74234a8e7dc0f1a36967378ccf7733834fef902 Mon Sep 17 00:00:00 2001 From: thisfro Date: Wed, 5 Oct 2022 11:46:40 +0200 Subject: [PATCH] Improve templating and use pandas for contacts --- README.md | 12 +++++++++++- mail.py | 53 ++++++++++++++++++++--------------------------------- 2 files changed, 31 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 8e56642..aa578ca 100644 --- a/README.md +++ b/README.md @@ -8,4 +8,14 @@ Easily send mails via SMTP and python 3. Adapt `message.txt` and import `contacts.csv` ## Usage -```python mail.py``` \ No newline at end of file +```python mail.py``` + +## Templating +You can use the keys from your `csv` directly, prepending a `$` sign. For example: +``` +Hello $name, your value is $value! +``` +would look like the following: +``` +Hello h4xx0r, your value is 1337! +``` \ No newline at end of file diff --git a/mail.py b/mail.py index cf08831..4340028 100644 --- a/mail.py +++ b/mail.py @@ -5,48 +5,33 @@ from string import Template from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText -import csv +import pandas as pd from vars import * + def get_contacts(filename): """ Return the lists containing the infos read from a file specified by filename. """ - - snames = [] - fnames =[] - emails = [] - pwd = [] - user = [] - with open(filename, mode='r', encoding='utf-8') as contacts_file: - for a_contact in contacts_file: - snames.append(a_contact.split()[0]) - fnames.append(a_contact.split()[1]) - emails.append(a_contact.split()[2]) - pwd.append(a_contact.split()[3]) - user.append(a_contact.split()[4]) - return snames, fnames, emails, pwd, user -def read_csv(filename): - with open(filename, newline='') as csvfile: - data = list(csv.reader(csvfile)) - return data + return pd.read_csv(filename) + def read_template(filename): """ - Returns a Template object comprising the contents of the + Returns a Template object comprising the contents of the file specified by filename. """ - + with open(filename, 'r', encoding='utf-8') as template_file: template_file_content = template_file.read() return Template(template_file_content) + def main(): - # names, emails, reda, ws = get_contacts('mycontacts.txt') # read contacts - contacts = read_csv('contacts.csv') + contacts = get_contacts('contacts.csv') message_template = read_template('message.txt') # set up the SMTP server @@ -55,29 +40,31 @@ def main(): s.login(MY_ADDRESS, PASSWORD) # For each contact, send the email: - for i in range(len(contacts)): + for i in contacts.index: msg = MIMEMultipart() # create a message # add in the actual person name to the message template - message = message_template.substitute(SNAME=str(contacts[i][0]), FNAME=contacts[i][1], PWD=contacts[i][3], USER =contacts[i][4]) + contact_dict = {col: contacts[col][i] for col in contacts.columns} + message = message_template.substitute(contact_dict) # Prints out the message body for our sake print(message) # setup the parameters of the message - msg['From']=MY_ADDRESS - msg['To']=contacts[i][2] - msg['Subject']=SUBJECT - + msg['From'] = MY_ADDRESS + msg['To'] = contacts["email"][i] + msg['Subject'] = SUBJECT + # add in the message body msg.attach(MIMEText(message, 'html')) - + # send the message via the server set up earlier. s.send_message(msg) del msg - + # Terminate the SMTP session and close the connection s.quit() - + + if __name__ == '__main__': - main() \ No newline at end of file + main()