mcp-server-email-cuhksz


Namemcp-server-email-cuhksz JSON
Version 0.1.1 PyPI version JSON
download
home_pageNone
SummaryA Model Context Protocol server for email
upload_time2025-08-18 09:13:22
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseMIT
keywords cuhksz mcp email
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # CUHKSZ MCP Email Server

一个基于模型上下文协议 (MCP) 的电子邮件收发服务,能够让语言模型安全、可靠地发送邮件及处理附件,用于CUHKSZ的Manus项目。

## 📋 目录

- [项目描述](#-项目描述)
- [可用工具](#-可用工具)
- [安装与部署](#-安装与部署)
- [测试说明](#-测试说明)
- [项目架构](#-项目架构)
- [实现方式与核心逻辑](#-实现方式与核心逻辑)
- [故障排除](#-故障排除)
- [许可证与致谢](#-许可证与致谢)

## ✨ 项目描述

本项目实现了一个基于模型上下文协议 (MCP) 的电子邮件服务。它为语言模型提供了一套标准化的工具,使其能够代表用户执行邮件相关的任务,如撰写和发送邮件、添加附件,以及在指定的目录中搜索文件作为附件。通过将邮件功能封装为安全的 MCP 工具,可以有效避免直接在语言模型中暴露用户的敏感凭证(如邮箱密码或授权码)。

## 🛠️ 可用工具

本服务提供了两个核心工具,用于处理邮件的发送和附件的搜索。

---

### 1. `send_email`
发送一封电子邮件。您可以指定单个或多个收件人、主题、正文,并附上一个或多个附件。

- **参数说明**:
  - `receiver` (`list[str]`): **必须**。收件人的电子邮件地址列表。
  - `subject` (`string`): **必须**。邮件的主题。
  - `body` (`string`): **必须**。邮件的正文内容。
  - `attachments` (`list[str]`): **可选**。要附加的文件名列表。
    - **注意**: 文件必须存在于服务启动时通过 `--dir` 参数指定的附件目录中。

- **返回示例**:
  ```
  Email to recipient@example.com sent successfully from your-email@example.com
  ```

---

### 2. `search_attachments`
在服务配置的附件目录中,根据提供的关键词搜索匹配的文件。

- **参数说明**:
  - `pattern` (`string`): **必须**。用于在文件名中搜索的文本关键词,搜索不区分大小写。

- **返回示例**:
  ```
  Search results for 'test_attachment':
  /app/attachments/test_attachment.txt
  ```

## 🚀 安装与部署

本服务支持 Docker 部署和本地运行两种方式。

### 1. 使用 Docker (推荐)

此方法最简单、最可靠,推荐用于生产和日常使用。

**a. 环境准备**

- 安装 [Docker](https://www.docker.com/get-started/) 和 [Docker Compose](https://docs.docker.com/compose/install/)。
- 克隆本项目。

**b. 配置凭证**

在项目根目录创建一个 `.env` 文件,并填入您的邮箱凭证。

```dotenv
# .env 文件内容
# 发件人的完整邮箱地址
EMAIL_USERNAME=your-email@example.com
# 邮箱的密码或授权码 (强烈推荐使用授权码)
EMAIL_PASSWORD=your_password_or_app_password 
```
**⚠️ 安全提醒**:
- **请勿**将 `.env` 文件提交到任何版本控制系统(如 Git)。
- 对于 QQ 邮箱、Gmail 等服务,您**必须**使用生成的**授权码 (App Password)**,而不是您的账户登录密码。

**c. 构建和启动服务**

在项目根目录下运行以下命令:
```bash
# 构建并以守护进程模式启动容器
docker-compose up --build -d

# 查看实时日志
docker-compose logs -f mcp-email-server

# 停止服务
docker-compose down
```
服务启动后,将在 `http://localhost:3002` 上提供 MCP 接口。

### 2. 本地运行 (用于开发)

**a. 环境准备**

克隆项目后,创建并激活 Python 虚拟环境,然后安装依赖:
```bash
# 创建虚拟环境
python3 -m venv .venv
# 激活虚拟环境 (macOS/Linux)
source .venv/bin/activate
# 激活虚拟环境 (Windows)
# .venv\Scripts\activate

# 安装依赖
pip install -r src/mcp_server_email_cuhksz/requirements.txt
```

**b. 配置凭证**

您可以选择创建 `.env` 文件(推荐)或在启动时使用命令行参数来提供凭证。

**c. 启动服务**

- **使用 `.env` 文件 (推荐)**:
  ```bash
  # 使用 stdio 传输 (用于直接的进程间通信)
  python -m mcp_server_email_cuhksz --dir /path/to/your/attachments

  # 使用 sse 传输 (用于网络访问和测试脚本)
  python -m mcp_server_email_cuhksz --transport sse --dir /path/to/your/attachments
  ```

- **使用命令行参数**:
  ```bash
  python -m mcp_server_email_cuhksz --transport sse --username your-email@example.com --password your_password --dir /path/to/your/attachments
  ```
当使用 `sse` 模式启动后,服务将在 `http://localhost:3002` 上提供 MCP 接口。

## 🧪 测试说明

项目提供了一个测试脚本,用于验证服务是否正常运行。

1.  **启动服务**:
    请确保已通过 `docker-compose up --build` 成功启动了服务。

2.  **安装测试依赖**:
    ```bash
    pip install -r test/requirements.txt
    ```

3.  **运行测试脚本**:
    ```bash
    python -m test.test
    ```
    该脚本会连接到在 Docker 中运行的服务,并尝试发送一封带有附件的测试邮件。

## 🏗️ 项目架构

- **`src/mcp_server_email_cuhksz/`**: 包含所有核心应用代码。
  - **`__main__.py`**: 程序的入口点,负责解析命令行参数、加载环境变量和启动服务。
  - **`mcp_email.py`**: 定义了 `send_email` 和 `search_attachments` 两个 MCP 工具,并包含了实现其功能的后端逻辑。
  - **`email.json`**: 一个关键的配置文件,包含了不同邮件服务提供商 (如 QQ, Gmail, Office 365) 的 SMTP 服务器地址和端口信息。
- **`test/`**:
  - **`test.py`**: 一个客户端测试脚本,用于验证邮件服务的核心功能。
  - **`requirements.txt`**: 运行测试脚本所需的依赖。
- **`attachments/`**: 一个示例目录,用于存放邮件附件。
- **`Dockerfile`**: 用于构建服务 Docker 镜像的配置文件。
- **`docker-compose.yml`**: 用于编排和管理 Docker 容器的配置文件。
- **`.env`**: 用于存放敏感信息(如邮箱用户名和密码/授权码)的环境变量文件。

## 🧠 实现方式与核心逻辑

- **动态 SMTP 配置**: 服务通过 `get_smtp_info` 函数,根据发件人邮箱的域名 (`@qq.com`, `@link.cuhk.edu.cn` 等) 在 `email.json` 中查找对应的 SMTP 服务器和端口。这种设计使其易于扩展,以支持新的邮件服务提供商。
- **异步中的同步处理**: 邮件的发送是使用 Python 内置的、同步的 `smtplib` 库完成的。为了避免这个阻塞操作卡住 `FastMCP` 的异步事件循环,`send_email_logic` 函数被包裹在 `asyncio.to_thread` 中运行,使其在一个独立的线程中执行。
- **优雅的连接关闭**: 考虑到一些邮件服务器(如 QQ 邮箱)在邮件发送成功后可能会立即关闭连接,导致客户端在尝试发送 `QUIT` 命令时出错,程序在 `finally` 块中对 `server.quit()` 进行了特殊的异常处理,**主动忽略**此处的连接错误,从而确保即使服务器“提前挂断”,程序也不会崩溃。

## 🔧 故障排除

- **`ConnectionError: Server disconnected unexpectedly` 或 `TimeoutError`**:
  - 这通常是邮件服务商的安全策略导致的。
  - **检查授权码**: 确认您在 `.env` 中使用的是**授权码 (App Password)** 而不是登录密码。
  - **检查MFA**: 如果您的账户(尤其是 Office 365)开启了多因素认证 (MFA),您很可能需要生成并使用“应用密码”。
  - **网络问题**: 确认您的服务器或本地机器可以访问外部邮件服务器。

- **`SMTPAuthenticationError`**:
  - 凭证错误。请仔细检查 `.env` 文件中的 `EMAIL_USERNAME` 和 `EMAIL_PASSWORD` 是否完全正确。

- **`ValueError: ... is not a supported email service`**:
  - 您使用的邮箱域名在 `email.json` 中没有对应的配置。请参照该文件中的格式,添加一个新的配置项。

## 📄 许可证与致谢

本项目采用 **MIT 许可证**。

本项目的实现方式,极大地参考了 [mcp-email-client](https://github.com/Shy2593666979/mcp-server-email) 项目。在此向原作者 **Shy2593666979** 表示衷心的感谢,其优秀的设计为本项目提供了宝贵的灵感和参考。

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "mcp-server-email-cuhksz",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "CUHKSZ, MCP, Email",
    "author": null,
    "author_email": "LKCY23 <lkcydream@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/fc/bb/440cd735e7d5aef8c2a063aca5401a8de9eb45f320505654cb5871d9d1f9/mcp_server_email_cuhksz-0.1.1.tar.gz",
    "platform": null,
    "description": "# CUHKSZ MCP Email Server\n\n\u4e00\u4e2a\u57fa\u4e8e\u6a21\u578b\u4e0a\u4e0b\u6587\u534f\u8bae (MCP) \u7684\u7535\u5b50\u90ae\u4ef6\u6536\u53d1\u670d\u52a1\uff0c\u80fd\u591f\u8ba9\u8bed\u8a00\u6a21\u578b\u5b89\u5168\u3001\u53ef\u9760\u5730\u53d1\u9001\u90ae\u4ef6\u53ca\u5904\u7406\u9644\u4ef6\uff0c\u7528\u4e8eCUHKSZ\u7684Manus\u9879\u76ee\u3002\n\n## \ud83d\udccb \u76ee\u5f55\n\n- [\u9879\u76ee\u63cf\u8ff0](#-\u9879\u76ee\u63cf\u8ff0)\n- [\u53ef\u7528\u5de5\u5177](#-\u53ef\u7528\u5de5\u5177)\n- [\u5b89\u88c5\u4e0e\u90e8\u7f72](#-\u5b89\u88c5\u4e0e\u90e8\u7f72)\n- [\u6d4b\u8bd5\u8bf4\u660e](#-\u6d4b\u8bd5\u8bf4\u660e)\n- [\u9879\u76ee\u67b6\u6784](#-\u9879\u76ee\u67b6\u6784)\n- [\u5b9e\u73b0\u65b9\u5f0f\u4e0e\u6838\u5fc3\u903b\u8f91](#-\u5b9e\u73b0\u65b9\u5f0f\u4e0e\u6838\u5fc3\u903b\u8f91)\n- [\u6545\u969c\u6392\u9664](#-\u6545\u969c\u6392\u9664)\n- [\u8bb8\u53ef\u8bc1\u4e0e\u81f4\u8c22](#-\u8bb8\u53ef\u8bc1\u4e0e\u81f4\u8c22)\n\n## \u2728 \u9879\u76ee\u63cf\u8ff0\n\n\u672c\u9879\u76ee\u5b9e\u73b0\u4e86\u4e00\u4e2a\u57fa\u4e8e\u6a21\u578b\u4e0a\u4e0b\u6587\u534f\u8bae (MCP) \u7684\u7535\u5b50\u90ae\u4ef6\u670d\u52a1\u3002\u5b83\u4e3a\u8bed\u8a00\u6a21\u578b\u63d0\u4f9b\u4e86\u4e00\u5957\u6807\u51c6\u5316\u7684\u5de5\u5177\uff0c\u4f7f\u5176\u80fd\u591f\u4ee3\u8868\u7528\u6237\u6267\u884c\u90ae\u4ef6\u76f8\u5173\u7684\u4efb\u52a1\uff0c\u5982\u64b0\u5199\u548c\u53d1\u9001\u90ae\u4ef6\u3001\u6dfb\u52a0\u9644\u4ef6\uff0c\u4ee5\u53ca\u5728\u6307\u5b9a\u7684\u76ee\u5f55\u4e2d\u641c\u7d22\u6587\u4ef6\u4f5c\u4e3a\u9644\u4ef6\u3002\u901a\u8fc7\u5c06\u90ae\u4ef6\u529f\u80fd\u5c01\u88c5\u4e3a\u5b89\u5168\u7684 MCP \u5de5\u5177\uff0c\u53ef\u4ee5\u6709\u6548\u907f\u514d\u76f4\u63a5\u5728\u8bed\u8a00\u6a21\u578b\u4e2d\u66b4\u9732\u7528\u6237\u7684\u654f\u611f\u51ed\u8bc1\uff08\u5982\u90ae\u7bb1\u5bc6\u7801\u6216\u6388\u6743\u7801\uff09\u3002\n\n## \ud83d\udee0\ufe0f \u53ef\u7528\u5de5\u5177\n\n\u672c\u670d\u52a1\u63d0\u4f9b\u4e86\u4e24\u4e2a\u6838\u5fc3\u5de5\u5177\uff0c\u7528\u4e8e\u5904\u7406\u90ae\u4ef6\u7684\u53d1\u9001\u548c\u9644\u4ef6\u7684\u641c\u7d22\u3002\n\n---\n\n### 1. `send_email`\n\u53d1\u9001\u4e00\u5c01\u7535\u5b50\u90ae\u4ef6\u3002\u60a8\u53ef\u4ee5\u6307\u5b9a\u5355\u4e2a\u6216\u591a\u4e2a\u6536\u4ef6\u4eba\u3001\u4e3b\u9898\u3001\u6b63\u6587\uff0c\u5e76\u9644\u4e0a\u4e00\u4e2a\u6216\u591a\u4e2a\u9644\u4ef6\u3002\n\n- **\u53c2\u6570\u8bf4\u660e**:\n  - `receiver` (`list[str]`): **\u5fc5\u987b**\u3002\u6536\u4ef6\u4eba\u7684\u7535\u5b50\u90ae\u4ef6\u5730\u5740\u5217\u8868\u3002\n  - `subject` (`string`): **\u5fc5\u987b**\u3002\u90ae\u4ef6\u7684\u4e3b\u9898\u3002\n  - `body` (`string`): **\u5fc5\u987b**\u3002\u90ae\u4ef6\u7684\u6b63\u6587\u5185\u5bb9\u3002\n  - `attachments` (`list[str]`): **\u53ef\u9009**\u3002\u8981\u9644\u52a0\u7684\u6587\u4ef6\u540d\u5217\u8868\u3002\n    - **\u6ce8\u610f**: \u6587\u4ef6\u5fc5\u987b\u5b58\u5728\u4e8e\u670d\u52a1\u542f\u52a8\u65f6\u901a\u8fc7 `--dir` \u53c2\u6570\u6307\u5b9a\u7684\u9644\u4ef6\u76ee\u5f55\u4e2d\u3002\n\n- **\u8fd4\u56de\u793a\u4f8b**:\n  ```\n  Email to recipient@example.com sent successfully from your-email@example.com\n  ```\n\n---\n\n### 2. `search_attachments`\n\u5728\u670d\u52a1\u914d\u7f6e\u7684\u9644\u4ef6\u76ee\u5f55\u4e2d\uff0c\u6839\u636e\u63d0\u4f9b\u7684\u5173\u952e\u8bcd\u641c\u7d22\u5339\u914d\u7684\u6587\u4ef6\u3002\n\n- **\u53c2\u6570\u8bf4\u660e**:\n  - `pattern` (`string`): **\u5fc5\u987b**\u3002\u7528\u4e8e\u5728\u6587\u4ef6\u540d\u4e2d\u641c\u7d22\u7684\u6587\u672c\u5173\u952e\u8bcd\uff0c\u641c\u7d22\u4e0d\u533a\u5206\u5927\u5c0f\u5199\u3002\n\n- **\u8fd4\u56de\u793a\u4f8b**:\n  ```\n  Search results for 'test_attachment':\n  /app/attachments/test_attachment.txt\n  ```\n\n## \ud83d\ude80 \u5b89\u88c5\u4e0e\u90e8\u7f72\n\n\u672c\u670d\u52a1\u652f\u6301 Docker \u90e8\u7f72\u548c\u672c\u5730\u8fd0\u884c\u4e24\u79cd\u65b9\u5f0f\u3002\n\n### 1. \u4f7f\u7528 Docker (\u63a8\u8350)\n\n\u6b64\u65b9\u6cd5\u6700\u7b80\u5355\u3001\u6700\u53ef\u9760\uff0c\u63a8\u8350\u7528\u4e8e\u751f\u4ea7\u548c\u65e5\u5e38\u4f7f\u7528\u3002\n\n**a. \u73af\u5883\u51c6\u5907**\n\n- \u5b89\u88c5 [Docker](https://www.docker.com/get-started/) \u548c [Docker Compose](https://docs.docker.com/compose/install/)\u3002\n- \u514b\u9686\u672c\u9879\u76ee\u3002\n\n**b. \u914d\u7f6e\u51ed\u8bc1**\n\n\u5728\u9879\u76ee\u6839\u76ee\u5f55\u521b\u5efa\u4e00\u4e2a `.env` \u6587\u4ef6\uff0c\u5e76\u586b\u5165\u60a8\u7684\u90ae\u7bb1\u51ed\u8bc1\u3002\n\n```dotenv\n# .env \u6587\u4ef6\u5185\u5bb9\n# \u53d1\u4ef6\u4eba\u7684\u5b8c\u6574\u90ae\u7bb1\u5730\u5740\nEMAIL_USERNAME=your-email@example.com\n# \u90ae\u7bb1\u7684\u5bc6\u7801\u6216\u6388\u6743\u7801 (\u5f3a\u70c8\u63a8\u8350\u4f7f\u7528\u6388\u6743\u7801)\nEMAIL_PASSWORD=your_password_or_app_password \n```\n**\u26a0\ufe0f \u5b89\u5168\u63d0\u9192**:\n- **\u8bf7\u52ff**\u5c06 `.env` \u6587\u4ef6\u63d0\u4ea4\u5230\u4efb\u4f55\u7248\u672c\u63a7\u5236\u7cfb\u7edf\uff08\u5982 Git\uff09\u3002\n- \u5bf9\u4e8e QQ \u90ae\u7bb1\u3001Gmail \u7b49\u670d\u52a1\uff0c\u60a8**\u5fc5\u987b**\u4f7f\u7528\u751f\u6210\u7684**\u6388\u6743\u7801 (App Password)**\uff0c\u800c\u4e0d\u662f\u60a8\u7684\u8d26\u6237\u767b\u5f55\u5bc6\u7801\u3002\n\n**c. \u6784\u5efa\u548c\u542f\u52a8\u670d\u52a1**\n\n\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a\n```bash\n# \u6784\u5efa\u5e76\u4ee5\u5b88\u62a4\u8fdb\u7a0b\u6a21\u5f0f\u542f\u52a8\u5bb9\u5668\ndocker-compose up --build -d\n\n# \u67e5\u770b\u5b9e\u65f6\u65e5\u5fd7\ndocker-compose logs -f mcp-email-server\n\n# \u505c\u6b62\u670d\u52a1\ndocker-compose down\n```\n\u670d\u52a1\u542f\u52a8\u540e\uff0c\u5c06\u5728 `http://localhost:3002` \u4e0a\u63d0\u4f9b MCP \u63a5\u53e3\u3002\n\n### 2. \u672c\u5730\u8fd0\u884c (\u7528\u4e8e\u5f00\u53d1)\n\n**a. \u73af\u5883\u51c6\u5907**\n\n\u514b\u9686\u9879\u76ee\u540e\uff0c\u521b\u5efa\u5e76\u6fc0\u6d3b Python \u865a\u62df\u73af\u5883\uff0c\u7136\u540e\u5b89\u88c5\u4f9d\u8d56\uff1a\n```bash\n# \u521b\u5efa\u865a\u62df\u73af\u5883\npython3 -m venv .venv\n# \u6fc0\u6d3b\u865a\u62df\u73af\u5883 (macOS/Linux)\nsource .venv/bin/activate\n# \u6fc0\u6d3b\u865a\u62df\u73af\u5883 (Windows)\n# .venv\\Scripts\\activate\n\n# \u5b89\u88c5\u4f9d\u8d56\npip install -r src/mcp_server_email_cuhksz/requirements.txt\n```\n\n**b. \u914d\u7f6e\u51ed\u8bc1**\n\n\u60a8\u53ef\u4ee5\u9009\u62e9\u521b\u5efa `.env` \u6587\u4ef6\uff08\u63a8\u8350\uff09\u6216\u5728\u542f\u52a8\u65f6\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u6765\u63d0\u4f9b\u51ed\u8bc1\u3002\n\n**c. \u542f\u52a8\u670d\u52a1**\n\n- **\u4f7f\u7528 `.env` \u6587\u4ef6 (\u63a8\u8350)**:\n  ```bash\n  # \u4f7f\u7528 stdio \u4f20\u8f93 (\u7528\u4e8e\u76f4\u63a5\u7684\u8fdb\u7a0b\u95f4\u901a\u4fe1)\n  python -m mcp_server_email_cuhksz --dir /path/to/your/attachments\n\n  # \u4f7f\u7528 sse \u4f20\u8f93 (\u7528\u4e8e\u7f51\u7edc\u8bbf\u95ee\u548c\u6d4b\u8bd5\u811a\u672c)\n  python -m mcp_server_email_cuhksz --transport sse --dir /path/to/your/attachments\n  ```\n\n- **\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570**:\n  ```bash\n  python -m mcp_server_email_cuhksz --transport sse --username your-email@example.com --password your_password --dir /path/to/your/attachments\n  ```\n\u5f53\u4f7f\u7528 `sse` \u6a21\u5f0f\u542f\u52a8\u540e\uff0c\u670d\u52a1\u5c06\u5728 `http://localhost:3002` \u4e0a\u63d0\u4f9b MCP \u63a5\u53e3\u3002\n\n## \ud83e\uddea \u6d4b\u8bd5\u8bf4\u660e\n\n\u9879\u76ee\u63d0\u4f9b\u4e86\u4e00\u4e2a\u6d4b\u8bd5\u811a\u672c\uff0c\u7528\u4e8e\u9a8c\u8bc1\u670d\u52a1\u662f\u5426\u6b63\u5e38\u8fd0\u884c\u3002\n\n1.  **\u542f\u52a8\u670d\u52a1**:\n    \u8bf7\u786e\u4fdd\u5df2\u901a\u8fc7 `docker-compose up --build` \u6210\u529f\u542f\u52a8\u4e86\u670d\u52a1\u3002\n\n2.  **\u5b89\u88c5\u6d4b\u8bd5\u4f9d\u8d56**:\n    ```bash\n    pip install -r test/requirements.txt\n    ```\n\n3.  **\u8fd0\u884c\u6d4b\u8bd5\u811a\u672c**:\n    ```bash\n    python -m test.test\n    ```\n    \u8be5\u811a\u672c\u4f1a\u8fde\u63a5\u5230\u5728 Docker \u4e2d\u8fd0\u884c\u7684\u670d\u52a1\uff0c\u5e76\u5c1d\u8bd5\u53d1\u9001\u4e00\u5c01\u5e26\u6709\u9644\u4ef6\u7684\u6d4b\u8bd5\u90ae\u4ef6\u3002\n\n## \ud83c\udfd7\ufe0f \u9879\u76ee\u67b6\u6784\n\n- **`src/mcp_server_email_cuhksz/`**: \u5305\u542b\u6240\u6709\u6838\u5fc3\u5e94\u7528\u4ee3\u7801\u3002\n  - **`__main__.py`**: \u7a0b\u5e8f\u7684\u5165\u53e3\u70b9\uff0c\u8d1f\u8d23\u89e3\u6790\u547d\u4ee4\u884c\u53c2\u6570\u3001\u52a0\u8f7d\u73af\u5883\u53d8\u91cf\u548c\u542f\u52a8\u670d\u52a1\u3002\n  - **`mcp_email.py`**: \u5b9a\u4e49\u4e86 `send_email` \u548c `search_attachments` \u4e24\u4e2a MCP \u5de5\u5177\uff0c\u5e76\u5305\u542b\u4e86\u5b9e\u73b0\u5176\u529f\u80fd\u7684\u540e\u7aef\u903b\u8f91\u3002\n  - **`email.json`**: \u4e00\u4e2a\u5173\u952e\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u5305\u542b\u4e86\u4e0d\u540c\u90ae\u4ef6\u670d\u52a1\u63d0\u4f9b\u5546 (\u5982 QQ, Gmail, Office 365) \u7684 SMTP \u670d\u52a1\u5668\u5730\u5740\u548c\u7aef\u53e3\u4fe1\u606f\u3002\n- **`test/`**:\n  - **`test.py`**: \u4e00\u4e2a\u5ba2\u6237\u7aef\u6d4b\u8bd5\u811a\u672c\uff0c\u7528\u4e8e\u9a8c\u8bc1\u90ae\u4ef6\u670d\u52a1\u7684\u6838\u5fc3\u529f\u80fd\u3002\n  - **`requirements.txt`**: \u8fd0\u884c\u6d4b\u8bd5\u811a\u672c\u6240\u9700\u7684\u4f9d\u8d56\u3002\n- **`attachments/`**: \u4e00\u4e2a\u793a\u4f8b\u76ee\u5f55\uff0c\u7528\u4e8e\u5b58\u653e\u90ae\u4ef6\u9644\u4ef6\u3002\n- **`Dockerfile`**: \u7528\u4e8e\u6784\u5efa\u670d\u52a1 Docker \u955c\u50cf\u7684\u914d\u7f6e\u6587\u4ef6\u3002\n- **`docker-compose.yml`**: \u7528\u4e8e\u7f16\u6392\u548c\u7ba1\u7406 Docker \u5bb9\u5668\u7684\u914d\u7f6e\u6587\u4ef6\u3002\n- **`.env`**: \u7528\u4e8e\u5b58\u653e\u654f\u611f\u4fe1\u606f\uff08\u5982\u90ae\u7bb1\u7528\u6237\u540d\u548c\u5bc6\u7801/\u6388\u6743\u7801\uff09\u7684\u73af\u5883\u53d8\u91cf\u6587\u4ef6\u3002\n\n## \ud83e\udde0 \u5b9e\u73b0\u65b9\u5f0f\u4e0e\u6838\u5fc3\u903b\u8f91\n\n- **\u52a8\u6001 SMTP \u914d\u7f6e**: \u670d\u52a1\u901a\u8fc7 `get_smtp_info` \u51fd\u6570\uff0c\u6839\u636e\u53d1\u4ef6\u4eba\u90ae\u7bb1\u7684\u57df\u540d (`@qq.com`, `@link.cuhk.edu.cn` \u7b49) \u5728 `email.json` \u4e2d\u67e5\u627e\u5bf9\u5e94\u7684 SMTP \u670d\u52a1\u5668\u548c\u7aef\u53e3\u3002\u8fd9\u79cd\u8bbe\u8ba1\u4f7f\u5176\u6613\u4e8e\u6269\u5c55\uff0c\u4ee5\u652f\u6301\u65b0\u7684\u90ae\u4ef6\u670d\u52a1\u63d0\u4f9b\u5546\u3002\n- **\u5f02\u6b65\u4e2d\u7684\u540c\u6b65\u5904\u7406**: \u90ae\u4ef6\u7684\u53d1\u9001\u662f\u4f7f\u7528 Python \u5185\u7f6e\u7684\u3001\u540c\u6b65\u7684 `smtplib` \u5e93\u5b8c\u6210\u7684\u3002\u4e3a\u4e86\u907f\u514d\u8fd9\u4e2a\u963b\u585e\u64cd\u4f5c\u5361\u4f4f `FastMCP` \u7684\u5f02\u6b65\u4e8b\u4ef6\u5faa\u73af\uff0c`send_email_logic` \u51fd\u6570\u88ab\u5305\u88f9\u5728 `asyncio.to_thread` \u4e2d\u8fd0\u884c\uff0c\u4f7f\u5176\u5728\u4e00\u4e2a\u72ec\u7acb\u7684\u7ebf\u7a0b\u4e2d\u6267\u884c\u3002\n- **\u4f18\u96c5\u7684\u8fde\u63a5\u5173\u95ed**: \u8003\u8651\u5230\u4e00\u4e9b\u90ae\u4ef6\u670d\u52a1\u5668\uff08\u5982 QQ \u90ae\u7bb1\uff09\u5728\u90ae\u4ef6\u53d1\u9001\u6210\u529f\u540e\u53ef\u80fd\u4f1a\u7acb\u5373\u5173\u95ed\u8fde\u63a5\uff0c\u5bfc\u81f4\u5ba2\u6237\u7aef\u5728\u5c1d\u8bd5\u53d1\u9001 `QUIT` \u547d\u4ee4\u65f6\u51fa\u9519\uff0c\u7a0b\u5e8f\u5728 `finally` \u5757\u4e2d\u5bf9 `server.quit()` \u8fdb\u884c\u4e86\u7279\u6b8a\u7684\u5f02\u5e38\u5904\u7406\uff0c**\u4e3b\u52a8\u5ffd\u7565**\u6b64\u5904\u7684\u8fde\u63a5\u9519\u8bef\uff0c\u4ece\u800c\u786e\u4fdd\u5373\u4f7f\u670d\u52a1\u5668\u201c\u63d0\u524d\u6302\u65ad\u201d\uff0c\u7a0b\u5e8f\u4e5f\u4e0d\u4f1a\u5d29\u6e83\u3002\n\n## \ud83d\udd27 \u6545\u969c\u6392\u9664\n\n- **`ConnectionError: Server disconnected unexpectedly` \u6216 `TimeoutError`**:\n  - \u8fd9\u901a\u5e38\u662f\u90ae\u4ef6\u670d\u52a1\u5546\u7684\u5b89\u5168\u7b56\u7565\u5bfc\u81f4\u7684\u3002\n  - **\u68c0\u67e5\u6388\u6743\u7801**: \u786e\u8ba4\u60a8\u5728 `.env` \u4e2d\u4f7f\u7528\u7684\u662f**\u6388\u6743\u7801 (App Password)** \u800c\u4e0d\u662f\u767b\u5f55\u5bc6\u7801\u3002\n  - **\u68c0\u67e5MFA**: \u5982\u679c\u60a8\u7684\u8d26\u6237\uff08\u5c24\u5176\u662f Office 365\uff09\u5f00\u542f\u4e86\u591a\u56e0\u7d20\u8ba4\u8bc1 (MFA)\uff0c\u60a8\u5f88\u53ef\u80fd\u9700\u8981\u751f\u6210\u5e76\u4f7f\u7528\u201c\u5e94\u7528\u5bc6\u7801\u201d\u3002\n  - **\u7f51\u7edc\u95ee\u9898**: \u786e\u8ba4\u60a8\u7684\u670d\u52a1\u5668\u6216\u672c\u5730\u673a\u5668\u53ef\u4ee5\u8bbf\u95ee\u5916\u90e8\u90ae\u4ef6\u670d\u52a1\u5668\u3002\n\n- **`SMTPAuthenticationError`**:\n  - \u51ed\u8bc1\u9519\u8bef\u3002\u8bf7\u4ed4\u7ec6\u68c0\u67e5 `.env` \u6587\u4ef6\u4e2d\u7684 `EMAIL_USERNAME` \u548c `EMAIL_PASSWORD` \u662f\u5426\u5b8c\u5168\u6b63\u786e\u3002\n\n- **`ValueError: ... is not a supported email service`**:\n  - \u60a8\u4f7f\u7528\u7684\u90ae\u7bb1\u57df\u540d\u5728 `email.json` \u4e2d\u6ca1\u6709\u5bf9\u5e94\u7684\u914d\u7f6e\u3002\u8bf7\u53c2\u7167\u8be5\u6587\u4ef6\u4e2d\u7684\u683c\u5f0f\uff0c\u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u914d\u7f6e\u9879\u3002\n\n## \ud83d\udcc4 \u8bb8\u53ef\u8bc1\u4e0e\u81f4\u8c22\n\n\u672c\u9879\u76ee\u91c7\u7528 **MIT \u8bb8\u53ef\u8bc1**\u3002\n\n\u672c\u9879\u76ee\u7684\u5b9e\u73b0\u65b9\u5f0f\uff0c\u6781\u5927\u5730\u53c2\u8003\u4e86 [mcp-email-client](https://github.com/Shy2593666979/mcp-server-email) \u9879\u76ee\u3002\u5728\u6b64\u5411\u539f\u4f5c\u8005 **Shy2593666979** \u8868\u793a\u8877\u5fc3\u7684\u611f\u8c22\uff0c\u5176\u4f18\u79c0\u7684\u8bbe\u8ba1\u4e3a\u672c\u9879\u76ee\u63d0\u4f9b\u4e86\u5b9d\u8d35\u7684\u7075\u611f\u548c\u53c2\u8003\u3002\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A Model Context Protocol server for email",
    "version": "0.1.1",
    "project_urls": null,
    "split_keywords": [
        "cuhksz",
        " mcp",
        " email"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3cd495a7db8eeb2b38eb79d98c8427efe8575d086f15cf59a9e11fa428b655b2",
                "md5": "d5388d6f8f5939f189c5d807edacf4c5",
                "sha256": "fb1c9b27450d4c1799c350456c399608428d02595f9ac3f7e4f822e9a584144d"
            },
            "downloads": -1,
            "filename": "mcp_server_email_cuhksz-0.1.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "d5388d6f8f5939f189c5d807edacf4c5",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 12127,
            "upload_time": "2025-08-18T09:13:20",
            "upload_time_iso_8601": "2025-08-18T09:13:20.751394Z",
            "url": "https://files.pythonhosted.org/packages/3c/d4/95a7db8eeb2b38eb79d98c8427efe8575d086f15cf59a9e11fa428b655b2/mcp_server_email_cuhksz-0.1.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fcbb440cd735e7d5aef8c2a063aca5401a8de9eb45f320505654cb5871d9d1f9",
                "md5": "e78f907d34af6f720efae0aa5271967d",
                "sha256": "6887210983bc77fc5949f7b7b85dbc844b4a72244109144277694d7038ceb276"
            },
            "downloads": -1,
            "filename": "mcp_server_email_cuhksz-0.1.1.tar.gz",
            "has_sig": false,
            "md5_digest": "e78f907d34af6f720efae0aa5271967d",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 16235,
            "upload_time": "2025-08-18T09:13:22",
            "upload_time_iso_8601": "2025-08-18T09:13:22.645557Z",
            "url": "https://files.pythonhosted.org/packages/fc/bb/440cd735e7d5aef8c2a063aca5401a8de9eb45f320505654cb5871d9d1f9/mcp_server_email_cuhksz-0.1.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-18 09:13:22",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "mcp-server-email-cuhksz"
}
        
Elapsed time: 3.50136s