2026.03.29 20:00 Gitea_manager javítás előtt
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import os
|
||||
import smtplib
|
||||
import logging
|
||||
from email.mime.text import MIMEText
|
||||
@@ -8,14 +9,14 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from app.core.config import settings
|
||||
from app.core.i18n import locale_manager
|
||||
from app.services.config_service import config
|
||||
from app.db.session import AsyncSessionLocal # Szükséges a beállítások lekéréséhez
|
||||
from app.db.session import AsyncSessionLocal
|
||||
|
||||
logger = logging.getLogger("Email-Manager-2.0")
|
||||
|
||||
class EmailManager:
|
||||
@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 (Megmaradt az eredeti logika)."""
|
||||
"""HTML sablon generálása a fordítási fájlok alapján."""
|
||||
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)
|
||||
@@ -49,20 +50,16 @@ class EmailManager:
|
||||
@staticmethod
|
||||
async def send_email(recipient: str, template_key: str, variables: dict, lang: str = "hu", db: Optional[AsyncSession] = None):
|
||||
"""
|
||||
E-mail küldése admin-vezérelt szolgáltatóval (SendGrid vagy SMTP).
|
||||
E-mail küldése közvetlenül a privát SMTP szerveren keresztül.
|
||||
"""
|
||||
# 1. Belső session kezelés, ha kívülről nem kaptunk (pl. háttérfolyamatoknál)
|
||||
session_internal = False
|
||||
if db is None:
|
||||
db = AsyncSessionLocal()
|
||||
session_internal = True
|
||||
|
||||
try:
|
||||
# 2. Dinamikus beállítások lekérése az adatbázisból (Admin 2.0)
|
||||
provider = await config.get_setting(db, "email_provider", default="disabled")
|
||||
from_email = await config.get_setting(db, "emails_from_email", default="noreply@profibot.hu")
|
||||
from_name = await config.get_setting(db, "emails_from_name", default="Sentinel System")
|
||||
|
||||
# Check if emails are disabled via DB config
|
||||
provider = await config.get_setting(db, "email_provider", default="smtp")
|
||||
if provider == "disabled":
|
||||
logger.info(f"Email küldés letiltva (Admin config). Cél: {recipient}")
|
||||
return
|
||||
@@ -70,76 +67,37 @@ class EmailManager:
|
||||
html = EmailManager._get_html_template(template_key, variables, lang)
|
||||
subject = locale_manager.get(f"email.{template_key}_subject", lang=lang)
|
||||
|
||||
# 3. KÜLDÉSI LOGIKA VÁLASZTÁSA
|
||||
if provider == "sendgrid":
|
||||
api_key = await config.get_setting(db, "sendgrid_api_key")
|
||||
if api_key:
|
||||
return await EmailManager._send_via_sendgrid(api_key, from_email, from_name, recipient, subject, html)
|
||||
logger.warning("SendGrid szolgáltató kiválasztva, de nincs API kulcs!")
|
||||
smtp_host = os.getenv("SMTP_HOST", "mail.servicefinder.hu")
|
||||
smtp_port = int(os.getenv("SMTP_PORT", "465"))
|
||||
smtp_user = os.getenv("SMTP_USER", "noreply@servicefinder.hu")
|
||||
smtp_pass = os.getenv("SMTP_PASSWORD", "")
|
||||
|
||||
from_email = os.getenv("MAIL_FROM", "noreply@servicefinder.hu")
|
||||
from_name = os.getenv("MAIL_FROM_NAME", "ServiceFinder")
|
||||
|
||||
# Fallback vagy közvetlen SMTP
|
||||
smtp_cfg = await config.get_setting(db, "smtp_config", default={
|
||||
"host": "localhost", "port": 587, "user": "", "pass": "", "tls": True
|
||||
})
|
||||
logger.info(f"SMTP config retrieved: {smtp_cfg}")
|
||||
# Ha a default értéket kaptuk, próbáljuk a környezeti változókból felépíteni a konfigurációt
|
||||
import os
|
||||
env_host = os.getenv("SMTP_HOST")
|
||||
env_port = os.getenv("SMTP_PORT")
|
||||
env_user = os.getenv("SMTP_USER")
|
||||
env_pass = os.getenv("SMTP_PASSWORD")
|
||||
env_tls = os.getenv("SMTP_TLS", "False").lower() in ("true", "1", "yes")
|
||||
env_ssl = os.getenv("SMTP_SSL", "False").lower() in ("true", "1", "yes")
|
||||
logger.info(f"Env SMTP: host={env_host}, port={env_port}, tls={env_tls}, ssl={env_ssl}")
|
||||
# Felülírjuk a konfigurációt a környezeti változókkal, ha vannak
|
||||
if env_host:
|
||||
smtp_cfg["host"] = env_host
|
||||
if env_port:
|
||||
try:
|
||||
smtp_cfg["port"] = int(env_port)
|
||||
except:
|
||||
pass
|
||||
if env_user:
|
||||
smtp_cfg["user"] = env_user
|
||||
if env_pass:
|
||||
smtp_cfg["pass"] = env_pass
|
||||
# TLS/SSL kezelése: ha SSL igaz, akkor TLS legyen False (mert külön SMTP_SSL kapcsolat kell)
|
||||
# Egyszerűsítés: tls = not ssl (de a Mailpit esetén TLS=False, SSL=False)
|
||||
smtp_cfg["tls"] = env_tls
|
||||
# SSL esetén a port változhat, de a kódunk nem támogatja az SMTP_SSL-t, csak TLS-t.
|
||||
# A Mailpit nem igényel TLS-t, így maradjon False.
|
||||
if env_ssl:
|
||||
smtp_cfg["tls"] = False
|
||||
# Megjegyzés: SSL kapcsolathoz smtplib.SMTP_SSL kellene, de most nem implementáljuk.
|
||||
logger.info(f"Final SMTP config: {smtp_cfg}")
|
||||
smtp_cfg = {
|
||||
"host": smtp_host,
|
||||
"port": smtp_port,
|
||||
"user": smtp_user,
|
||||
"pass": smtp_pass
|
||||
}
|
||||
|
||||
logger.info(f"Using SMTP config: host={smtp_cfg['host']}, port={smtp_cfg['port']}, user={smtp_cfg['user']}")
|
||||
return await EmailManager._send_via_smtp(smtp_cfg, from_email, from_name, recipient, subject, html)
|
||||
|
||||
finally:
|
||||
if session_internal:
|
||||
await db.close()
|
||||
|
||||
@staticmethod
|
||||
async def _send_via_sendgrid(api_key: str, from_email: str, from_name: str, recipient: str, subject: str, html: str):
|
||||
try:
|
||||
from sendgrid import SendGridAPIClient
|
||||
from sendgrid.helpers.mail import Mail
|
||||
|
||||
message = Mail(
|
||||
from_email=(from_email, from_name),
|
||||
to_emails=recipient,
|
||||
subject=subject,
|
||||
html_content=html
|
||||
)
|
||||
sg = SendGridAPIClient(api_key)
|
||||
response = sg.send(message)
|
||||
logger.info(f"SendGrid siker: {response.status_code} -> {recipient}")
|
||||
return {"status": "success", "provider": "sendgrid"}
|
||||
except Exception as e:
|
||||
logger.error(f"SendGrid hiba: {str(e)}")
|
||||
return {"status": "error", "message": "SendGrid failed"}
|
||||
|
||||
@staticmethod
|
||||
async def _send_via_smtp(cfg: dict, from_email: str, from_name: str, recipient: str, subject: str, html: str):
|
||||
# Mock mode check: If APP_ENV=test or domain is example.com, skip SMTP and return success
|
||||
app_env = os.getenv("APP_ENV", "").lower()
|
||||
is_example_domain = recipient.endswith("@example.com") or "@example.com" in recipient
|
||||
if app_env == "test" or is_example_domain:
|
||||
logger.info(f"Mock mode: Skipping SMTP for {recipient} (APP_ENV={app_env}, is_example_domain={is_example_domain})")
|
||||
return {"status": "success", "provider": "mock", "message": "Email skipped in test mode"}
|
||||
|
||||
try:
|
||||
msg = MIMEMultipart()
|
||||
msg["From"] = f"{from_name} <{from_email}>"
|
||||
@@ -147,16 +105,25 @@ class EmailManager:
|
||||
msg["Subject"] = subject
|
||||
msg.attach(MIMEText(html, "html"))
|
||||
|
||||
with smtplib.SMTP(cfg["host"], cfg["port"], timeout=15) as server:
|
||||
if cfg.get("tls", True):
|
||||
# Port 465 uses SMTP_SSL directly instead of STARTTLS
|
||||
if cfg["port"] == 465:
|
||||
logger.info(f"Connecting via SMTP_SSL to {cfg['host']}:{cfg['port']}")
|
||||
with smtplib.SMTP_SSL(cfg["host"], cfg["port"], timeout=15) as server:
|
||||
user = cfg.get("user", "")
|
||||
passwd = cfg.get("pass", "")
|
||||
if user and passwd:
|
||||
server.login(user, passwd)
|
||||
server.send_message(msg)
|
||||
else:
|
||||
logger.info(f"Connecting via SMTP to {cfg['host']}:{cfg['port']}")
|
||||
with smtplib.SMTP(cfg["host"], cfg["port"], timeout=15) as server:
|
||||
# Explicit STARTTLS if not 465, though we expect 465
|
||||
server.starttls()
|
||||
# Mailpit nem támogatja az SMTP AUTH-ot, és ha üres string a user/pass, akkor se próbáljuk meg
|
||||
user = cfg.get("user", "")
|
||||
passwd = cfg.get("pass", "")
|
||||
# Ha a user/pass nem üres és nem csak idézőjelek, akkor login
|
||||
if user and passwd and user.strip() not in ('', '""') and passwd.strip() not in ('', '""'):
|
||||
server.login(user, passwd)
|
||||
server.send_message(msg)
|
||||
user = cfg.get("user", "")
|
||||
passwd = cfg.get("pass", "")
|
||||
if user and passwd:
|
||||
server.login(user, passwd)
|
||||
server.send_message(msg)
|
||||
|
||||
logger.info(f"SMTP siker -> {recipient}")
|
||||
return {"status": "success", "provider": "smtp"}
|
||||
@@ -164,4 +131,4 @@ class EmailManager:
|
||||
logger.error(f"SMTP hiba: {str(e)}")
|
||||
return {"status": "error", "message": str(e)}
|
||||
|
||||
email_manager = EmailManager()
|
||||
email_manager = EmailManager()
|
||||
|
||||
Reference in New Issue
Block a user