85 lines
3.4 KiB
Python
Executable File
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()
|