diff --git a/app.py b/app.py index 084f7f2..fa39b06 100644 --- a/app.py +++ b/app.py @@ -165,7 +165,7 @@ def get_smtp_config(): return config -def send_email_batch(users, smtp_config, mails_per_pack=100, time_per_pack=60, dry_run=False, inactive_range=None): +def send_email_batch(users, smtp_config, mails_per_pack=100, time_per_pack=60, dry_run=False): import os template_path = "mail_template.html" @@ -180,18 +180,6 @@ def send_email_batch(users, smtp_config, mails_per_pack=100, time_per_pack=60, d print(f"❌ Błąd podczas odczytu szablonu HTML: {e}") return - if inactive_range: - min_days, max_days = inactive_range - now_ts = int(datetime.now().timestamp()) - filtered_users = [] - for user in users: - last_access = user['access'] or 0 - days_inactive = (now_ts - last_access) / 86400 - if min_days <= days_inactive <= max_days: - filtered_users.append(user) - users = filtered_users - print(f"📨 Wysyłka maili tylko dla użytkowników nieaktywnych od {min_days} do {max_days} dni ({len(users)} osób)") - try: smtp = smtplib.SMTP(smtp_config["host"], int(smtp_config["port"])) smtp.ehlo() @@ -340,7 +328,7 @@ def main(): type=str, help="Zakres dni nieaktywności w formacie min-max, np. 360-1825 (tylko dla wysyłki maili)" ) - + args = parser.parse_args() inactive_range = None @@ -349,16 +337,15 @@ def main(): min_days, max_days = map(int, args.inactive_since.split('-')) inactive_range = (min_days, max_days) except Exception as e: - print(f"Błąd parsowania zakresu dni w --inactive-since: {e}") + print(f"Błąd parsowania zakresu dni: {e}") exit(1) if args.send_test: test_user = { 'name': 'Testowy Użytkownik', 'mail': args.send_test, - 'created': int(datetime.now().timestamp()) - (86400 * 365 * 2) # 2 lata temu + 'created': int(datetime.now().timestamp()) - (86400 * 365 * 2) } - print(f"📬 Wysyłka testowego maila na: {test_user['mail']}") send_email_batch([test_user], smtp_config, mails_per_pack=1, time_per_pack=0, dry_run=False) return @@ -397,12 +384,19 @@ def main(): if (user.get('post_count') or 0) > 0: continue + last_access = user['access'] or 0 + days_inactive = (now_ts - last_access) / 86400 + + # Nowa logika oznaczania nieaktywnych + is_inactive_by_days = (args.days_inactive is not None) and (days_inactive > args.days_inactive) + is_inactive_by_range = inactive_range and (inactive_range[0] <= days_inactive <= inactive_range[1]) + + user['inactive'] = is_inactive_by_days or is_inactive_by_range user['temp_email'] = is_temp_email(user['mail']) user['email_valid'] = not is_fake_email(user['mail']) and not user['temp_email'] if args.only_invalid_emails: if not user['email_valid']: - user['inactive'] = True final_candidates.append(user) continue @@ -414,11 +408,6 @@ def main(): skipped_veterans += 1 continue - last_access = user['access'] or 0 - user['inactive'] = (args.days_inactive is not None) and ((now_ts - last_access) > args.days_inactive * 86400) - user['temp_email'] = is_temp_email(user['mail']) - user['email_valid'] = not is_fake_email(user['mail']) and not user['temp_email'] - if user['inactive']: inactive_count += 1 if not user['email_valid']: @@ -428,7 +417,7 @@ def main(): if args.validate or user['inactive'] or not user['email_valid']: final_candidates.append(user) - + final_candidates = [u for u in final_candidates if (u.get('points') or 0) == 0] if args.report_domains: @@ -453,42 +442,37 @@ def main(): if args.send_mails: send_email_batch( - final_candidates, + [u for u in final_candidates if u['inactive']], # Tylko nieaktywni smtp_config, args.mails_per_pack, - args.time_per_pack, - inactive_range=inactive_range + args.time_per_pack ) print("\n📋 Parametry filtrowania:") if args.days_inactive: - print(f"- Nieaktywni: brak logowania przez ≥ {args.days_inactive} dni (~{days_to_years(args.days_inactive)} lat)") - print(f"- Weterani: konta zarejestrowane w roku ≤ {args.veteran_year}") - print(f"- Pominięci weterani: logowanie w ciągu ostatnich ≤ {args.recent_login_days} dni (~{days_to_years(args.recent_login_days)} lat)") - if args.inactive_since: - min_days, max_days = map(int, args.inactive_since.split('-')) - print(f"- Wysyłka maili tylko dla nieaktywnych od {min_days} do {max_days} dni (~{days_to_years(min_days)}-{days_to_years(max_days)} lat)") + print(f"- Nieaktywni: > {args.days_inactive} dni (~{days_to_years(args.days_inactive)} lat)") + if inactive_range: + print(f"- Zakres nieaktywności: {inactive_range[0]}-{inactive_range[1]} dni (~{days_to_years(inactive_range[0])}-{days_to_years(inactive_range[1])} lat)") + print(f"- Weterani: konta przed {args.veteran_year}") + print(f"- Pominięci weterani: logowanie w ostatnich {args.recent_login_days} dniach") print("\n📊 Podsumowanie:") - print(f"- Całkowita liczba użytkowników w bazie: {len(users)}") + print(f"- Całkowita liczba użytkowników: {len(users)}") print(f"- Pominięci z punktami: {skipped_with_points}") - print(f"- Nieaktywni (> {args.days_inactive} dni): {inactive_count}") - print(f"- Z niepoprawnym e-mailem (MX lub tymczasowy): {invalid_email_count}") + print(f"- Nieaktywni: {inactive_count}") + print(f"- Z niepoprawnym e-mailem: {invalid_email_count}") print(f"- Z tymczasowym e-mailem: {temp_email_count}") print(f"- Kandydaci do usunięcia: {len(final_candidates)}") - print(f"- Pominięci jako aktywni weterani: {skipped_veterans}") - - if args.only_invalid_emails: - print("- Tryb: tylko użytkownicy z nieprawidłowymi adresami e-mail") + print(f"- Pominięci weterani: {skipped_veterans}") if args.delete: confirm_delete() if not args.drupal_path: - print("❌ Brak parametru --drupal-path. Nie można usunąć użytkowników bez ścieżki do Drupala.") + print("❌ Brak ścieżki do Drupala!") sys.exit(1) - for u in tqdm(final_candidates, desc="Usuwanie użytkowników"): + for u in tqdm(final_candidates, desc="Usuwanie"): delete_user_via_php(u['uid'], args.drupal_path) - print(f"✅ Usunięto {len(final_candidates)} użytkowników przez delete_user.php") + print(f"✅ Usunięto {len(final_candidates)} użytkowników") if __name__ == '__main__': main() \ No newline at end of file