Compare commits

..

No commits in common. "d268720796c5710950d738bf5bc1b31bb4c9128e" and "bbe48d2c3846d0a266601ba3cd5e313896d3e1f3" have entirely different histories.

6 changed files with 15 additions and 58 deletions

1
.gitignore vendored
View file

@ -3,4 +3,3 @@ vars.py
message.html message.html
.DS_Store .DS_Store
*.pyc *.pyc
venv

View file

@ -2,27 +2,16 @@
Easily send mails via SMTP and python Easily send mails via SMTP and python
## Installation ## Setup
To install the requirements, run the following command
```
python -m pip install -r requirements.txt
```
## Usage
### Setup
1. Copy `vars.py.example` to `vars.py` 1. Copy `vars.py.example` to `vars.py`
2. Setup `vars.py` with your credentials and config 2. Setup `vars.py` with your credentials and config
3. Adapt `message.html` and save your contact list to `contacts.csv` 3. Adapt `message.htmt` and save your contact list to `contacts.csv`
### Send mail ## Usage
Just run ```python mail.py```
```sh
python mail.py
```
## Templating ## Templating
You can use the keys from your `csv` directly, prepending a `$` sign (case sensitive!). For example: You can use the keys from your `csv` directly, prepending a `$` sign. For example:
``` ```
Hello $name, your value is $value! Hello $name, your value is $value!
``` ```
@ -35,13 +24,3 @@ With a `contacts.csv` looking like:
| name | value | | name | value |
|--------|-------| |--------|-------|
| h4xx0r | 1337 | | h4xx0r | 1337 |
## Options
### Sending behavior
Some mail servers will block the requests, if too many are sent too fast. You can use the variables to add delays:
- `WAIT_EVERY` the amount of mails sent at once
- `DELAY_SEC` the amount of seconds to wait between sending the next batch
### Other options
- `LOGLEVEL` the logging level, set to `'DEBUG'` for most output
- `DRY_RUN` if set to `True`, the mails wont get sent, but the output is generated as if they would be sent. Good for testing and best to use with `LOGLEVEL = 'DEBUG'`

26
mail.py
View file

@ -1,9 +1,10 @@
import logging
import smtplib import smtplib
import time import time
from string import Template
from email.mime.multipart import MIMEMultipart from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText from email.mime.text import MIMEText
from string import Template
import pandas as pd import pandas as pd
@ -16,8 +17,6 @@ def get_contacts(filename):
read from a file specified by filename. read from a file specified by filename.
""" """
logging.debug(f'Loading contacts from {filename}...')
return pd.read_csv(filename) return pd.read_csv(filename)
@ -33,10 +32,6 @@ def read_template(filename):
def main(): def main():
logging.basicConfig(level=LOGLEVEL, format='%(asctime)s - %(levelname)s - %(message)s')
logging.info('Starting pymail')
contacts = get_contacts('contacts.csv') contacts = get_contacts('contacts.csv')
message_template = read_template('message.html') message_template = read_template('message.html')
@ -44,13 +39,10 @@ def main():
s = smtplib.SMTP(HOST, PORT) s = smtplib.SMTP(HOST, PORT)
s.starttls() s.starttls()
s.login(MY_ADDRESS, PASSWORD) s.login(MY_ADDRESS, PASSWORD)
logging.debug('Mail server is set up.')
logging.info(f'Starting to send mails to {len(contacts.index)} recipients, this might take a while...')
# For each contact, send the email: # For each contact, send the email:
for i in contacts.index: for i in contacts.index:
logging.info(f"Sending email {i+1} of {len(contacts.index)}\n") print(f"Sending email {i+1}\n")
msg = MIMEMultipart() # create a message msg = MIMEMultipart() # create a message
# add in the actual person name to the message template # add in the actual person name to the message template
@ -58,7 +50,7 @@ def main():
message = message_template.substitute(contact_dict) message = message_template.substitute(contact_dict)
# Prints out the message body for our sake # Prints out the message body for our sake
logging.debug(f"{message}\n") print(f"{message}\n")
# setup the parameters of the message # setup the parameters of the message
msg['From'] = MY_ADDRESS msg['From'] = MY_ADDRESS
@ -68,20 +60,16 @@ def main():
# add in the message body # add in the message body
msg.attach(MIMEText(message, 'html')) msg.attach(MIMEText(message, 'html'))
if not DRY_RUN: # send the message via the server set up earlier.
# send the message via the server set up earlier. s.send_message(msg)
s.send_message(msg)
del msg del msg
# Wait for DELAY_SEC seconds every WAIT_EVERY-th message
if (i + 1) % WAIT_EVERY == 0: if (i + 1) % WAIT_EVERY == 0:
time.sleep(DELAY_SEC) time.sleep(DELAY_SEC)
# Terminate the SMTP session and close the connection # Terminate the SMTP session and close the connection
s.quit() s.quit()
logging.info('Done!')
if __name__ == '__main__': if __name__ == '__main__':
main() main()

View file

@ -1,5 +0,0 @@
<html>
<body>
<p>Hello $name, your value is $value!</p>
</body>
</html>

View file

@ -1 +0,0 @@
pandas

View file

@ -1,5 +1,5 @@
SUBJECT = '' SUBJECT = ''
MAIL_COLUMN = '' EMAIL_COLUMN = ''
MY_ADDRESS = 'example@domain.tld' MY_ADDRESS = 'example@domain.tld'
PASSWORD = 'p4ssw0rd' PASSWORD = 'p4ssw0rd'
@ -8,6 +8,3 @@ PORT = 587
WAIT_EVERY = 5 WAIT_EVERY = 5
DELAY_SEC = 0 DELAY_SEC = 0
LOGLEVEL = 'INFO'
DRY_RUN = True