Files
sqlalchemy-fastapi-pydentic…/server/backend/password.py
2025-09-25 17:54:34 +03:00

69 lines
2.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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