06/15 Phase 1 + 2 codes
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
"""Email service. Sends via SMTP relay (Brevo); falls back to console log in dev."""
|
||||
import smtplib
|
||||
from email.message import EmailMessage
|
||||
from flask import current_app
|
||||
|
||||
|
||||
def send_email(to_addr: str, subject: str, body: str) -> bool:
|
||||
cfg = current_app.config
|
||||
server = cfg.get("MAIL_SERVER")
|
||||
|
||||
# Dev fallback: no SMTP configured -> log to console.
|
||||
if not server:
|
||||
current_app.logger.info(
|
||||
"[DEV EMAIL] to=%s subject=%s\n%s", to_addr, subject, body
|
||||
)
|
||||
return True
|
||||
|
||||
msg = EmailMessage()
|
||||
msg["From"] = f"{cfg.get('MAIL_FROM_NAME')} <{cfg.get('MAIL_FROM')}>"
|
||||
msg["To"] = to_addr
|
||||
msg["Subject"] = subject
|
||||
msg.set_content(body)
|
||||
|
||||
try:
|
||||
with smtplib.SMTP(server, cfg.get("MAIL_PORT", 587), timeout=15) as s:
|
||||
if cfg.get("MAIL_USE_TLS"):
|
||||
s.starttls()
|
||||
if cfg.get("MAIL_USERNAME"):
|
||||
s.login(cfg.get("MAIL_USERNAME"), cfg.get("MAIL_PASSWORD"))
|
||||
s.send_message(msg)
|
||||
return True
|
||||
except Exception as exc: # noqa: BLE001
|
||||
current_app.logger.error("Email send failed: %s", exc)
|
||||
return False
|
||||
Reference in New Issue
Block a user