import abc
from datetime import datetime
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from mcp_email_server.emails.models import (
AttachmentDownloadResponse,
EmailContentBatchResponse,
EmailMetadataPageResponse,
)
class EmailHandler(abc.ABC):
@abc.abstractmethod
async def get_emails_metadata(
self,
page: int = 1,
page_size: int = 10,
before: datetime | None = None,
since: datetime | None = None,
subject: str | None = None,
from_address: str | None = None,
to_address: str | None = None,
order: str = "desc",
mailbox: str = "INBOX",
) -> "EmailMetadataPageResponse":
"""
Get email metadata only (without body content) for better performance
"""
@abc.abstractmethod
async def get_emails_content(self, email_ids: list[str], mailbox: str = "INBOX") -> "EmailContentBatchResponse":
"""
Get full content (including body) of multiple emails by their email IDs (IMAP UIDs)
"""
@abc.abstractmethod
async def send_email(
self,
recipients: list[str],
subject: str,
body: str,
cc: list[str] | None = None,
bcc: list[str] | None = None,
html: bool = False,
attachments: list[str] | None = None,
) -> None:
"""
Send email
"""
@abc.abstractmethod
async def delete_emails(self, email_ids: list[str], mailbox: str = "INBOX") -> tuple[list[str], list[str]]:
"""
Delete emails by their IDs. Returns (deleted_ids, failed_ids)
"""
@abc.abstractmethod
async def download_attachment(
self,
email_id: str,
attachment_name: str,
save_path: str,
) -> "AttachmentDownloadResponse":
"""
Download an email attachment and save it to the specified path
"""