Spaces:
Running
Running
| import logging | |
| import smtplib | |
| from email.message import EmailMessage | |
| from app.core.config import settings | |
| logger = logging.getLogger(__name__) | |
| def _send_email(to_email: str, subject: str, body: str) -> bool: | |
| if not settings.smtp_host or not settings.smtp_from_email: | |
| logger.warning("SMTP is not configured. Cannot send email to %s", to_email) | |
| return False | |
| message = EmailMessage() | |
| message["Subject"] = subject | |
| message["From"] = f"{settings.smtp_from_name} <{settings.smtp_from_email}>" | |
| message["To"] = to_email | |
| message.set_content(body) | |
| try: | |
| with smtplib.SMTP(settings.smtp_host, settings.smtp_port, timeout=15) as server: | |
| server.ehlo() | |
| if settings.smtp_use_tls: | |
| server.starttls() | |
| server.ehlo() | |
| if settings.smtp_username and settings.smtp_password: | |
| server.login(settings.smtp_username, settings.smtp_password) | |
| server.send_message(message) | |
| return True | |
| except Exception: | |
| logger.exception("Failed to send email to %s", to_email) | |
| return False | |
| def send_password_reset_email(to_email: str, reset_url: str) -> bool: | |
| subject = "[Run The Shape] λΉλ°λ²νΈ μ¬μ€μ μλ΄" | |
| body = ( | |
| "λΉλ°λ²νΈ μ¬μ€μ μ μμ²νμ ¨μ΅λλ€.\n\n" | |
| "μλ λ§ν¬λ₯Ό λλ¬ μ λΉλ°λ²νΈλ₯Ό μ€μ ν΄μ£ΌμΈμ.\n" | |
| f"{reset_url}\n\n" | |
| "μμ²νμ§ μμΌμ ¨λ€λ©΄ μ΄ λ©μΌμ 무μνμ λ λ©λλ€." | |
| ) | |
| return _send_email(to_email, subject, body) | |
| def send_email_verification_code(to_email: str, code: str) -> bool: | |
| subject = "[Run The Shape] νμκ°μ μ΄λ©μΌ μΈμ¦λ²νΈ" | |
| body = ( | |
| "Run The Shape νμκ°μ μΈμ¦λ²νΈ μλ΄μ λλ€.\n\n" | |
| f"μΈμ¦λ²νΈ: {code}\n\n" | |
| "μΈμ¦λ²νΈλ 10λΆ λμ μ ν¨ν©λλ€.\n" | |
| "μμ²νμ§ μμΌμ ¨λ€λ©΄ μ΄ λ©μΌμ 무μνμ λ λ©λλ€." | |
| ) | |
| return _send_email(to_email, subject, body) | |