运行时依赖
无特殊依赖
安装命令
点击复制官方npx clawhub@latest install imapflow
镜像加速npx clawhub@latest install imapflow --registry https://cn.longxiaskill.com 镜像可用
本土化适配说明
imapflow 安装说明: 安装命令:["openclaw skills install imapflow"]
技能文档
ImapFlow 概述 ImapFlow 是一个现代的、基于 Promise 的 IMAP 客户端,用于 Node.js。它可以自动检测和处理 IMAP 扩展(CONDSTORE、QRESYNC、IDLE、COMPRESS 等),因此相同的代码可以在不同的服务器上运行。主要特性包括:async/await API、异步迭代器用于消息流、内置的邮箱锁定、TypeScript 支持、SOCKS/HTTP 代理支持、Gmail X-GM-EXT-1 支持。
触发场景 在构建电子邮件功能时使用:连接到 IMAP 服务器、获取/阅读电子邮件、搜索邮箱、管理文件夹、通过 IDLE 监控新消息、使用 Gmail 标签和 Gmail 特定扩展,或者任何基于 IMAP 的电子邮件自动化。
快速开始
const { ImapFlow } = require('imapflow');
const client = new ImapFlow({
host: 'imap.example.com',
port: 993,
secure: true,
auth: {
user: 'user@example.com',
pass: 'password'
}
});
await client.connect();
let lock = await client.getMailboxLock('INBOX');
try {
// 获取最新消息
let msg = await client.fetchOne(client.mailbox.exists, { source: true });
console.log(msg.source.toString());
// 流式获取所有消息
for await (let msg of client.fetch('1:', { envelope: true })) {
console.log(${msg.uid}: ${msg.envelope.subject});
}
} finally {
lock.release();
}
await client.logout();
核心任务
- 连接
const client = new ImapFlow({
host: 'imap.example.com',
port: 993,
secure: true,
auth: {
user: 'user@example.com',
pass: 'password'
}
});
await client.connect();
提供商特定配置 → 参见 references/connection.md 以获取 Gmail、Outlook、Yahoo、iCloud 和其他常见提供商的配置。
OAuth2 / XOAUTH2:
auth: {
user: 'user@gmail.com',
accessToken: 'ya29.xxx...'
}
常见选项:
logger:传递一个日志对象(console、pino 等)用于调试输出。设置 logger:false 以禁用。
emitLogs:设置为 true 以发出 'log' 事件而不是使用日志器。
clientInfo:自定义客户端标识 { name: 'myapp', version: '1.0.0' }。
disableAutoIdle:禁用自动 IDLE 当邮箱被选中。
断开连接:调用 client.logout() 以进行正常断开。处理 client.close() 以进行突然断开。- 获取消息
let lock = await client.getMailboxLock('INBOX');
try {
// ... 获取操作 ...
} finally {
lock.release();
}
获取一条消息:
let msg = await client.fetchOne('', { source: true });
// 或通过序列号:
client.fetchOne(42, { source: true })
// 或通过 UID(追加 uid 标志):
let msg = await client.fetchOne('12345', { uid: true, source: true });
获取查询选项(要检索的数据 —— 只选择需要的内容):
source —— 完整的 RFC822 消息源(作为 Buffer)
envelope —— 解析的信封(主题、发件人、收件人、日期、消息 ID)
bodyStructure —— MIME 结构树
flags —— 标志数组(\Seen、\Answered 等)
internalDate —— 内部服务器日期
size —— 消息大小(字节)
uid —— UID(始终包含)
threadId —— THREAD=ORDEREDSUBJECT 引用(Gmail)
labels —— Gmail 标签(X-GM-LABELS)
headers —— 原始头部(作为 Buffer)
bodyParts —— MIME 部分路径数组,例如 ['1.1', '1.2']流式/迭代消息:
// 范围:序列号
for await (let msg of client.fetch('1:100', { envelope: true, flags: true })) {
console.log(${msg.seq}: ${msg.envelope.subject});
}
// 所有消息:'1:'
for await (let msg of client.fetch('1:', { envelope: true })) {
/ ... /
}
// 通过 UID 范围
for await (let msg of client.fetch('1000:2000', { uid: true, envelope: true })) {
/ ... /
}
获取特定正文部分:
let msg = await client.fetchOne('', { bodyParts: ['1.1', '1.2'], // MIME 部分路径
source: true });
// msg.bodyParts.get('1.1') → Buffer
// msg.text.toString() → 解码的文本内容
下载附件:
常见信封字段: msg.envelope.subject msg.envelope.from[0].address msg.envelope.to[0].address msg.envelope.date msg.envelope.messageId msg.envelope.inReplyTolet msg = await client.fetchOne('', { source: true, bodyStructure: true }); for (let attachment of msg.attachments) { let buf = await client.download(msg.uid, attachment.part, { uid: true }); // buf 包含附件数据 }
- 搜索
let lock = await client.getMailboxLock('INBOX');
try {
// 简单搜索
let list = await client.search({ unseen: true });
// 复杂查询
let list = await client.search({
from: 'sender@example.com',
subject: 'invoice',
seen: false,
since: new Date('2024-01-01'),
before: new Date('2024-12-31'),
larger: 1024 * 1024 // > 1MB
});
// 文本搜索(正文)
let list = await client.search({ body: '重要关键词' });
// 结合 OR
let list = await client.search({
or: [
{ from: 'alice@example.com' },
{ from: 'bob@example.com' }
]
});
// 结合 AND + OR
let list = await client.search({
subject: '报告',
or: [
{ from: 'alice@example.com' },
{ from: 'bob@example.com' }
]
});