import os import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from app.core.config import settings class EmailManager: @staticmethod def _render_template(template_key: str, variables: dict, lang: str = "hu") -> str: base_dir = "/app/app/templates/emails" file_path = f"{base_dir}/{lang}/{template_key}.html" if not os.path.exists(file_path): return "" with open(file_path, "r", encoding="utf-8") as f: body_html = f.read() for k, v in variables.items(): body_html = body_html.replace(f"{{{{{k}}}}}", str(v)) body_html = body_html.replace(f"{{{k}}}", str(v)) return body_html @staticmethod def _subject(template_key: str) -> str: subjects = { "registration": "Regisztráció - Service Finder", "password_reset": "Jelszó visszaállítás - Service Finder", "notification": "Értesítés - Service Finder", } return subjects.get(template_key, "Értesítés - Service Finder") @staticmethod async def send_email(recipient: str, template_key: str, variables: dict, user_id: int = None, lang: str = "hu"): if settings.EMAIL_PROVIDER == "disabled": return {"status": "disabled"} html = EmailManager._render_template(template_key, variables, lang=lang) subject = EmailManager._subject(template_key) provider = settings.EMAIL_PROVIDER if provider == "auto": provider = "sendgrid" if settings.SENDGRID_API_KEY else "smtp" # 1) SendGrid API (stabil) if provider == "sendgrid" and settings.SENDGRID_API_KEY: try: from sendgrid import SendGridAPIClient from sendgrid.helpers.mail import Mail message = Mail( from_email=(settings.EMAILS_FROM_EMAIL, settings.EMAILS_FROM_NAME), to_emails=recipient, subject=subject, html_content=html or "
Üzenet
", ) sg = SendGridAPIClient(settings.SENDGRID_API_KEY) sg.send(message) return {"status": "success", "provider": "sendgrid"} except Exception as e: # ha auto módban vagyunk, esünk vissza smtp-re if settings.EMAIL_PROVIDER != "auto": return {"status": "error", "provider": "sendgrid", "message": str(e)} # 2) SMTP fallback if not settings.SMTP_HOST or not settings.SMTP_USER or not settings.SMTP_PASSWORD: return {"status": "error", "provider": "smtp", "message": "SMTP not configured"} try: msg = MIMEMultipart() msg["From"] = f"{settings.EMAILS_FROM_NAME} <{settings.EMAILS_FROM_EMAIL}>" msg["To"] = recipient msg["Subject"] = subject msg.attach(MIMEText(html or "Üzenet", "html")) with smtplib.SMTP(settings.SMTP_HOST, settings.SMTP_PORT, timeout=15) as server: if settings.SMTP_USE_TLS: server.starttls() server.login(settings.SMTP_USER, settings.SMTP_PASSWORD) server.send_message(msg) return {"status": "success", "provider": "smtp"} except Exception as e: return {"status": "error", "provider": "smtp", "message": str(e)} email_manager = EmailManager()