import smtplib import subprocess import json import os from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from datetime import date, timedelta import calendar as cal_module from bills import load_bills EMAIL = "bonna61@gmail.com" APP_PASSWORD = "qowu zcff dbtk kqbs" def send_email(subject, body_html, body_text): msg = MIMEMultipart("alternative") msg["Subject"] = subject msg["From"] = f"Moon Household Budget <{EMAIL}>" msg["To"] = EMAIL msg.attach(MIMEText(body_text, "plain")) msg.attach(MIMEText(body_html, "html")) with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server: server.login(EMAIL, APP_PASSWORD) server.sendmail(EMAIL, EMAIL, msg.as_string()) def mac_notification(title, message): script = f'display notification "{message}" with title "{title}" sound name "Default"' subprocess.run(["osascript", "-e", script]) def bills_due_in(days): today = date.today() target = today + timedelta(days=days) all_bills = load_bills() due = [] for b in all_bills: if not b.get("active", True): continue if b.get("autopay", False): continue if not b.get("remind", True): continue due_day = b.get("due_day") if not due_day: continue _, num_days = cal_module.monthrange(target.year, target.month) due_day_clamped = min(due_day, num_days) bill_date = date(target.year, target.month, due_day_clamped) if bill_date == target: due.append({**b, "due_date": bill_date}) return due def check_and_send_reminders(): sent = [] for days_ahead, label in [(3, "in 3 days"), (0, "TODAY")]: due = bills_due_in(days_ahead) if not due: continue total = sum(b.get("amount", 0) for b in due if b.get("amount")) # Mac notifications โ one per bill for b in due: amt = f"${b['amount']:.2f}" if b.get("amount") else "amount varies" mac_notification( f"Bill Due {label.title()}", f"{b['name']} โ {amt}" ) # Email โ one digest subject = f"๐ Moon Budget: {len(due)} bill{'s' if len(due) != 1 else ''} due {label}" rows = "" for b in due: amt = f"${b['amount']:.2f}" if b.get("amount") else "โ" cat = b.get("category", "") rows += f"""
Bill reminder โ due {label}
Moon Household Budget ยท sent to bonna61@gmail.com