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
为什么 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 | iexHomebrew、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-Clixml 将 PSCredential 序列化到 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-MailMessage | Nylas 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 版本的已测试代码示例。
- 替换 Send-MgUserMessage——从更新的 Graph PowerShell cmdlet 迁移?
- Send-MgUserMail vs Send-MailMessage——对比过时的 SMTP、Graph PowerShell 和 CLI 发送路径
- 从 PowerShell 发送邮件——高级模式、定时发送和脚本编写
- 在 PowerShell 中阅读和搜索邮件——列出未读、按发件人搜索、导出为 CSV
- 在 PowerShell 中下载邮件附件——按类型过滤、批量下载、重命名
- PowerShell 自动化邮件报告——CSV 报告、定时发送、模板
- 从 PowerShell 管理 Office 365 邮件——阅读、搜索和组织 M365 收件箱
- 完整命令参考——每个标志和子命令的文档