Files
service-finder/backend/app/services/email_manager.py

85 lines
3.4 KiB
Python
Executable File

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 "<p>Üzenet</p>",
)
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()