Use config file instead of multiple options
This commit is contained in:
parent
dfb4b271f6
commit
8d5f00a896
3 changed files with 100 additions and 44 deletions
|
|
@ -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__':
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue