""" Send password reset emails to Feb 4 batch import users who never logged in. These users were imported with passwords but never received welcome emails. This script generates reset tokens (24h validity) and sends reset emails. Usage: Run on production server with DATABASE_URL set. """ import os import sys import secrets from datetime import datetime, timedelta # Add project root to path sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from database import SessionLocal, User, EmailLog import email_service # Users from Feb 4 batch import who never logged in TARGET_USER_IDS = [53, 54, 55, 57, 58, 59, 60, 61, 62, 63, 64] TOKEN_VALIDITY_HOURS = 24 BASE_URL = 'https://nordabiznes.pl' def main(): if not email_service.is_configured(): print("ERROR: Email service not configured. Set credentials in .env") sys.exit(1) db = SessionLocal() try: results = {'sent': [], 'failed': [], 'skipped': []} for user_id in TARGET_USER_IDS: user = db.query(User).get(user_id) if not user: results['skipped'].append(f"ID {user_id}: not found") continue if not user.is_active: results['skipped'].append(f"{user.email}: inactive") continue if user.last_login is not None: results['skipped'].append(f"{user.email}: already logged in") continue # Generate token token = secrets.token_urlsafe(32) expires = datetime.now() + timedelta(hours=TOKEN_VALIDITY_HOURS) user.reset_token = token user.reset_token_expires = expires db.commit() reset_url = f"{BASE_URL}/reset-password/{token}" # Send email try: success = email_service.send_password_reset_email(user.email, reset_url) if success: # Log the email log = EmailLog( email_type='password_reset', recipient_email=user.email, recipient_name=user.name, subject='Reset hasła - Norda Biznes Partner', status='sent', sent_at=datetime.now(), created_at=datetime.now(), ) db.add(log) db.commit() results['sent'].append(f"{user.name} <{user.email}>") print(f" OK: {user.name} <{user.email}>") else: results['failed'].append(f"{user.name} <{user.email}>: send returned False") print(f" FAIL: {user.name} <{user.email}>") except Exception as e: results['failed'].append(f"{user.name} <{user.email}>: {e}") print(f" ERROR: {user.name} <{user.email}>: {e}") print(f"\n{'='*50}") print(f"Sent: {len(results['sent'])}") print(f"Failed: {len(results['failed'])}") print(f"Skipped: {len(results['skipped'])}") if results['failed']: print(f"\nFailed details:") for f in results['failed']: print(f" - {f}") if results['skipped']: print(f"\nSkipped details:") for s in results['skipped']: print(f" - {s}") finally: db.close() if __name__ == '__main__': main()