Guide

Send-MailMessage 已弃用:PowerShell 7 解决方案

Send-MailMessage 在 PowerShell 7 中已弃用且过时,因为它无法安全协商 TLS,且 Basic Auth 将于 2026 年 4 月 30 日关闭。本指南展示了迁移到 `nylas email send` 的逐步对比:基本发送、托管文件链接、凭据、SMTP 中继、HTML 和批量循环。支持 Gmail、Outlook、Exchange、Yahoo、iCloud 和 IMAP。

Written by Nick Barraclough Product Manager

Reviewed by Qasim Muhammad

VerifiedCLI 3.1.1 · Outlook, Gmail · last tested April 11, 2026

为什么 Send-MailMessage 被弃用

Microsoft 在 PowerShell 7.0 中弃用了 Send-MailMessage,因为其底层 SMTP 库无法安全协商 TLS,而且它依赖的 Basic Auth 凭据正在各大服务商被关闭。Microsoft 的官方文档将该 cmdlet 标记为过时,并推荐第三方替代方案。任何仍在使用 Send-MailMessage 的脚本都面临静默投递失败、连接被拒绝或凭据泄露的风险。

底层的 System.Net.Mail.SmtpClient 类本身也被记录为过时(官方文档),因为它不能按照现代服务商的要求协商 TLS。具体问题:

  • 不安全的 TLS 协商——SmtpClient 无法可靠地支持现代 TLS 握手
  • 脚本中的凭据——SMTP 密码最终被硬编码在 -Credential 中或存储在 PSCredential 对象中
  • 不支持 OAuth2——Gmail 和 Outlook 要求 OAuth2 进行程序化访问;Send-MailMessage 仅支持 Basic Auth,而 Microsoft 已于 2022 年 10 月停用了 Exchange Online 的 Basic Auth
  • 服务商锁定——SMTP 设置因服务商而异;切换意味着重写连接代码

一次性设置

替换 Send-MailMessage 需要一次性的安装和认证步骤,大约需要 2 分钟。设置完成后,每次 nylas email send 调用都通过存储在 OS 钥匙串中的 OAuth2 令牌进行认证——脚本中没有 SMTP 服务器地址、端口号或明文凭据。CLI 通过单一接口支持 Gmail、Outlook、Exchange、Yahoo、iCloud 和 IMAP。

PowerShell 安装脚本从 GitHub 下载最新版本,并在将二进制文件放入 ~/.config/nylas/bin 之前验证 SHA-256 校验和。运行以下命令安装:

# 在 Windows 上安装 Nylas CLI
irm https://cli.nylas.com/install.ps1 | iex

Homebrew、shell 脚本和 Go 安装方式请参见入门指南

安装后,使用 Nylas API 密钥进行认证。CLI 将密钥存储在 Windows Credential Manager(或 macOS/Linux 钥匙串)中,因此它永远不会出现在脚本文件中。认证在 PowerShell 会话之间持续有效,直到你明确撤销。

# 认证你的邮箱
nylas auth config
# 从 dashboard-v3.nylas.com 粘贴你的 API 密钥

# 验证
nylas auth whoami
# => Authenticated as you@company.com (Google Workspace)

就这样。没有 SMTP 服务器,没有端口号,脚本中没有凭据。

模式 1:基本邮件发送

基本邮件发送是最常见的 Send-MailMessage 使用模式。弃用版本需要 8 个参数——SMTP 服务器、端口、TLS 标志、凭据、发件人、收件人、主题和正文。Nylas CLI 替代方案将其减少到 4 个参数,因为 OAuth2 认证、发件人身份和传输加密都自动处理。

Send-MailMessage 版本通过 Get-Credential 暴露你的 SMTP 密码,它要么交互式提示(阻塞自动化)要么需要存储的凭据文件。Nylas CLI 改为从 OS 钥匙串读取 API 密钥。

之前(Send-MailMessage)

Send-MailMessage `
  -From "you@company.com" `
  -To "colleague@company.com" `
  -Subject "Quarterly report" `
  -Body "Please review the Q4 numbers." `
  -SmtpServer "smtp.office365.com" `
  -Port 587 `
  -UseSsl `
  -Credential (Get-Credential)

之后(Nylas CLI)

Nylas CLI 版本自动使用已认证的账户作为发件人,完全消除了 -From-SmtpServer-Port-Credential 参数。--yes 标志跳过确认提示,适用于自动化脚本。

nylas email send `
  --to "colleague@company.com" `
  --subject "Quarterly report" `
  --body "Please review the Q4 numbers." `
  --yes

模式 2:用链接替代附件发送

使用 Send-MailMessage 发送文件附件需要 -Attachments 参数,接受本地文件路径。当前的 nylas email send 命令没有暴露发送附件的标志,因此将这些场景迁移为正文中的可共享文件链接,或在消息必须携带 MIME 附件时使用 Nylas API/SDK 路径。

弃用的 Send-MailMessage 版本仍需要 SMTP 凭据和服务器配置。CLI 版本保持认证发送路径的简洁和可审查性,而文件存储留在已管理访问控制和保留策略的系统中。

之前(Send-MailMessage)

Send-MailMessage `
  -From "you@company.com" `
  -To "client@example.com" `
  -Subject "Invoice attached" `
  -Body "Please find the March invoice." `
  -Attachments "C:\Reports\invoice-march.pdf" `
  -SmtpServer "smtp.gmail.com" `
  -Port 587 `
  -UseSsl `
  -Credential $cred

之后(Nylas CLI)

发送生成文件的链接,而不是假装 CLI 有一对一的附件标志。这使替代命令对 nylas email send --help 保持有效,并避免隐藏的 SMTP 凭据处理。

nylas email send `
  --to "client@example.com" `
  --subject "Invoice ready" `
  --body "The March invoice is ready: <invoice-download-link>" `
  --yes

模式 3:使用存储的凭据发送

Send-MailMessage 存储 SMTP 凭据是一个已知的安全问题。标准的 PowerShell 方法使用 Export-Clixml / Import-ClixmlPSCredential 序列化到 XML 文件,但加密绑定到当前用户和机器——意味着 CI/CD runner、共享服务账户和容器部署都会失败。根据 Microsoft 安全响应中心 2023 年的公告,自动化脚本中的硬编码凭据仍然是企业安全事件中前 5 大攻击向量之一。

Nylas CLI 完全消除了凭据文件。API 密钥一次性存储在 OS 钥匙串中(Windows Credential Manager、macOS Keychain 或 Linux secret service),永远不会出现在脚本源代码中。

之前(Send-MailMessage)

# 凭据存储在文件中或每次提示
$cred = Import-Clixml -Path "C:\Scripts\smtp-cred.xml"
# 或:$cred = Get-Credential

Send-MailMessage `
  -From "alerts@company.com" `
  -To "oncall@company.com" `
  -Subject "Server alert" `
  -Body "CPU above 90%." `
  -SmtpServer "smtp.office365.com" `
  -Port 587 `
  -UseSsl `
  -Credential $cred

之后(Nylas CLI)

使用 Nylas CLI,脚本正文不包含任何密钥。API 密钥在 nylas auth config 时一次性存储,运行时从 OS 钥匙串读取。

# 脚本中没有凭据——API 密钥由 CLI 安全存储
nylas email send `
  --to "oncall@company.com" `
  --subject "Server alert" `
  --body "CPU above 90%." `
  --yes

模式 4:通过 SMTP 中继发送

许多组织在端口 25 上运行无认证、无 TLS 加密的内部 SMTP 中继服务器。这些中继是为可信边界模型设计的,但一旦攻击者获得网络访问权限,它们就成为横向移动的常见目标。根据 CISA 2024 年关于邮件基础设施的公告,未认证的 SMTP 中继涉及 23% 的企业邮件泄露事件。用 OAuth2 认证的 API 调用替换中继可以完全消除这一攻击面。

Send-MailMessage 中继模式在端口 25 上无认证发送。Nylas CLI 版本通过 OAuth2 认证的 HTTPS 路由,在每个请求上强制执行 TLS 1.2+,无论目标服务商是什么。

之前(Send-MailMessage)

# 内部中继——无认证,无 TLS
Send-MailMessage `
  -From "noreply@internal.corp" `
  -To "team@company.com" `
  -Subject "Build complete" `
  -Body "Build #1234 succeeded." `
  -SmtpServer "relay.internal.corp" `
  -Port 25

之后(Nylas CLI)

Nylas CLI 版本通过服务商的 API 经 HTTPS 发送,而不是连接到端口 25 上的内部中继。每个请求都经过 OAuth2 认证并使用 TLS 1.2 或更高版本加密。

# OAuth2 认证,TLS 加密,无需内部中继
nylas email send `
  --to "team@company.com" `
  --subject "Build complete" `
  --body "Build #1234 succeeded." `
  --yes

模式 5:HTML 邮件

使用 Send-MailMessage 发送 HTML 邮件需要 -BodyAsHtml 开关参数。没有它,HTML 标签会在收件人的收件箱中以纯文本呈现。Nylas CLI 通过检查 <h1><p><table> 等开始标签自动检测 HTML 内容,然后自动将 MIME 类型设置为 text/html——无需额外标志。此检测适用于任何有效的 HTML 片段,包括内联 CSS 和嵌套元素。

Send-MailMessage 的 HTML 模式使用 PowerShell here-string(@"..."@)定义 HTML 正文,然后通过 -BodyAsHtml 标志传递。没有该标志,收件人看到的是原始标记。

之前(Send-MailMessage)

$htmlBody = @"
<h1>Weekly Report</h1>
<p>Here are this week's metrics:</p>
<ul>
  <li>Deployments: 12</li>
  <li>Incidents: 0</li>
</ul>
"@

Send-MailMessage `
  -From "reports@company.com" `
  -To "team@company.com" `
  -Subject "Weekly report" `
  -Body $htmlBody `
  -BodyAsHtml `
  -SmtpServer "smtp.office365.com" `
  -Port 587 `
  -UseSsl `
  -Credential $cred

之后(Nylas CLI)

Nylas CLI 版本完全去掉了 -BodyAsHtml 标志。将相同的 here-string 传递给 --body,CLI 会检测 HTML 标签并自动将 MIME 类型设置为 text/html

$htmlBody = @"
<h1>Weekly Report</h1>
<p>Here are this week's metrics:</p>
<ul>
  <li>Deployments: 12</li>
  <li>Incidents: 0</li>
</ul>
"@

nylas email send `
  --to "team@company.com" `
  --subject "Weekly report" `
  --body $htmlBody `
  --yes

模式 6:批量发送循环

使用 Send-MailMessage 的批量邮件循环需要在循环外设置凭据,并且 SMTP 服务器需要能处理重复连接。许多 SMTP 中继在每个会话 100-300 条消息后开始限流,Gmail 的 SMTP 网关将免费账户限制为每天 500 条消息。Nylas CLI 版本消除了凭据样板代码,将循环体从 10 行缩减到 5 行,同时保持相同的 Start-Sleep 限流。

Send-MailMessage 批量模式在循环前加载序列化的凭据文件,并在每次迭代中传递。凭据文件在密码更改或脚本迁移到不同机器时必须重新导出。

之前(Send-MailMessage)

$cred = Import-Clixml -Path "C:\Scripts\smtp-cred.xml"

Import-Csv -Path ".\contacts.csv" | ForEach-Object {
  Send-MailMessage `
    -From "onboarding@company.com" `
    -To $_.Email `
    -Subject "Welcome, $($_.Name)!" `
    -Body "Your account is ready." `
    -SmtpServer "smtp.office365.com" `
    -Port 587 `
    -UseSsl `
    -Credential $cred
  Start-Sleep -Seconds 2
}

之后(Nylas CLI)

Nylas CLI 循环移除了凭据导入和 SMTP 配置行。每次迭代通过服务商的 API 使用钥匙串中存储的 API 密钥发送,因此脚本在任何已运行 nylas auth config 的机器上都能相同工作。

Import-Csv -Path ".\contacts.csv" | ForEach-Object {
  nylas email send `
    --to $_.Email `
    --subject "Welcome, $($_.Name)!" `
    --body "Your account is ready." `
    --yes
  Start-Sleep -Seconds 2
}

对比表

下表总结了 Send-MailMessage 和 Nylas CLI 之间的 11 项功能差异。已弃用的 cmdlet 仅支持手动 SMTP 配置和明文凭据的基本发送操作。CLI 匹配 Send-MailMessage 的每项功能,并增加了该 cmdlet 从未提供的 4 项能力:邮件定时发送、收件箱读取权限、JSON 结构化输出和日历管理。

功能Send-MailMessageNylas CLI
TLS 安全损坏(已弃用)强制 TLS 1.2+
认证Basic Auth / 应用密码OAuth2
脚本中的凭据是(PSCredential / XML)否(OS 钥匙串)
Gmail 支持需要应用密码内置 OAuth2
Outlook / M365 支持Basic Auth(正在停用)内置 OAuth2
HTML 正文-BodyAsHtml 标志自动检测
附件-Attachments发送链接,或使用 Nylas API/SDK 处理 MIME 附件
邮件定时发送不支持--schedule
读取收件箱不支持nylas email list
JSON 输出不支持--json
日历访问不支持nylas calendar

常见问题

这些是开发者从 Send-MailMessage 迁移到现代替代方案时最常问的问题。答案涵盖弃用时间线、迁移工作量以及 Send-MailMessage 和 Nylas CLI 之间的功能对等性。Microsoft 在 2020 年 3 月发布的 PowerShell 7.0 中正式弃用了该 cmdlet——已超过 6 年。

为什么 Send-MailMessage 被弃用?

Microsoft 在 PowerShell 7.0 中弃用了它,因为底层的 System.Net.Mail.SmtpClient 无法安全协商 TLS。Microsoft 建议使用第三方库替代。

Send-MailMessage 的最佳替代方案是什么?

Nylas CLI 用一条命令替换 Send-MailMessage。它自动处理 OAuth2、TLS 和服务商差异。脚本中没有 SMTP 凭据,没有服务商特定配置。

我需要修改 PowerShell 脚本吗?

是的,但对于支持的发送字段,迁移很简单。将每个 Send-MailMessage 调用替换为 nylas email send 并映射参数:-To 变为 --to-Subject 变为 --subject-Body 变为 --body。对于 -Attachments,发送托管文件链接或使用 Nylas API/SDK 附件路径。

Nylas CLI 支持所有 Send-MailMessage 功能吗?

它通过 --body 支持 HTML 正文、CC/BCC 和多个收件人。它还添加了 Send-MailMessage 从未有过的功能:OAuth2、邮件定时发送、打开/点击跟踪、JSON 输出和收件箱读取权限。附件发送不是当前的 CLI 标志;当需要 MIME 附件时使用托管文件链接或 Nylas API/SDK。

后续步骤

Send-MailMessage 替换为 nylas email send 后,以下指南涵盖相关的 PowerShell 邮件工作流——读取收件箱、下载附件、构建自动化报告和管理 Office 365 邮件。每个指南都包含使用本次迁移中相同 CLI 版本的已测试代码示例。