nowy mail i funkcja

This commit is contained in:
Mateusz Gruszczyński
2025-05-18 23:32:21 +02:00
parent f7c39c9585
commit 1b819dc403

70
app.py
View File

@ -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()