Use config file instead of multiple options

This commit is contained in:
Cyril Novel 2020-06-11 21:27:15 +02:00
commit 8d5f00a896
3 changed files with 100 additions and 44 deletions

View file

@ -1,3 +1,4 @@
import configparser
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
@ -14,36 +15,68 @@ months = ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'ao
'octobre', 'novembre', 'décembre']
class EmailSender:
def __init__(self, smtp_server, user, password):
self._smtp_server = smtp_server
self._user = user
self._pwd = password
print("Setup OK")
class DataPaths:
def __init__(self, mariages_path, members_path):
self._mariages_path = mariages_path
self._members_path = members_path
def send_paturlettre(self, recipients):
def mariages(self):
return self._mariages_path
def members(self):
return self._members_path
class Mailer:
def __init__(self, server, user, password):
self._server = server
self._usr = user
self._pwd = password
def server(self):
return self._server
def user(self):
return self._usr
def password(self):
return self._pwd
class EmailSender:
def __init__(self, mailer: Mailer, paths: DataPaths, receiver: str):
self._mailer = mailer
self._paths = paths
self._receiver = receiver
print("Email Sender is set up")
def send_paturlettre(self):
msg = MIMEMultipart('alternative')
msg['Subject'] = f'[Paturlettre] Semaine {get_week_number_and_span()[0]}'
msg['From'] = 'Paturlettre <paturlettre@kosmon.fr>'
msg['To'] = 'Diffusion Paturlettre <no_reply_paturlettre@kosmon.fr>'
msg.preamble = f'La Paturlettre de la semaine {get_week_number_and_span()[0]} !'
msg.attach(MIMEText(create_plain_email(), 'plain'))
msg.attach(MIMEText(create_email_from_template(), 'html'))
print("Msg OK")
print("Msg Header is set up")
conn = SMTP_SSL(self._smtp_server, port=465)
print("Conn OK")
conn.login(self._user, self._pwd)
print("Login OK")
events_previous, events_current, events_next = get_events(self._paths)
msg.attach(MIMEText(create_plain_email(events_previous, events_current, events_next),
'plain'))
msg.attach(MIMEText(create_html_templated(events_previous, events_current, events_next),
'html'))
print("Msg body is generated")
conn = SMTP_SSL(self._mailer.server(), port=465)
print("SMTP Connection OK")
conn.login(self._mailer.user(), self._mailer.password())
print("SMTP Login OK")
try:
conn.sendmail(msg['From'], 'diffusion_paturlettre@kosmon.fr', msg.as_string())
print("Send OK")
conn.sendmail(msg['From'], self._receiver, msg.as_string())
print("Paturlettre has been sent!")
finally:
conn.quit()
def create_email_from_template():
events_previous, events_current, events_next = get_events()
def create_html_templated(events_previous, events_current, events_next):
with open('../html_template/mail.html', 'r', encoding='utf-8') as tmp:
mail = tmp.read()
mail = mail.replace('{LogoAddress}',
@ -65,8 +98,7 @@ def create_email_from_template():
return mail
def create_plain_email():
events_previous, events_current, events_next = get_events()
def create_plain_email(events_previous, events_current, events_next):
wk_and_span = get_week_number_and_span()
mail_plain = f'Paturlettre - Semaine {wk_and_span[0]}\n'
mail_plain += f'du {wk_and_span[1].day} {months[wk_and_span[1].month - 1]}' \
@ -104,7 +136,9 @@ def create_html_string_for_day(day_name: str, events: list, last_day: bool) -> s
if not last_day and i == len(events) - 1:
style = "width: 100%; border-bottom: 1px dashed #9ba5ae;"
html_str += f' <tr style="{style}">\n'
html_str += f' <td class="genea_row"><span class="min_info"><b>{e.type_str()}</b> · {e.event_date_as_str()} </span><br />{e.event_description()}</td>\n'
html_str += f' <td class="genea_row"><span class="min_info">' \
f'<b>{e.type_str()}</b> · {e.event_date_as_str()} </span>' \
f'<br />{e.event_description()}</td>\n'
html_str += ' </tr>'
return html_str
@ -156,17 +190,23 @@ def create_plain_string_for_week(events: list):
return plain_str
def get_events():
def get_events(data_paths: DataPaths):
today = date.today()
monday = today - timedelta(days=today.weekday())
previous_monday = monday - timedelta(days=7)
next_monday = monday + timedelta(days=7)
previous_week_events = create_events_from_span(previous_monday,
previous_monday + timedelta(days=6))
previous_monday + timedelta(days=6),
data_paths.members(),
data_paths.mariages())
this_week_events = create_events_from_span(monday,
monday + timedelta(days=6))
monday + timedelta(days=6),
data_paths.members(),
data_paths.mariages())
next_week_events = create_events_from_span(next_monday,
next_monday + timedelta(days=6))
next_monday + timedelta(days=6),
data_paths.members(),
data_paths.mariages())
return previous_week_events, this_week_events, next_week_events
@ -176,19 +216,28 @@ def get_week_number_and_span():
return today.isocalendar()[1], monday, monday + timedelta(days=6)
def load_config(config_file) -> (Mailer, DataPaths, str):
config = configparser.ConfigParser()
config.read(config_file, encoding='utf-8')
mailer = Mailer(config['Mailer']['smtp_server'],
config['Mailer']['user'],
config['Mailer']['password'])
data_path = DataPaths(config['Data']['mariages'],
config['Data']['members'])
receiver = config['Destination']['receiver']
return mailer, data_path, receiver
def main():
parser = ArgumentParser(description='Send mail')
parser.add_argument('-s', '--smtp', dest='smtp_server',
help='Json files to process, multiple values accepted')
parser.add_argument('-u', '--user', dest='user',
help='Json files to process, multiple values accepted')
parser.add_argument('-p', '--password', dest='password',
help='Json files to process, multiple values accepted')
parser = ArgumentParser(description='Send Paturlettre mail')
parser.add_argument('-c', '--config', dest='config',
help='Config file to load')
args = parser.parse_args()
email_sender = EmailSender(args.smtp_server, args.user, args.password)
email_sender.send_paturlettre(None)
print("Done")
mailer, paths, receiver = load_config(args.config)
email_sender = EmailSender(mailer, paths, receiver)
email_sender.send_paturlettre()
print("Exiting script")
if __name__ == '__main__':