2026.06.05 frontend javítgatás és új belépési logika megvalósítva
This commit is contained in:
@@ -16,27 +16,12 @@ from app.db.session import AsyncSessionLocal
|
||||
logger = logging.getLogger("Email-Manager-2.0")
|
||||
|
||||
class EmailManager:
|
||||
@staticmethod
|
||||
def _get_base_url() -> str:
|
||||
"""Return the appropriate base URL for email links."""
|
||||
# Check environment variable first
|
||||
base_url = os.getenv("EMAIL_BASE_URL")
|
||||
if base_url:
|
||||
return base_url.rstrip('/')
|
||||
|
||||
# Fallback to dev domain for external access
|
||||
return "https://dev.servicefinder.hu"
|
||||
|
||||
@staticmethod
|
||||
def _build_verification_link(token: str) -> str:
|
||||
"""Build verification link with proper path."""
|
||||
base = EmailManager._get_base_url()
|
||||
# Use frontend verification route (adjust if needed)
|
||||
return f"{base}/verify?token={token}"
|
||||
|
||||
@staticmethod
|
||||
def _get_html_template(template_key: str, variables: dict, lang: str = "hu") -> str:
|
||||
"""HTML sablon generálása a fordítási fájlok alapján."""
|
||||
"""HTML sablon generálása a fordítási fájlok alapján.
|
||||
|
||||
The caller MUST provide a 'link' key in variables. No fallback guessing.
|
||||
"""
|
||||
greeting = locale_manager.get(f"email.{template_key}_greeting", lang=lang, **variables)
|
||||
body = locale_manager.get(f"email.{template_key}_body", lang=lang, **variables)
|
||||
button_text = locale_manager.get(f"email.{template_key}_button", lang=lang)
|
||||
@@ -44,10 +29,10 @@ class EmailManager:
|
||||
|
||||
link_fallback_text = locale_manager.get("email.link_fallback", lang=lang)
|
||||
|
||||
# If link is not provided but token is, build verification link
|
||||
# Strict: only use variables.get('link'), no guessing
|
||||
link = variables.get('link')
|
||||
if not link and 'token' in variables:
|
||||
link = EmailManager._build_verification_link(variables['token'])
|
||||
if not link:
|
||||
logger.error(f"No 'link' variable provided for template '{template_key}' (lang={lang})")
|
||||
|
||||
return f"""
|
||||
<html>
|
||||
@@ -83,8 +68,14 @@ class EmailManager:
|
||||
session_internal = True
|
||||
|
||||
try:
|
||||
# Check if emails are disabled via DB config
|
||||
provider = await config.get_setting(db, "email_provider", default="smtp")
|
||||
# --- FIX: Wrap DB config lookup in try-except with env fallback ---
|
||||
# If the DB query fails (e.g. enum mismatch), fall back to environment variable
|
||||
try:
|
||||
provider = await config.get_setting(db, "email_provider", default=None)
|
||||
except Exception as cfg_err:
|
||||
logger.warning(f"DB config error reading email_provider: {cfg_err}. Falling back to ENV variables...")
|
||||
provider = None
|
||||
|
||||
if provider == "disabled":
|
||||
logger.info(f"Email küldés letiltva (Admin config). Cél: {recipient}")
|
||||
return {"status": "success", "provider": "disabled", "message": "Email disabled by admin config"}
|
||||
@@ -92,8 +83,9 @@ class EmailManager:
|
||||
html = EmailManager._get_html_template(template_key, variables, lang)
|
||||
subject = locale_manager.get(f"email.{template_key}_subject", lang=lang)
|
||||
|
||||
# Get email provider from environment
|
||||
email_provider = os.getenv("EMAIL_PROVIDER", "smtp").lower()
|
||||
# Determine email provider: DB config > ENV > fallback to 'smtp'
|
||||
email_provider_raw = provider if provider else os.getenv("EMAIL_PROVIDER", "smtp")
|
||||
email_provider = str(email_provider_raw).lower().strip()
|
||||
|
||||
if email_provider == "brevo_api":
|
||||
result = await EmailManager._send_via_brevo_api(recipient, subject, html, variables)
|
||||
@@ -243,7 +235,14 @@ class EmailManager:
|
||||
else:
|
||||
logger.info(f"Connecting via SMTP to {smtp_host}:{smtp_port}")
|
||||
with smtplib.SMTP(smtp_host, smtp_port, timeout=15) as server:
|
||||
server.starttls()
|
||||
# Try STARTTLS, but fall back to plain if server doesn't support it
|
||||
# (e.g. local Mailpit for testing)
|
||||
try:
|
||||
server.starttls()
|
||||
except smtplib.SMTPNotSupportedError:
|
||||
logger.warning(f"STARTTLS not supported by {smtp_host}:{smtp_port}, sending in plain text")
|
||||
except Exception:
|
||||
logger.warning(f"STARTTLS failed on {smtp_host}:{smtp_port}, sending in plain text")
|
||||
if smtp_user and smtp_pass:
|
||||
server.login(smtp_user, smtp_pass)
|
||||
server.send_message(msg)
|
||||
|
||||
Reference in New Issue
Block a user