Source code for mindroot.coreplugins.email.mod
from lib.providers.services import service
from .email_provider import EmailProvider
from .services import init_provider as _init_provider, get_provider as _get_provider
from typing import Dict
import os
import logging
logger = logging.getLogger(__name__)
# Global provider instance
_provider = None
[docs]
@service()
async def init_email_provider(config: Dict = None, context=None) -> bool:
"""Initialize the email provider with config"""
global _provider
if config is None:
# Use environment variables for default config
config = {
'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'))
}
if not config['email'] or not config['password']:
logger.warning("Email provider not initialized: missing SMTP_EMAIL or SMTP_PASSWORD")
return False
try:
_provider = EmailProvider(config)
logger.info("Email provider initialized successfully")
return True
except Exception as e:
logger.error(f"Failed to initialize email provider: {e}")
return False
[docs]
@service()
async def send_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 _provider
if _provider is None:
# Try to initialize with default config
success = await init_email_provider(context=context)
if not success:
return {
"success": False,
"error": "Email provider not initialized"
}
try:
result = await _provider.send_email(
to=to,
subject=subject,
body=body
)
return result
except Exception as e:
logger.error(f"Error sending email: {e}")
return {
"success": False,
"error": str(e)
}
[docs]
@service()
async def check_emails(folder: str = "INBOX", criteria: Dict = None, context=None) -> Dict:
"""Service to check for new emails"""
global _provider
if _provider is None:
success = await init_email_provider(context=context)
if not success:
return {
"success": False,
"error": "Email provider not initialized"
}
try:
return await _provider.check_emails(folder=folder, criteria=criteria)
except Exception as e:
logger.error(f"Error checking emails: {e}")
return {
"success": False,
"error": str(e)
}