""" Azure Communication Services Email Connector Handles email sending via Azure Communication Services """ import logging from typing import Optional from azure.communication.email import EmailClient from modules.shared.configuration import APP_CONFIG logger = logging.getLogger(__name__) class ConnectorMessagingEmail: """ Azure Communication Services Email connector. Handles email sending. """ def __init__(self): """ Initialize Azure Communication Services Email client using APP_CONFIG. """ try: connectionString = APP_CONFIG.get("MESSAGING_ACS_CONNECTION_STRING") senderEmail = APP_CONFIG.get("MESSAGING_ACS_SENDER_EMAIL") if not connectionString or not senderEmail: logger.warning("Azure Communication Services credentials not configured for email") self._client = None self._senderEmail = None return self._client = EmailClient.from_connection_string(connectionString) self._senderEmail = senderEmail logger.info("Azure Communication Services Email client initialized successfully") except Exception as e: logger.error(f"Failed to initialize Azure Communication Services Email client: {e}") self._client = None self._senderEmail = None def send(self, recipient: str, subject: str, message: str) -> bool: """ Send an email via Azure Communication Services. Args: recipient: Recipient email address subject: Email subject message: Email message content (can be HTML) Returns: bool: True if successful, False otherwise """ if not self._client or not self._senderEmail: logger.error("Azure Communication Services Email client not initialized") return False try: messageData = { "senderAddress": self._senderEmail, "recipients": { "to": [{"address": recipient}] }, "content": { "subject": subject, "html": message } } # Try both API versions for compatibility try: poller = self._client.begin_send(messageData) poller.result() except AttributeError: poller = self._client.begin_send_message(messageData) poller.result() logger.info(f"Email sent successfully to {recipient}") return True except Exception as e: logger.error(f"Failed to send email to {recipient}: {e}") return False