Explorer
/tmp/restic-stage/lead-engine/sendgrid_integration.py
← Zurück ↓ Download
"""
SendGrid Integration
Handles sending responses via SendGrid API
"""

import os
from typing import Optional, List
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail, Email, To, Content


class SendGridClient:
    """Handles SendGrid email sending"""

    def __init__(self, api_key: Optional[str] = None,
                 from_email: str = "support@agentsolutions.tech",
                 from_name: str = "Agent Solutions Team"):
        """
        Initialize SendGrid client

        Args:
            api_key: SendGrid API key (or use SENDGRID_API_KEY env var)
            from_email: Default sender email address
            from_name: Default sender name
        """
        self.api_key = api_key or os.getenv("SENDGRID_API_KEY")
        if not self.api_key:
            raise ValueError("SENDGRID_API_KEY environment variable not set")

        self.client = SendGridAPIClient(self.api_key)
        self.from_email = from_email
        self.from_name = from_name

    def send_email(self,
                   to_email: str,
                   to_name: str,
                   subject: str,
                   body: str,
                   reply_to: Optional[str] = None) -> bool:
        """
        Send an email via SendGrid

        Args:
            to_email: Recipient email address
            to_name: Recipient name
            subject: Email subject
            body: Email body (HTML or plain text)
            reply_to: Optional reply-to email address

        Returns:
            True if sent successfully, False otherwise
        """
        try:
            from_email_obj = Email(self.from_email, self.from_name)
            to_email_obj = To(to_email, to_name)
            subject_obj = subject
            content = Content("text/html", body)

            mail = Mail(from_email_obj, to_email_obj, subject_obj, content)

            if reply_to:
                mail.reply_to = Email(reply_to)

            response = self.client.send(mail)

            # Check if successful (2xx status code)
            return 200 <= response.status_code < 300

        except Exception as e:
            print(f"Error sending email: {e}")
            return False

    def send_template_email(self,
                            to_email: str,
                            to_name: str,
                            template_id: str,
                            dynamic_data: dict) -> bool:
        """
        Send email using SendGrid template

        Args:
            to_email: Recipient email address
            to_name: Recipient name
            template_id: SendGrid template ID
            dynamic_data: Template variables

        Returns:
            True if sent successfully, False otherwise
        """
        try:
            from_email_obj = Email(self.from_email, self.from_name)
            to_email_obj = To(to_email, to_name)

            mail = Mail(from_email=from_email_obj, to_emails=to_email_obj)
            mail.template_id = template_id

            # Add dynamic template data
            for key, value in dynamic_data.items():
                mail.dynamic_template_data = dynamic_data

            response = self.client.send(mail)
            return 200 <= response.status_code < 300

        except Exception as e:
            print(f"Error sending template email: {e}")
            return False

    def send_batch_emails(self, recipients: List[dict]) -> dict:
        """
        Send multiple emails

        Args:
            recipients: List of dicts with 'to_email', 'to_name', 'subject', 'body'

        Returns:
            Dict with 'sent' and 'failed' counts
        """
        results = {'sent': 0, 'failed': 0}

        for recipient in recipients:
            success = self.send_email(
                to_email=recipient['to_email'],
                to_name=recipient['to_name'],
                subject=recipient['subject'],
                body=recipient['body'],
                reply_to=recipient.get('reply_to')
            )

            if success:
                results['sent'] += 1
            else:
                results['failed'] += 1

        return results