Skip to main content
Glama
leeguooooo
by leeguooooo
database_design.md7.81 kB
# 邮件本地数据库设计方案 ## 概述 为了提升MCP邮件服务的性能,我们将实现本地SQLite数据库来缓存邮件数据。这个设计既要支持当前的MCP工具使用,也要为未来的交互式邮箱应用做好准备。 ## 设计原则 1. **性能优先** - 快速查询和搜索 2. **隐私保护** - 敏感数据可选存储 3. **增量同步** - 只同步变化的数据 4. **离线支持** - 本地操作不依赖网络 5. **扩展性** - 支持未来功能扩展 ## 数据库架构 ### 1. 账户表 (accounts) ```sql CREATE TABLE accounts ( id TEXT PRIMARY KEY, -- 账户唯一ID email TEXT NOT NULL UNIQUE, -- 邮箱地址 provider TEXT NOT NULL, -- 提供商 (163/gmail/qq/outlook/custom) is_default BOOLEAN DEFAULT 0, -- 是否默认账户 last_sync_time DATETIME, -- 最后同步时间 sync_status TEXT, -- 同步状态 (syncing/completed/failed) created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ); ``` ### 2. 文件夹表 (folders) ```sql CREATE TABLE folders ( id INTEGER PRIMARY KEY AUTOINCREMENT, account_id TEXT NOT NULL, folder_name TEXT NOT NULL, -- IMAP文件夹名 display_name TEXT, -- 显示名称(处理UTF-7编码) parent_folder TEXT, -- 父文件夹 level INTEGER DEFAULT 0, -- 层级深度 message_count INTEGER DEFAULT 0, -- 邮件总数 unread_count INTEGER DEFAULT 0, -- 未读数 last_sync_uid INTEGER, -- 最后同步的UID FOREIGN KEY (account_id) REFERENCES accounts(id), UNIQUE(account_id, folder_name) ); ``` ### 3. 邮件元数据表 (emails) ```sql CREATE TABLE emails ( id INTEGER PRIMARY KEY AUTOINCREMENT, account_id TEXT NOT NULL, folder_id INTEGER NOT NULL, uid INTEGER NOT NULL, -- IMAP UID message_id TEXT, -- Message-ID header subject TEXT, from_address TEXT, from_name TEXT, to_addresses TEXT, -- JSON array cc_addresses TEXT, -- JSON array date DATETIME, size INTEGER, is_read BOOLEAN DEFAULT 0, is_flagged BOOLEAN DEFAULT 0, is_deleted BOOLEAN DEFAULT 0, has_attachments BOOLEAN DEFAULT 0, preview TEXT, -- 前100字预览 labels TEXT, -- JSON array (for Gmail) sync_status TEXT DEFAULT 'meta', -- meta/full/error created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (account_id) REFERENCES accounts(id), FOREIGN KEY (folder_id) REFERENCES folders(id), UNIQUE(account_id, folder_id, uid) ); -- 索引优化查询性能 CREATE INDEX idx_emails_account_folder ON emails(account_id, folder_id); CREATE INDEX idx_emails_date ON emails(date DESC); CREATE INDEX idx_emails_from ON emails(from_address); CREATE INDEX idx_emails_unread ON emails(is_read, date DESC); CREATE INDEX idx_emails_flagged ON emails(is_flagged); ``` ### 4. 邮件内容表 (email_contents) ```sql CREATE TABLE email_contents ( email_id INTEGER PRIMARY KEY, body_text TEXT, -- 纯文本内容 body_html TEXT, -- HTML内容 headers TEXT, -- JSON格式的邮件头 raw_size INTEGER, -- 原始邮件大小 FOREIGN KEY (email_id) REFERENCES emails(id) ON DELETE CASCADE ); ``` ### 5. 附件表 (attachments) ```sql CREATE TABLE attachments ( id INTEGER PRIMARY KEY AUTOINCREMENT, email_id INTEGER NOT NULL, filename TEXT NOT NULL, content_type TEXT, size INTEGER, content_id TEXT, -- For inline attachments is_inline BOOLEAN DEFAULT 0, file_path TEXT, -- 本地存储路径(可选) FOREIGN KEY (email_id) REFERENCES emails(id) ON DELETE CASCADE ); ``` ### 6. 搜索索引表 (使用FTS5) ```sql CREATE VIRTUAL TABLE email_search USING fts5( email_id, subject, from_address, from_name, body_text, content='emails', content_rowid='id' ); -- 触发器保持索引同步 CREATE TRIGGER emails_ai AFTER INSERT ON emails BEGIN INSERT INTO email_search(email_id, subject, from_address, from_name) VALUES (new.id, new.subject, new.from_address, new.from_name); END; ``` ### 7. 同步日志表 (sync_log) ```sql CREATE TABLE sync_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, account_id TEXT NOT NULL, folder_id INTEGER, sync_type TEXT, -- full/incremental/delete start_time DATETIME, end_time DATETIME, emails_synced INTEGER DEFAULT 0, emails_deleted INTEGER DEFAULT 0, status TEXT, -- success/failed/partial error_message TEXT, FOREIGN KEY (account_id) REFERENCES accounts(id), FOREIGN KEY (folder_id) REFERENCES folders(id) ); ``` ## 同步策略 ### 1. 初始同步 - 获取所有文件夹结构 - 每个文件夹获取最近30天的邮件元数据 - 标记重要邮件(未读、已加星标)进行全文同步 ### 2. 增量同步 - 使用IMAP UID跟踪变化 - 每个文件夹记录last_sync_uid - 只同步UID大于last_sync_uid的新邮件 - 定期检查已同步邮件的标记变化 ### 3. 同步优先级 1. 默认账户的INBOX 2. 其他账户的INBOX 3. 未读邮件较多的文件夹 4. 其他文件夹 ### 4. 存储策略 - 元数据:始终存储 - 邮件正文:可配置(默认存储最近7天) - 附件:只存储元数据,按需下载 ## API设计 ### 数据库管理类 ```python class EmailDatabase: def __init__(self, db_path: str = "~/.mcp-email/emails.db"): self.db_path = os.path.expanduser(db_path) self.init_database() def init_database(self): """初始化数据库结构""" pass def sync_account(self, account_id: str, full_sync: bool = False): """同步指定账户""" pass def search_emails(self, query: str, account_id: Optional[str] = None): """全文搜索邮件""" pass def get_email_list(self, account_id: Optional[str] = None, folder: Optional[str] = None, unread_only: bool = False, limit: int = 50): """获取邮件列表""" pass def get_email_detail(self, email_id: int): """获取邮件详情""" pass def mark_email(self, email_id: int, is_read: bool): """标记邮件(需要同步到服务器)""" pass ``` ## 性能优化 1. **批量操作** - 使用事务批量插入/更新 2. **连接池** - 复用数据库连接 3. **索引优化** - 针对常用查询创建索引 4. **分页查询** - 避免一次加载过多数据 5. **异步同步** - 后台线程进行同步 ## 隐私和安全 1. **数据加密** - 敏感字段可选加密存储 2. **自动清理** - 定期清理过期数据 3. **权限控制** - 数据库文件权限设置为600 4. **匿名化** - 日志中不记录邮件内容 ## 迁移计划 ### 第一阶段:基础实现 1. 实现数据库结构和基础API 2. 实现邮件元数据同步 3. 修改list_emails使用本地数据 ### 第二阶段:完整功能 1. 实现全文搜索 2. 实现增量同步 3. 添加同步调度器 ### 第三阶段:优化提升 1. 实现智能缓存策略 2. 添加性能监控 3. 优化查询性能 ## 配置选项 ```python DATABASE_CONFIG = { "db_path": "~/.mcp-email/emails.db", "sync_interval": 300, # 5分钟 "max_body_days": 7, # 保存最近7天的邮件正文 "max_db_size": 1024, # MB "enable_fts": True, # 启用全文搜索 "auto_cleanup": True, # 自动清理 } ```

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/leeguooooo/email-mcp-service'

If you have feedback or need assistance with the MCP directory API, please join our Discord server