import asyncio import smtplib import ssl from email.message import EmailMessage from config import settings def _send_sync(to: str, subject: str, body: str, html: str | None = None) -> None: msg = EmailMessage() msg["Subject"] = subject msg["From"] = settings.SMTP_FROM msg["To"] = to msg.set_content(body) if html: msg.add_alternative(html, subtype="html") with smtplib.SMTP(settings.SMTP_HOST, settings.SMTP_PORT, timeout=15) as s: s.ehlo() if settings.SMTP_TLS: ctx = ssl.create_default_context() s.starttls(context=ctx) s.ehlo() if settings.SMTP_USER: s.login(settings.SMTP_USER, settings.SMTP_PASSWORD) s.send_message(msg) async def send_email(to: str, subject: str, body: str, html: str | None = None) -> None: await asyncio.to_thread(_send_sync, to, subject, body, html) def verify_email_template(verify_url: str) -> tuple[str, str]: body = ( f"Stepstead'e hoş geldin!\n\n" f"E-postanı doğrulamak için aşağıdaki bağlantıya tıkla:\n{verify_url}\n\n" f"Bağlantı 24 saat geçerlidir.\n" ) html = f"""

Stepstead — E-posta Doğrulama

Hoş geldin! Yolculuğa başlamak için e-postanı doğrula.

E-postamı Doğrula

Buton çalışmazsa: {verify_url}

Bu bağlantı 24 saat geçerlidir.

""" return body, html def password_reset_template(reset_url: str) -> tuple[str, str]: body = ( f"Stepstead — Şifre sıfırlama talebin alındı.\n\n" f"Yeni şifre belirlemek için:\n{reset_url}\n\n" f"Bağlantı 1 saat geçerlidir. Talep sana ait değilse bu e-postayı yok say.\n" ) html = f"""

Stepstead — Şifre Sıfırlama

Şifre sıfırlama talebin alındı.

Şifremi Sıfırla

Bağlantı 1 saat geçerlidir.

""" return body, html