import os import string import secrets import smtplib from email.message import EmailMessage from dotenv import load_dotenv def generate_password(length: int = 12) -> str: """Генерация пароля: минимум 1 буква, 1 цифра и 1 спецсимвол""" if length < 3: raise ValueError("Длина пароля должна быть минимум 3 символа") # обязательные категории password = [ secrets.choice(string.ascii_letters), secrets.choice(string.digits), secrets.choice(string.punctuation), ] # остальные символы all_chars = string.ascii_letters + string.digits + string.punctuation password += [secrets.choice(all_chars) for _ in range(length - 3)] # перемешиваем secrets.SystemRandom().shuffle(password) return "".join(password) load_dotenv() def send_password(user_info): smtp_domain = os.getenv("SMTP_DOMAIN") smtp_port = int(os.getenv("SMTP_PORT", "587")) mail_login = os.getenv("MAIL_LOGIN") mail_password = os.getenv("MAIL_PASSWORD") msg = EmailMessage() msg["From"] = mail_login msg["To"] = user_info.email msg["Subject"] = "Ваш новый пароль" msg.set_content( f"Здравствуйте!\n\n" f"Ваш новый пароль: {user_info.new_password}\n\n" "Рекомендуем сразу его сменить." ) try: if smtp_port == 465: # SSL-соединение сразу with smtplib.SMTP_SSL(smtp_domain, smtp_port, timeout=10) as smtp: smtp.login(mail_login, mail_password) smtp.send_message(msg) else: # STARTTLS (обычно порт 587) with smtplib.SMTP(smtp_domain, smtp_port, timeout=10) as smtp: smtp.ehlo() smtp.starttls() smtp.ehlo() smtp.login(mail_login, mail_password) smtp.send_message(msg) print(f"Пароль отправлен на {user_info.email}") except Exception as e: # Логируй ошибку, но не пались паролем в логах! print(f"Ошибка при отправке письма: {e}") raise