from sqlalchemy import extract from database import engine, SessionLocal import models import logging, sys import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.application import MIMEApplication from os.path import exists import datetime from create_payment_slip import create_payment_slip import os logging.basicConfig(stream=sys.stderr, level=logging.DEBUG) def payment_slip_delivered(member: models.Members, year: int): return db.query(models.Deliveries.delivery_date)\ .filter(models.Deliveries.member_id == member.id, extract('year', models.Deliveries.delivery_date) == year)\ .count() def send_mail(member: models.Members): delivered = payment_slip_delivered(member, 2024) if delivered: logging.debug(f'Member: {member.member_surname} already mailed or delivered!') return smtp_server = 'mail.gmx.com' smtp_port = 587 smtp_username = 'zisco@gmx.at' smtp_password = '57spunk07' from_email = 'sv.stthomas@gmx.at' to_email = member.member_email subject = 'Mitgliedsbeitrag 2024' body = f'Liebes Mitglied,\n\nDein Zahlschein für 2024 liegt bei.\nDu kannst gerne mittels beiliegendem, aufgedrucktem QR-Code überweisen.\nDanke sagt Dein Team vom Sportverein!' msg = MIMEMultipart() msg['From'] = from_email msg['To'] = to_email msg['Subject'] = subject msg.attach(MIMEText(body)) path_to_file = os.path.join(os.getenv('APPDATA'), "sust", "payment_slips","mail",f"{member.member_zip}_payment_slip_member{member.id}.pdf") if not exists(path_to_file): create_payment_slip(member=member) with open(path_to_file, 'rb') as f: attachment = MIMEApplication(f.read(), _subtype='pdf') attachment.add_header('Content-Disposition', 'attachment', filename=f'{member.member_zip}_payment_slip_member{member.id}.pdf') msg.attach(attachment) with smtplib.SMTP(smtp_server, smtp_port) as smtp: smtp.starttls() smtp.login(smtp_username, smtp_password) smtp.send_message(msg) newDelivery = models.Deliveries(delivery_date = datetime.datetime.now(), member_id = member.id, delivered_by_id = 186, delivery_year = datetime.date.today()) db.add(newDelivery) db.commit() logging.debug(f'Sent mail to {member.member_email}') db = SessionLocal() models.Base.metadata.create_all(bind=engine) #members = db.query(models.Members).filter(models.Members.member_email != None, ~models.Members.id.in_([183,51,200,49])).all() #members = db.query(models.Members).filter(models.Members.member_active == True).all() #members = db.query(models.Members).filter(models.Members.id.in_([2,3,9,199]), models.Members.member_active == True, models.Members.member_printed == False).all() members = db.query(models.Members).filter(models.Members.id.in_([73,142])).all() for member in members: send_mail(member=member)