MorphGuard / src /utils /email_client.py
juanquy's picture
Implement registration role request, register link in login form, and background email alerts to sales@freshbeats.ai on login/registration
a86e722
Raw
History Blame Contribute Delete
2.15 kB
import os
import smtplib
import logging
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from threading import Thread
logger = logging.getLogger(__name__)
def _send_email_async(subject: str, body: str):
"""Internal function running on a background thread to send the email."""
smtp_host = os.environ.get('SMTP_HOST')
smtp_port = os.environ.get('SMTP_PORT', '587')
smtp_user = os.environ.get('SMTP_USER')
smtp_pass = os.environ.get('SMTP_PASSWORD')
to_email = 'sales@freshbeats.ai'
# If credentials are not configured, print to logs/stdout and exit cleanly
if not smtp_host or not smtp_user or not smtp_pass:
logger.warning("Email notification skipped: SMTP environment variables (SMTP_HOST, SMTP_USER, SMTP_PASSWORD) are not fully configured.")
logger.info(f"[Email Stub to {to_email}] Subject: {subject}\nBody:\n{body}")
return
try:
# Create message
msg = MIMEMultipart()
msg['From'] = smtp_user
msg['To'] = to_email
msg['Subject'] = subject
msg.attach(MIMEText(body, 'plain'))
# Connect and send
server = smtplib.SMTP(smtp_host, int(smtp_port), timeout=10)
server.starttls()
server.login(smtp_user, smtp_pass)
server.sendmail(smtp_user, to_email, msg.as_string())
server.quit()
logger.info(f"Notification email successfully sent to {to_email}")
except Exception as e:
logger.error(f"Failed to send SMTP notification email to {to_email}: {e}")
def send_notification_email(subject: str, body: str):
"""
Sends a notification email to sales@freshbeats.ai.
This runs asynchronously on a background thread to prevent blocking the request lifecycle.
"""
# Only execute if running in HuggingFace Spaces environment
if os.environ.get('HF_SPACE', '0') == '1':
thread = Thread(target=_send_email_async, args=(subject, body))
thread.daemon = True
thread.start()
else:
logger.info(f"Local development mode - skipping HF email alert: {subject}")