84 lines
3.0 KiB
Python
Executable File
84 lines
3.0 KiB
Python
Executable File
#!/usr/bin/python2
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import argparse
|
|
import calendar
|
|
import smtplib
|
|
import sys
|
|
import codecs
|
|
|
|
from datetime import datetime
|
|
from email.mime.text import MIMEText
|
|
from email.header import Header
|
|
from email import charset
|
|
|
|
|
|
def createMail(args, target_date, diff):
|
|
fvars = {"date": target_date.strftime("%d.%m.%Y"), "diff":diff.days}
|
|
body = codecs.open(args.msg_template, 'r', "utf-8").read() % fvars
|
|
|
|
msg = MIMEText(body, _charset="UTF-8")
|
|
|
|
msg['Subject'] = Header(args.subject, "utf-8") % fvars
|
|
msg['From'] = args.From
|
|
msg['To'] = args.to
|
|
return msg
|
|
|
|
|
|
def getNextCleaningDate(cal, args):
|
|
if args.first:
|
|
my_cal = cal
|
|
else:
|
|
my_cal = reversed(cal)
|
|
|
|
for week in my_cal:
|
|
if week[args.day] != 0:
|
|
return week[args.day]
|
|
|
|
|
|
def main(args):
|
|
today = datetime.today()
|
|
cal = calendar.monthcalendar(today.year, today.month)
|
|
|
|
target_day = getNextCleaningDate(cal, args)
|
|
target_date = datetime(today.year, today.month, target_day)
|
|
diff = target_date - today
|
|
|
|
print("target_day", target_day)
|
|
print("target_date", target_date)
|
|
print("diff", diff)
|
|
|
|
if diff.days in args.reminder_days:
|
|
charset.add_charset('utf-8', charset.QP, charset.QP)
|
|
msg = createMail(args, target_date, diff)
|
|
print(type(msg.as_string()))
|
|
print("msg", msg.as_string())
|
|
|
|
if args.debug:
|
|
return
|
|
|
|
s = smtplib.SMTP(args.host)
|
|
s.set_debuglevel(3)
|
|
s.sendmail(args.From, [args.to], msg.as_string())
|
|
s.quit()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
parser = argparse.ArgumentParser(description="The ctdo configurable mail reminder script. " \
|
|
"Works on the last given day in month. Sends a mail with given " \
|
|
"'msg_template' if today is a day in the list of 'reminder_days'")
|
|
|
|
parser.add_argument('-d', "--day", type=int, choices=range(7), required=True, help="which last day in month? monday=0, tuesday=1, ...")
|
|
parser.add_argument('-r', "--reminder_days", type=int, action="append", choices=range(0, 31), required=True, help="on which day to remind the crowd? 1 will be one day before, 7 a week before. May be specified multiple times.")
|
|
parser.add_argument('-m', "--msg_template", required=True, help="The path to a a file with predefined email text to send. You can use %%(date)s and %%(diff) variables in the text.")
|
|
parser.add_argument('-s', "--subject", default="Das bissken Haushalt aka Aufräumtag im CTDO", help="mail subject")
|
|
parser.add_argument('-f', "--From", default="CTDOReminder <discuss@lists.chaostreff-dortmund.de>", help="mail from")
|
|
parser.add_argument('-t', "--to", default="discuss@lists.chaostreff-dortmund.de", help="mail to")
|
|
parser.add_argument('-H', "--host", default="", help="the smtp server to send to")
|
|
parser.add_argument('-D', "--debug", action="store_true", help="don't send the mail")
|
|
parser.add_argument('-F', "--first", action="store_true", help="take the first instead of last")
|
|
|
|
args = parser.parse_args(sys.argv[1:])
|
|
|
|
main(args)
|