Spaces:
Sleeping
Sleeping
| import logging | |
| from typing import Optional | |
| from app.config import settings | |
| logger = logging.getLogger(__name__) | |
| async def send_email(to_email: str, subject: str, text_body: str, html_body: Optional[str] = None) -> None: | |
| provider = settings.EMAIL_PROVIDER.lower().strip() | |
| if provider == "sendgrid": | |
| await _send_sendgrid(to_email, subject, text_body, html_body) | |
| return | |
| if provider == "ses": | |
| await _send_ses(to_email, subject, text_body, html_body) | |
| return | |
| logger.info("Email (console) to=%s subject=%s body=%s", to_email, subject, text_body) | |
| async def _send_sendgrid(to_email: str, subject: str, text_body: str, html_body: Optional[str]) -> None: | |
| if not settings.SENDGRID_API_KEY: | |
| logger.warning("SENDGRID_API_KEY missing; falling back to console email logging") | |
| logger.info("Email (console) to=%s subject=%s body=%s", to_email, subject, text_body) | |
| return | |
| try: | |
| from sendgrid import SendGridAPIClient | |
| from sendgrid.helpers.mail import Mail | |
| except Exception: | |
| logger.exception("SendGrid package unavailable; falling back to console logging") | |
| logger.info("Email (console) to=%s subject=%s body=%s", to_email, subject, text_body) | |
| return | |
| message = Mail( | |
| from_email=settings.EMAIL_FROM, | |
| to_emails=to_email, | |
| subject=subject, | |
| plain_text_content=text_body, | |
| html_content=html_body or text_body, | |
| ) | |
| try: | |
| client = SendGridAPIClient(settings.SENDGRID_API_KEY) | |
| client.send(message) | |
| except Exception: | |
| logger.exception("SendGrid send failed") | |
| async def _send_ses(to_email: str, subject: str, text_body: str, html_body: Optional[str]) -> None: | |
| try: | |
| import boto3 | |
| except Exception: | |
| logger.exception("boto3 unavailable for SES; falling back to console logging") | |
| logger.info("Email (console) to=%s subject=%s body=%s", to_email, subject, text_body) | |
| return | |
| if not settings.AWS_SES_REGION: | |
| logger.warning("AWS_SES_REGION missing; falling back to console logging") | |
| logger.info("Email (console) to=%s subject=%s body=%s", to_email, subject, text_body) | |
| return | |
| try: | |
| client = boto3.client( | |
| "ses", | |
| region_name=settings.AWS_SES_REGION, | |
| aws_access_key_id=settings.AWS_ACCESS_KEY_ID, | |
| aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY, | |
| ) | |
| client.send_email( | |
| Source=settings.EMAIL_FROM, | |
| Destination={"ToAddresses": [to_email]}, | |
| Message={ | |
| "Subject": {"Data": subject}, | |
| "Body": { | |
| "Text": {"Data": text_body}, | |
| "Html": {"Data": html_body or text_body}, | |
| }, | |
| }, | |
| ) | |
| except Exception: | |
| logger.exception("SES send failed") | |