from jinja2 import Template from sendgrid import SendGridAPIClient from sendgrid.helpers.mail import Content, From, Mail, Subject, To from ..core.config import settings from ..core.logging import get_logger logger = get_logger(__name__) class EmailService: def __init__(self): if settings.sendgrid_api_key: self.client = SendGridAPIClient(api_key=settings.sendgrid_api_key) else: logger.warning("SendGrid API key not configured") self.client = None async def send_completion_email( self, recipient_email: str, job_title: str, download_links: dict[str, dict[str, str]] ) -> bool: """Send job completion email with download links""" if not self.client: logger.error("SendGrid not configured, cannot send email") return False try: # Render email template html_content = self._render_completion_template( job_title=job_title, download_links=download_links ) message = Mail( from_email=From(settings.email_from, "Accessible Video Platform"), to_emails=To(recipient_email), subject=Subject(f"Your accessible video assets are ready: {job_title}"), html_content=Content("text/html", html_content) ) response = self.client.send(message) if response.status_code == 202: logger.info(f"Completion email sent successfully to {recipient_email}") return True else: logger.error(f"Failed to send email, status code: {response.status_code}") return False except Exception as e: logger.error(f"Email sending failed: {e}") return False def _render_completion_template( self, job_title: str, download_links: dict[str, dict[str, str]] ) -> str: """Render the completion email HTML template""" template_str = """ Your Accessible Video Assets Are Ready

Your Accessible Video Assets Are Ready!

{{ job_title }}

Great news! Your video accessibility assets have been processed and are ready for download.

{% for language, files in download_links.items() %}

{{ language.upper() }} Assets

{% for file_type, url in files.items() %} Download {{ file_type|replace('_', ' ')|title }} {% endfor %}
{% endfor %}

Important: These download links will expire in 24 hours for security purposes.

If you need assistance or have questions about your accessible video assets, please don't hesitate to contact our support team.

""" template = Template(template_str) return template.render( job_title=job_title, download_links=download_links ) # Global service instance email_service = EmailService()