fromlib.providers.servicesimportservicefrom.email_providerimportEmailProviderfrom.servicesimportinit_provideras_init_provider,get_provideras_get_providerfromtypingimportDictimportosimportlogginglogger=logging.getLogger(__name__)# Global provider instance_provider=None
[docs]@service()asyncdefinit_email_provider(config:Dict=None,context=None)->bool:"""Initialize the email provider with config"""global_providerifconfigisNone:# Use environment variables for default configconfig={'smtp_server':os.getenv('SMTP_SERVER','smtp.gmail.com'),'smtp_port':int(os.getenv('SMTP_PORT','587')),'use_tls':os.getenv('SMTP_USE_TLS','true').lower()=='true','email':os.getenv('SMTP_EMAIL',''),'password':os.getenv('SMTP_PASSWORD',''),'imap_server':os.getenv('IMAP_SERVER','imap.gmail.com'),'imap_port':int(os.getenv('IMAP_PORT','993'))}ifnotconfig['email']ornotconfig['password']:logger.warning("Email provider not initialized: missing SMTP_EMAIL or SMTP_PASSWORD")returnFalsetry:_provider=EmailProvider(config)logger.info("Email provider initialized successfully")returnTrueexceptExceptionase:logger.error(f"Failed to initialize email provider: {e}")returnFalse
[docs]@service()asyncdefsend_email(to:str,subject:str,body:str,context=None)->Dict:"""Service to send an email Args: to: Recipient email address subject: Email subject body: Email body (can be plain text or HTML - auto-detected) context: Optional context Returns: Dict with success status and error info """global_providerif_providerisNone:# Try to initialize with default configsuccess=awaitinit_email_provider(context=context)ifnotsuccess:return{"success":False,"error":"Email provider not initialized"}try:result=await_provider.send_email(to=to,subject=subject,body=body)returnresultexceptExceptionase:logger.error(f"Error sending email: {e}")return{"success":False,"error":str(e)}
[docs]@service()asyncdefcheck_emails(folder:str="INBOX",criteria:Dict=None,context=None)->Dict:"""Service to check for new emails"""global_providerif_providerisNone:success=awaitinit_email_provider(context=context)ifnotsuccess:return{"success":False,"error":"Email provider not initialized"}try:returnawait_provider.check_emails(folder=folder,criteria=criteria)exceptExceptionase:logger.error(f"Error checking emails: {e}")return{"success":False,"error":str(e)}