mcpField
E
Email (IMAP/SMTP)

Email (IMAP/SMTP)

本地服务
github.com/boutquin通信协作333 周前更新

关于 Email (IMAP/SMTP)

Email (IMAP/SMTP) 是面向 LLM 的多账户邮件 MCP 服务,可通过 IMAP/SMTP 读取、发送、搜索和整理邮件。它提供 22 种工具,并支持 OAuth2、连接池、限流与重试。

主要功能

  1. 01多账户邮件访问
  2. 02读取、搜索和管理邮件
  3. 03发送、回复及转发邮件
  4. 04附件与会话线程操作
  5. 05OAuth2 设备码认证
  6. 06连接池、限流和重试

适用场景

  1. 01跨账户查找邮件
  2. 02批量整理收件箱
  3. 03发送带附件的邮件
  4. 04读取邮件会话及附件

MCP 相关

该服务向 MCP 客户端提供 22 种邮件工具,涵盖账户、文件夹、邮件、附件和草稿操作。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"boutquin-email": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"EMAIL_CONFIG_FILE",
"-e",
"EMAIL_ACCOUNTS",
"ghcr.io/boutquin/mcp-server-email:latest"
],
"env": {
"EMAIL_CONFIG_FILE": "<EMAIL_CONFIG_FILE>",
"EMAIL_ACCOUNTS": "<EMAIL_ACCOUNTS>"
}
}
}
}
启动命令docker run -i --rm -e EMAIL_CONFIG_FILE -e EMAIL_ACCOUNTS ghcr.io/boutquin/mcp-server-email:latest
需要配置的环境变量
EMAIL_CONFIG_FILEPath to account JSON config file
EMAIL_ACCOUNTS密钥Inline JSON array of account configs

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
ocighcr.io/boutquin/mcp-server-email:latest

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

mcp-server-email

CI codecov Go License: MIT MCP

面向 Model Context Protocol 的多账户电子邮件服务。通过 IMAP/SMTP 为大模型提供完整的电子邮件访问能力——阅读、发送、搜索和整理,并支持连接池、速率限制和重试。它是 apple-bridge(本地 Mail.app 访问)的远程电子邮件对应方案。

快速开始

  1. 安装

    go install github.com/boutquin/mcp-server-email/cmd/mcp-server-email@latest
    
  2. 创建配置文件(~/.config/mcp-email/accounts.json)

    对于常见服务提供商(Gmail、Outlook、Yahoo、iCloud、Fastmail、Zoho),系统会根据电子邮件域名自动检测主机和端口——只需提供凭据:

    [
      {
        "id": "hello",
        "email": "[email protected]",
        "username": "[email protected]",
        "password": "app-password-here"
      }
    ]
    

    对于自定义邮件服务器,请显式指定主机和端口:

    [
      {
        "id": "work",
        "email": "[email protected]",
        "imap_host": "mail.example.com",
        "imap_port": 993,
        "smtp_host": "mail.example.com",
        "smtp_port": 465,
        "username": "[email protected]",
        "password": "app-password-here"
      }
    ]
    
    chmod 600 ~/.config/mcp-email/accounts.json
    
  3. 添加到 Claude Code(~/.claude.json)

    {
      "mcpServers": {
        "email": {
          "command": "mcp-server-email",
          "env": {
            "EMAIL_CONFIG_FILE": "~/.config/mcp-email/accounts.json"
          }
        }
      }
    }
    
  4. 重启 Claude Code——现在即可使用 email_* 工具。

安装

Go Install(推荐 Go 开发者使用)
go install github.com/boutquin/mcp-server-email/cmd/mcp-server-email@latest
Homebrew(macOS/Linux)
brew install boutquin/tap/mcp-server-email
下载二进制文件

从 GitHub Releases 下载适用于你平台的预构建二进制文件。

支持平台:Linux(amd64、arm64)、macOS(amd64、arm64)、Windows(amd64、arm64)。

Docker
docker run --rm \
  -e EMAIL_ACCOUNTS='[{"id":"main","email":"[email protected]","imap_host":"mail.example.com","imap_port":993,"smtp_host":"mail.example.com","smtp_port":465,"username":"[email protected]","password":"app-password"}]' \
  ghcr.io/boutquin/mcp-server-email:latest
MCP Bundle(Claude Desktop)

从 Releases 下载 .mcpb 文件,并在 Claude Desktop 中打开。

从源代码构建
git clone https://github.com/boutquin/mcp-server-email.git
cd mcp-server-email
go build -o mcp-server-email ./cmd/mcp-server-email

配置

账户在启动时加载一次。更改配置后需要重启服务。

配置文件与环境变量
方式适用场景
EMAIL_CONFIG_FILE — JSON 文件的路径生产环境。可通过文件权限锁定(chmod 600)
EMAIL_ACCOUNTS — 环境变量中的内嵌 JSON测试、CI 或容器化部署

如果两者都已设置,EMAIL_ACCOUNTS 优先。

账户 JSON 架构
[
  {
    "id": "hello",
    "email": "[email protected]",
    "imap_host": "mail.example.com",
    "imap_port": 993,
    "smtp_host": "mail.example.com",
    "smtp_port": 465,
    "username": "[email protected]",
    "password": "app-password-here"
  }
]
字段必填描述
id是唯一账户标识符
email是电子邮件地址
imap_host否*IMAP 服务主机名
imap_port否*IMAP 端口(993 = 隐式 TLS,143 = STARTTLS)
smtp_host否*SMTP 服务主机名
smtp_port否*SMTP 端口(465 = 隐式 TLS,587 = STARTTLS)
username是登录用户名
password是**应用专用密码或账户密码
use_starttls否覆盖 TLS 自动检测(true/false)
insecure_skip_verify否跳过 TLS 证书验证(开发/测试)
auth_method否"password"(默认)或 "oauth2"
oauth_client_id否OAuth2 客户端 ID(当 auth_method 为 "oauth2" 时必填)
oauth_client_secret否OAuth2 客户端密钥
oauth_token_file否覆盖令牌文件路径

*常见服务提供商的主机和端口会自动检测(见下文)。自定义服务器必须填写。 **使用 OAuth2 身份验证时不需要。

提供商自动检测

省略 imap_host/smtp_host 时,服务会根据电子邮件域名检测设置:

提供商域名IMAPSMTP
Gmailgmail.com、googlemail.comimap.gmail.com:993smtp.gmail.com:587
Outlookoutlook.com、hotmail.com、live.comoutlook.office365.com:993smtp.office365.com:587
Yahooyahoo.comimap.mail.yahoo.com:993smtp.mail.yahoo.com:587
iCloudicloud.com、me.com、mac.comimap.mail.me.com:993smtp.mail.me.com:587
Fastmailfastmail.com、fastmail.fmimap.fastmail.com:993smtp.fastmail.com:587
Zohozoho.com、zohomail.comimap.zoho.com:993smtp.zoho.com:587

配置中明确指定的主机/端口始终优先于自动检测。

TLS 模式

TLS 模式会根据端口自动检测:

端口协议模式
993IMAP隐式 TLS
143IMAPSTARTTLS
465SMTP隐式 TLS
587SMTPSTARTTLS

在账户对象中设置 "use_starttls": true 或 "use_starttls": false 可覆盖此设置。省略该项则自动检测(推荐)。

OAuth2 身份验证

对于支持 OAuth2 的提供商(Gmail、Outlook),可以使用 OAuth2 代替应用专用密码。此方式采用设备码流程(RFC 8628),无需浏览器重定向。

  1. 在提供商的开发者控制台中创建 OAuth2 凭据(Google Cloud Console 或 Azure AD)

  2. 使用 auth_method: "oauth2" 配置账户:

    [
      {
        "id": "gmail",
        "email": "[email protected]",
        "username": "[email protected]",
        "auth_method": "oauth2",
        "oauth_client_id": "your-client-id.apps.googleusercontent.com",
        "oauth_client_secret": "your-client-secret"
      }
    ]
    
  3. 首次连接时,服务会启动设备码流程,并将验证 URL 和代码打印到 stderr。访问该 URL 并输入代码以完成授权。

  4. 令牌会保存在 ~/.config/mcp-email/tokens/ 中,并自动刷新。后续连接会复用已存储的令牌,无需重新授权。

支持 OAuth2 的提供商:Gmail(gmail.com、googlemail.com)和 Outlook(outlook.com、hotmail.com、live.com)。

环境变量
变量必填默认值说明
EMAIL_CONFIG_FILE是*—JSON 配置文件的路径
EMAIL_ACCOUNTS是*—账户配置的 JSON 数组(内联)
EMAIL_DEFAULT_ACCOUNT否第一个账户默认账户 ID
EMAIL_IMAP_TIMEOUT_MS否30000IMAP 操作超时时间(毫秒)
EMAIL_SMTP_TIMEOUT_MS否30000SMTP 操作超时时间(毫秒)
EMAIL_IMAP_RATE_LIMIT否60每个账户每分钟的 IMAP 请求数
EMAIL_SMTP_RATE_LIMIT否100每个账户每小时的 SMTP 发送数
MAX_ATTACHMENT_SIZE_MB否18单个附件的最大大小(MB)
MAX_TOTAL_ATTACHMENT_SIZE_MB否18每封邮件所有附件的最大总大小(MB)
MAX_DOWNLOAD_SIZE_MB否25附件下载的最大大小(MB)
EMAIL_POOL_CLOSE_TIMEOUT_MS否5000连接池关闭超时时间(毫秒)
EMAIL_DEBUG否false将调试日志输出到 stderr
LOG_LEVEL否info日志级别:debug、info、warn、error
LOG_FORMAT否json日志格式:json 或 text

*必须设置 EMAIL_CONFIG_FILE 或 EMAIL_ACCOUNTS 之一。

配置文件权限

配置文件包含账户密码。请始终限制其访问权限:

chmod 600 ~/.config/mcp-email/accounts.json

工具(22)

账户和文件夹工具
工具说明关键参数
email_accounts列出已配置账户及其连接状态—
email_folders列出所有文件夹及未读/总数account?
email_folder_create创建新文件夹name、account?
消息列表
工具描述关键参数
email_list列出文件夹中的消息folder?、limit?、offset?、includeBody?、account?
email_unread列出未读消息folder?、limit?、includeBody?、account?
email_search搜索主题和正文query、from?、to?、since?、before?、folder?、limit?、includeBody?、account?
消息操作
工具描述关键参数
email_get按 ID 获取完整消息id
email_read_body分页读取邮件正文id、offset?、limit?、format?
email_move将消息移至文件夹id、destination
email_copy将消息复制到文件夹id、destination
email_delete删除消息(移至垃圾箱或永久清除)id、permanent?
email_mark_read将消息标记为已读/未读id、read
email_flag标记/取消标记消息id、flagged
email_reply回复消息(设置 In-Reply-To、References,并引用正文)id、body、all?、cc?、bcc?、isHtml?、account?
email_forward转发消息(重新附上原始附件)id、to、body?、cc?、bcc?、isHtml?、account?
email_batch对多条消息执行批量操作action、ids、destination?、permanent?、read?、flagged?
附件和会话
工具描述关键参数
email_attachment_list列出消息的附件id
email_attachment_get按索引下载附件id、index、saveTo?
email_thread获取对话会话(搜索 INBOX、Sent、Archive 和 All Mail)id
发送和草稿
工具描述关键参数
email_send通过 SMTP 发送邮件,可选添加附件to、subject、body、cc?、bcc?、replyTo?、isHtml?、attachments?、account?
email_draft_create保存草稿,可选添加附件to?、subject?、body?、cc?、bcc?、isHtml?、attachments?、account?
email_draft_send发送现有草稿id

所有可选的 account 参数均默认为已配置的默认账户。

搜索

email_search 使用 IMAP SEARCH OR (SUBJECT "q") (BODY "q") 搜索主题和正文。

可选筛选条件会在扫描正文前于服务端缩小候选范围:

筛选条件格式示例
from电子邮件地址或姓名"[email protected]"
to电子邮件地址或姓名"[email protected]"
sinceYYYY-MM-DD"2026-01-01"
beforeYYYY-MM-DD"2026-02-01"

现有的操作超时设置(默认为 30s)可防止大型邮箱中的正文搜索一直卡住。

附件

email_send 和 email_draft_create 接受 attachments 参数——这是一个包含服务主机上文件引用的数组:

{
  "attachments": [
    {"path": "/tmp/report.pdf"},
    {"path": "/tmp/data.csv", "filename": "Q1-data.csv", "content_type": "text/csv"}
  ]
}
参数必填描述
path是服务主机上的绝对文件路径
filename否覆盖显示的文件名(默认为 path 的基本文件名)
content_type否MIME 类型(若未指定,则根据文件扩展名自动检测)

**限制(默认值):**每个文件 18 MB,总计 18 MB(Base64 编码前;编码后仍低于 25 MB 的 SMTP 上限)。可通过 MAX_ATTACHMENT_SIZE_MB 和 MAX_TOTAL_ATTACHMENT_SIZE_MB 环境变量进行配置。

**下载限制:**附件下载(email_attachment_get)默认上限为 25 MB,可通过 MAX_DOWNLOAD_SIZE_MB 配置。

验证失败(文件不存在、路径不是绝对路径、超出大小限制)时,会返回 INVALID_ARGUMENT。

消息 ID

消息 ID 是组合字符串,用于编码账户、邮箱和 UID:

{account}:{mailbox}:{uid}

示例:hello:INBOX:12345

所有 CRUD 工具(email_get、email_move、email_copy、email_delete、email_mark_read、email_flag、email_draft_send)都会从 ID 中提取账户和文件夹,无需单独传递参数。

错误代码

所有错误都会作为 MCP 工具错误返回,并带有结构化代码前缀:

代码含义
AUTH_FAILEDIMAP/SMTP 身份验证失败
CONNECTION_FAILED无法连接到服务
ACCOUNT_NOT_FOUND未知账户 ID
FOLDER_NOT_FOUND邮箱不存在
MESSAGE_NOT_FOUND邮箱中找不到该 UID
INVALID_ARGUMENT缺少或无效的参数(包括附件验证)
TIMEOUT操作超时
INTERNAL未预期的服务端错误

资源

URI描述
email://status服务版本、账户连接状态、速率限制配置

与 apple-bridge 的比较

此服务与 apple-bridge 共用 Email 模型和参数语义(limit、includeBody、folder、query),因此大模型可以互换使用两者。主要区别如下:

方面mcp-server-emailapple-bridge
传输方式IMAP/SMTP(远程)Mail.app(本地)
工具前缀email_*mail_*
消息 ID{account}:{mailbox}:{uid}RFC 5322 Message-ID
创建文件夹支持不支持(Mail.app 需要通过 UI 操作)
复制消息支持不支持
发送草稿支持不支持(Mail.app 使用撰写界面)
附件(发送)服务主机上的文件路径暂不支持

开发

先决条件
构建
go build ./...
单元测试
make test
# or: go test -race -count=1 ./...

单元测试使用 imap.Operations 和 smtp.Operations 接口的模拟实现,无需运行中的邮件服务。

基准测试
go test -bench=. -benchmem ./...
基准测试包测量内容
BenchmarkPoolGetReleaseimap连接池获取/释放周期
BenchmarkExtractAttachmentsimapMIME 附件提取
BenchmarkHtmlToTexttoolsHTML 到纯文本的转换
BenchmarkLimiterAllowretry速率限制器(顺序执行)
BenchmarkLimiterAllow_Parallelretry速率限制器(并发执行)
模糊测试

模糊测试目标在 testdata/fuzz/ 目录中附带种子语料库。运行指定目标:

go test -fuzz=FuzzParseMessageID ./internal/models/ -fuzztime=30s
目标包模糊测试内容
FuzzBuildSearchCriteriaimapIMAP 搜索查询构建器
FuzzExtractAttachmentByIndeximap附件索引边界处理
FuzzExtractContentTypeimapMIME 内容类型解析器
FuzzParseMessageIDmodels组合消息 ID 编解码器
FuzzHtmlToTexttoolsHTML 到文本的净化器
FuzzSplitAddressestools邮件地址列表拆分器
代码检查
make lint
# or: golangci-lint run ./...
集成测试

集成测试会针对真实邮件服务测试完整的 IMAP/SMTP 协议栈。它们通过 integration 构建标签隔离,绝不会在 go test ./... 期间运行。

邮件服务:Greenmail

测试使用 Greenmail,这是一个打包为 Docker 镜像的轻量级 Java 邮件服务。运行测试时需要注意以下关键信息:

设置值重要性
IMAPS 端口3993Greenmail 的 SSL IMAP 端口(不是 993)。代码会根据端口号自动检测 TLS,因此测试会显式设置 UseStartTLS=false,以便在这个非标准端口上强制使用隐式 TLS。
SMTPS 端口3465Greenmail 的 SSL SMTP 端口(不是 465)。同样需要设置 UseStartTLS=false。
绑定地址0.0.0.0Greenmail 在容器内默认使用 127.0.0.1,这会导致 Docker 端口映射静默失败(连接返回 EOF)。必须传入 -Dgreenmail.hostname=0.0.0.0。
用户名testGreenmail 仅使用本地部分(@ 之前的部分)作为登录用户名,而不是完整的电子邮件地址。如果用户是 [email protected],IMAP/SMTP 用户名就是 test。
TLS 证书自签名Greenmail 会生成自签名证书。测试会在账户配置中设置 InsecureSkipVerify: true 来接受这些证书。
快速开始(一条命令)
make test-integration

这会启动 Greenmail 容器、运行所有集成测试,然后拆除容器,无论测试通过还是失败。

手动逐步操作

如果需要反复运行测试而不必每次都重启容器:

  1. 启动 Greenmail

    docker run -d --name greenmail \
      -p 3465:3465 -p 3993:3993 \
      -e "GREENMAIL_OPTS=-Dgreenmail.setup.test.all -Dgreenmail.users=test:[email protected] -Dgreenmail.hostname=0.0.0.0" \
      greenmail/standalone:2.1.0
    

    等待约 3 秒,让 JVM 启动。

  2. 运行集成测试

    TEST_IMAP_HOST=localhost TEST_IMAP_PORT=3993 \
    TEST_SMTP_HOST=localhost TEST_SMTP_PORT=3465 \
    [email protected] TEST_PASSWORD=password \
      go test -tags=integration -race -v ./...
    
  3. 完成后拆除容器

    docker stop greenmail && docker rm greenmail
    
测试环境变量
变量必需默认值描述
TEST_IMAP_HOST是*—IMAP 服务主机名。未设置时会跳过测试。
TEST_IMAP_PORT否3993IMAPS 端口
TEST_SMTP_HOST是*—SMTP 服务主机名。未设置时会跳过测试。
TEST_SMTP_PORT否3465SMTPS 端口
TEST_EMAIL否[email protected]测试账户的电子邮件地址
TEST_USERNAME否TEST_EMAIL 的本地部分IMAP/SMTP 登录用户名(Greenmail 仅使用本地部分)
TEST_PASSWORD否password账户密码

*如果未设置对应的 HOST 变量,该测试文件中的测试会显示一条消息并跳过,而不会失败。

测试覆盖范围

IMAP(internal/imap/integration_test.go — 7 项测试):

测试验证内容
ConnectAndListFoldersTLS 连接、身份验证、文件夹列表,以及 INBOX 是否存在
SendAndListMessagesSMTP 发送 → IMAP 接收往返流程,正文内容匹配
SearchBySubject按主题字符串执行 IMAP SEARCH
DeleteMessagePermanent标记为已删除并执行 expunge,验证邮件已消失
MoveMessage使用 IMAP MOVE 移动到其他文件夹(如果服务不支持 MOVE 扩展则跳过)
DraftWorkflowSaveDraft → GetDraft → DeleteDraft 生命周期(如果没有 APPENDUID 则跳过)
MarkReadAndFlag设置已读/已标记标志,并通过 GetMessage 验证

SMTP(internal/smtp/integration_test.go — 4 项测试):

测试验证内容
SendPlainText纯文本邮件投递,通过 IMAP 验证正文内容
SendHTMLHTML 邮件投递,验证 Content-Type 为 text/html
SendWithAttachment带附件的多部分 MIME,验证元数据中的文件名
RateLimitTokenConsumption发送操作会消耗速率限制令牌
故障排除
症状原因修复方法
连接时出现 EOF 或 connection resetGreenmail 在容器内绑定到 127.0.0.1在 GREENMAIL_OPTS 中添加 -Dgreenmail.hostname=0.0.0.0
TLS handshake failure / 证书错误自签名证书被拒绝测试配置已设置 InsecureSkipVerify: true——如果编写新测试,也进行相同设置
Invalid login/password使用了完整的电子邮件地址作为用户名Greenmail 只接受本地部分(test,而不是 [email protected])。设置 TEST_USERNAME,或使用默认值。
端口 3993 上出现 STARTTLS 错误在隐式 TLS 端口上使用了 STARTTLS测试配置设置了 UseStartTLS=false。不要使用端口 3143/3025(明文,无 TLS)。
测试因“not set”而跳过未导出 TEST_IMAP_HOST / TEST_SMTP_HOST导出环境变量,或使用 make test-integration 目标
MoveMessage 测试被跳过Greenmail 可能不支持 MOVE预期行为——测试使用了 t.Skip()
CI

集成测试通过 .github/workflows/ci.yml 中的 integration 作业在 GitHub Actions 中自动运行。该作业使用 Greenmail 服务容器,无需手动设置 Docker。具体配置请参阅工作流文件。

覆盖率

要生成单元测试和集成测试的综合覆盖率报告:

# With Greenmail running (see above):
TEST_IMAP_HOST=localhost TEST_IMAP_PORT=3993 \
TEST_SMTP_HOST=localhost TEST_SMTP_PORT=3465 \
[email protected] TEST_PASSWORD=password \
  go test -tags=integration -race -coverprofile=coverage.out ./...

go tool cover -func=coverage.out | tail -1   # total percentage
go tool cover -html=coverage.out             # open in browser
架构
mcp-server-email/
├── cmd/mcp-server-email/     # Entry point
└── internal/
    ├── auth/                 # OAuth2 device code flow, XOAUTH2 SASL, token store
    ├── config/               # Multi-account configuration, provider auto-detection
    ├── imap/                 # IMAP client (split by concern), connection pool, Operations interface
    │   ├── client.go         # Client struct, lifecycle, shared helpers
    │   ├── client_messages.go # List, search, get, attachments
    │   ├── client_folders.go  # Folder ops, role cache
    │   ├── client_drafts.go   # Draft save/get/delete
    │   ├── client_flags.go    # Flags, move, copy, delete
    │   └── pool.go           # Connection pool with configurable close timeout
    ├── log/                  # Structured logging (slog) initialization
    ├── models/               # Email model, message ID codec, error types
    ├── resources/            # email://status resource
    ├── retry/                # Token-bucket rate limiter
    ├── smtp/                 # SMTP client, Operations interface
    └── tools/                # 22 MCP tool handlers + registration

工具处理程序通过 imap.Operations 和 smtp.Operations 接口与 IMAP/SMTP 客户端解耦,从而能够使用模拟对象进行全面的单元测试。

依赖项

本项目使用 go-imap v2(当前版本为 v2.0.0-beta.8)。 v2 API 尚未稳定——在 v2.0.0 发布前可能会发生破坏性变更。 我们在 go.mod 中固定了确切版本,并将在稳定版发布后及时升级。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。