Guide
Outlook CLI:从终端发送邮件
使用 Outlook CLI 从终端发送 Microsoft 365 邮件,无需 Graph API 设置、Azure AD 注册、MSAL 令牌代码或 SMTP 配置。本指南涵盖发送、定时、HTML 正文、JSON 输出以及共享邮箱流程,无需为每个操作创建 Azure AD 应用。
Written by Caleb Geene Director, Site Reliability Engineering
Reviewed by Hazik
如何使用 Outlook CLI 从终端发送邮件?
连接 Outlook 或 Microsoft 365 一次,然后使用 nylas email send --to user@example.com --subject "Hello" --body "Hi" --yes 发送邮件。这提供了一个 Outlook CLI 发送工作流,无需注册 Azure AD 应用、集成 MSAL 或配置 SMTP。
同一条命令覆盖了通常需要开发者进入 Graph API 应用注册或 SMTP 凭据设置的 Outlook 命令行发送邮件用例。
以编程方式发送 Outlook 邮件的问题始于 Microsoft 的设置流程。
以编程方式发送 Outlook 邮件需要通过 Microsoft 生态系统完成 4-5 个设置步骤:注册 Azure AD 应用、配置 Mail.Send API 权限、获取管理员同意、集成 MSAL 认证库以及处理令牌刷新。对于从终端或 shell 脚本进行的一次性发送,这些开销将一个 10 秒的任务变成了 45 分钟的项目。
Microsoft 推荐的发送路径是 Graph API /sendMail 端点。根据 Microsoft 的 OAuth 2.0 文档,访问令牌在 60-90 分钟后过期,并需要刷新令牌轮换。
对于从终端或 shell 脚本快速发送,这些设置太繁琐了。通过 smtp.office365.com 端口 587 的 SMTP 仍然可用,但 Microsoft 已于 2022 年 10 月停用 Exchange Online 的 Basic Auth。你不能再使用用户名/密码了。
Nylas CLI 绕过了所有这些步骤。它与 Nylas API 通信,由后者处理 OAuth2 令牌刷新、提供商路由和连接管理。认证一次,然后用一条命令发送。
1. 安装
Nylas CLI 在 macOS、Linux 或 Windows 上 30 秒内即可安装完成,无需 Azure AD 应用注册、Graph API 凭据或 MSAL 库。二进制文件是一个不到 20 MB 的单一 Go 可执行文件,安装时自动检测平台和架构。
在 macOS 或 Linux 上,通过 Homebrew 安装。在 Windows 上——根据 Statcounter 数据,超过 80% 的 Outlook 桌面用户使用 Windows——使用 PowerShell 单行命令。两种方式都会自动验证 SHA-256 校验和。请参阅入门指南了解更多安装选项。
2. 认证你的 Outlook 账户
认证通过一次 OAuth2 流程将 Nylas CLI 连接到你的 Outlook 或 Microsoft 365 邮箱,取代了 Graph API 所需的多步 Azure AD 应用注册。整个过程大约需要 2 分钟,凭据安全存储在系统密钥环中,无需每次命令都重新认证。
前往 dashboard-v3.nylas.com,创建应用并连接你的 Outlook 或 M365 邮箱。然后使用 API 密钥配置 CLI。根据 Microsoft 的 OAuth 2.0 文档,访问令牌在 60-90 分钟后过期——Nylas 在后台自动处理刷新。
nylas auth config
# 提示时粘贴你的 API 密钥
# 验证连接
nylas auth whoami
# => Authenticated as you@company.com (Microsoft)凭据持久保存在操作系统密钥环中(macOS Keychain、Windows Credential Manager 或 Linux libsecret)。除非撤销授权,否则无需重新认证。
3. 从用户邮箱、别名或共享邮箱发送
Microsoft 365 组织通常为每个部门管理 3-5 种邮箱身份类型——用户邮箱、共享邮箱、通讯组、会议室资源和发送别名。Nylas CLI 通过指向正确的 grant ID 从这些身份中的任何一个发送邮件。关键问题不仅是"我能发消息吗?"——而是"这条消息应该从哪个邮箱身份发出?"
从个人 Outlook 邮箱发送时,运行命令无需指定 grant ID——CLI 使用默认的已认证邮箱。从共享邮箱或部门身份发送时,将共享邮箱的 grant ID 作为第一个参数传入。每个 grant 精确映射到 Exchange Online 中的一个邮箱身份。
# 从你自己的 Outlook 邮箱发送
nylas email send \
--to "colleague@company.com" \
--subject "Q2 planning doc" \
--body "Hi — the planning doc is ready for review." \
--yes
# 从共享邮箱 grant 发送
nylas email send <shared-mailbox-grant-id> \
--to "vendor@partner.com" \
--subject "PO #4521" \
--body "Purchase order 4521 is ready for review." \
--yes如果缺少 send-as 或共享邮箱权限,Microsoft 365 会返回 403 错误并拒绝发送,即使命令语法正确。根据 Microsoft 的 Exchange Online 权限文档,共享邮箱委托更改最多需要 60 分钟才能生效。该错误是 Exchange Online 策略问题,而非 CLI 问题。
4. 通讯组列表、别名和团队队列
Microsoft 365 通讯组列表和 M365 群组在服务器端展开为所有成员邮箱,这意味着一条 nylas email send 命令可以触达数百个收件人,无需客户端地址解析。拥有 500+ 员工的企业通常维护 20-50 个通讯组列表,用于部门、项目团队和合规路由。Nylas CLI 发送到这些列表的方式与发送到个人地址相同——在 --to 标志中指定列表地址。
以下示例展示了两种常见模式:向工程通讯组列表广播,以及通过 CC 将合同更新路由到法务部门并使用合规 BCC。--bcc 标志将合规或日志记录地址从可见收件人列表中隐藏,这在金融和医疗等受监管行业中是常见要求。
# 发送到通讯组列表
nylas email send \
--to "engineering-all@company.com" \
--subject "Deployment window tonight" \
--body "Production deploy starts at 22:00 UTC. Freeze all PRs by 21:00." \
--yes
# 包含合规或存档收件人
nylas email send \
--to "contracts@company.com" \
--cc "legal@company.com" \
--bcc "compliance@company.com" \
--subject "Contract update" \
--body "Updated terms are ready for review in the contract system." \
--yes5. HTML 正文和业务工作流邮件
Outlook 业务邮件经常包含发票、审批、工作说明书和采购更新。当前 CLI 发送命令通过 --body 接受 HTML,通过 --template-id 支持托管模板,并将文件交付分开处理:在文档系统中发布文件并发送链接,或在需要 MIME 附件时使用 Nylas API/SDK。
Outlook 的渲染引擎通过 Microsoft Word 的 HTML 解析器处理 HTML,因此某些 CSS 属性的渲染效果与 Gmail 或 Apple Mail 不同。保持自动化 HTML 正文简短,内联关键样式,并让租户级 DLP 和传输规则在发送完成后检查最终消息。
nylas email send \
--to "client@example.com" \
--subject "Invoice #1042" \
--body "<h1>Invoice #1042</h1><p>Amount due: <strong>$2,400.00</strong></p><p>Payment link: <a href='https://pay.example.com/1042'>pay.example.com/1042</a></p>" \
--yes6. 定时发送并遵守 Microsoft 365 限制
Microsoft 365 中的定时邮件发送允许你现在撰写消息并在特定的未来时间发送,这对于联系不同时区的收件人或在非工作时间排队跟进邮件很有用。大多数计划中,Microsoft 365 对发送限制为每分钟 30 条消息和每天 10,000 个收件人,因此批量或自动化发送循环需要合理的节奏以避免临时封锁。
--schedule 标志接受自然语言时间表达式,如 "tomorrow 9am" 或 "next Monday 2pm EST"。对于批量发送循环,在发送之间添加 2 秒的 sleep 可以保持在 Microsoft 每分钟 30 条消息的上限之下,避免触发长达 24 小时的临时发送封锁。
# 定时发送跟进邮件
nylas email send \
--to "client@example.com" \
--subject "Follow-up" \
--body "Checking in on the proposal." \
--schedule "tomorrow 9am" \
--yes
# 对邮箱自动化循环进行速率限制
while read -r recipient; do
nylas email send --to "$recipient" --subject "Status update" --body "See attached notes." --yes
sleep 2
done < recipients.txt7. JSON 输出用于脚本和审计追踪
在任何 nylas email send 命令后添加 --json 会以结构化 JSON 返回完整的消息对象,包括消息 ID、grant ID、线程 ID、时间戳和发件人/收件人地址。此输出可用于记录发送事件、将消息 ID 传递给下游队列处理器,或满足需要精确时间戳的投递尝试证明的合规审计追踪。
JSON 响应通常为每条消息 400-600 字节,遵循 Nylas API 消息 schema。通过管道将输出传递给 jq 可以提取特定字段——用于跟踪的消息 ID、用于会话线程的线程 ID 或用于审计日志的日期。
nylas email send \
--to "user@example.com" \
--subject "Test" \
--body "Hello." \
--json --yes{
"id": "a1b2c3d4e5f6g7h8",
"grant_id": "d3f4a5b6-c7d8-9e0f-a1b2-c3d4e5f6g7h8",
"thread_id": "x9y8z7w6v5u4t3s2",
"subject": "Test",
"from": [{"name": "Dev User", "email": "dev@company.com"}],
"to": [{"name": "", "email": "user@example.com"}],
"date": "2026-03-28T10:30:00-04:00",
"object": "message"
}在 shell 脚本中,你可以使用 jq 从 JSON 输出中捕获消息 ID,并用于下游处理——验证投递状态、追加到审计 CSV 或传递到工单系统。.id 字段是一个 16 字符的唯一字符串,映射到 Nylas API 中的消息。
# 发送后捕获消息 ID
msg_id=$(nylas email send \
--to "user@example.com" \
--subject "Automated" \
--body "This is automated." \
--json --yes | jq -r '.id')
echo "Sent message: $msg_id"Graph API 与 Nylas CLI 对比
使用 Microsoft Graph API 发送一封 Outlook 邮件,包括 Azure AD 应用注册、MSAL 令牌获取、令牌刷新处理和实际 POST 请求在内,需要 50-100 行 Python 或 Node.js 代码。Nylas CLI 将其简化为 1 条命令,零行代码,无需 Azure 门户配置。以下对比表详细列出了两种方法的每个步骤。
| 步骤 | Graph API | Nylas CLI |
|---|---|---|
| 应用注册 | Azure AD 门户,配置重定向 URI | 不需要 |
| 权限 | 添加 Mail.Send,获取管理员同意 | 不需要 |
| 认证 | MSAL 库,获取令牌,处理刷新 | nylas auth config(一次) |
| 发送邮件 | POST 到 /me/sendMail,带 JSON 正文 | nylas email send --to ... |
| 文件交付 | 在 JSON 中 Base64 编码,>3 MB 使用上传会话 | 发送链接,或使用 Nylas API/SDK 添加附件 |
| 令牌刷新 | 处理 401,轮换刷新令牌 | 自动处理 |
| 多提供商 | 仅限 Microsoft | Gmail、Outlook、Exchange、Yahoo、iCloud、IMAP |
| 代码行数 | 50-100+(Python/Node 加 MSAL) | 1 条命令 |
Outlook 专属技巧
Microsoft 365 具有租户级策略、合规功能和消费者邮件提供商(如 Gmail 或 Yahoo)中不存在的邮箱类型。以下技巧涵盖 Outlook 特有的行为——已读回执、敏感度标签、共享邮箱、速率限制和传输规则——这些会影响邮件离开 CLI 后的处理方式。
已读回执
Outlook 通过 Disposition-Notification-To 头支持已读回执请求。通过 Nylas CLI 发送时,收件人的 Outlook 客户端可能会根据其设置提示发送已读回执。根据 Microsoft 的文档,收件人可以拒绝已读回执请求,因此不要在自动化工作流中依赖它们来确认投递。
敏感度标签
M365 敏感度标签(机密、内部等)由 Microsoft Information Protection 在租户级别应用。通过 Nylas CLI 发送的消息遵循租户的默认标签策略。如果你的组织要求特定标签,Exchange 管理员可以设置自动标签规则,无论使用何种发送客户端都会应用于所有出站邮件。
共享邮箱发送
要从共享邮箱发送,通过 OAuth 流程将其作为单独的 grant 连接。每个共享邮箱获得自己的 grant ID,发送时引用该 ID。连接共享邮箱的用户账户必须在 Exchange Online 中拥有完全访问或代理发送权限——委托更改最多需要 60 分钟才能生效。
# 连接共享邮箱
nylas auth login
# 按照共享邮箱的 OAuth 流程操作
# 使用共享邮箱的 grant ID 发送
nylas email send <shared-mailbox-grant-id> \
--to "vendor@partner.com" \
--subject "PO #4521" \
--body "Purchase order 4521 is ready for review."Outlook 发送限制
大多数计划中,Microsoft 365 对发送限制为每天 10,000 个收件人和每分钟 30 条消息。根据 Microsoft 的 Exchange Online 限制文档,超出这些限制会触发临时封锁。对于批量发送,在脚本中的消息之间添加 sleep 2。
传输规则、日志记录和代理发送策略
Microsoft 365 邮件流由租户范围的 Exchange Online 规则塑造,这些规则在消息到达收件人之前处理消息。传输规则可以根据发件人、收件人、主题或内容模式重定向、阻止或修改消息。日志记录将所有邮件复制到合规邮箱。DLP 策略根据超过 100 种内置敏感信息类型扫描附件和正文内容。根据 Microsoft 的邮件流规则文档,传输规则按优先级顺序评估,第一条匹配的规则可以停止后续处理。
如果 Outlook 发送在两个邮箱之间表现不同,原因通常是邮箱策略或租户路由策略,而非 CLI 命令语法。
共享邮箱和团队队列工作流
Microsoft 365 组织使用共享邮箱处理采购、支持、招聘和行政运营。根据 Microsoft 的共享邮箱文档,50 GB 以下的共享邮箱不需要单独的许可证。通过 Nylas CLI 从 support@company.com 或 ap@company.com 发送邮件,只需将共享邮箱作为单独的 grant 连接,并在发送命令中指定其 grant ID。
后续步骤
一旦你能从终端发送 Outlook 邮件,就可以扩展工作流——阅读和过滤 Outlook 收件箱、管理日历事件、将 AI 代理连接到你的邮箱,或切换到完全不同的提供商——Nylas CLI 用相同的命令语法支持 6 个提供商。
- 从终端发送邮件 — 跨提供商指南,涵盖 Linux、macOS 和 Windows
- 从终端列出 Outlook 邮件 — 阅读、搜索和过滤你的 Outlook 收件箱
- 通过 CLI 管理 Outlook 日历 — 创建事件、检查可用性、安排会议
- 通过 MCP 赋予 AI 代理邮件访问权限 — 将 Claude、Cursor 或 VS Code 连接到你的 Outlook 收件箱
- 完整命令参考 — 每个标志和子命令的文档