You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows PowerShell 7中Send-MailMessage命令的替代方案咨询

替代Send-MailMessage的方案(PowerShell 7环境)

在PowerShell 7中使用Send-MailMessage会触发过时警告,原因是该cmdlet无法确保SMTP连接的安全性。以下是两种可靠的替代方案:


方案一:使用Mailozaurr模块

Mailozaurr是专门为替代Send-MailMessage开发的PowerShell模块,支持现代SMTP安全协议(如STARTTLS、SSL),用法简洁且功能完善。

步骤1:安装模块

# 针对当前用户安装
Install-Module -Name Mailozaurr -Scope CurrentUser -Force
# 如需全局安装(需管理员权限)
# Install-Module -Name Mailozaurr -Scope AllUsers -Force

步骤2:发送邮件示例

Send-Email -From "sender@example.com" -To "recipient@example.com" -Cc "cc@example.com" `
  -Subject "测试邮件" -Body "<h1>HTML格式邮件内容</h1>" -BodyAsHtml `
  -SmtpServer "smtp.example.com" -Port 587 -UseSsl `
  -Attachments "C:\logs\report.log", "C:\docs\data.xlsx"

方案二:自定义.NET实现(基于提供代码优化)

直接调用.NET的System.Net.Mail类实现邮件发送,完全可控,无需依赖第三方模块,且支持-WhatIf/-Confirm等PowerShell标准参数。

中文注释版函数

function Send-Mail {
    [CmdletBinding(PositionalBinding=$false, SupportsShouldProcess=$true, ConfirmImpact='Medium')]
    param(
        [Parameter(Mandatory=$true)]
        [ValidateScript({
            # 验证SMTP服务器25端口可达性
            $连通性测试 = Test-NetConnection -ComputerName $_ -Port 25
            return $连通性测试.TcpTestSucceeded
        })]
        [string]$邮件服务器,

        [Parameter(Mandatory=$true)]
        [MailAddress]$发件人,

        [Parameter(Mandatory=$true)]
        [MailAddress[]]$收件人,

        [Parameter(Mandatory=$true)]
        [MailAddress[]]$抄送,

        [Parameter(Mandatory=$true)]
        [string]$邮件主题,

        [Parameter(Mandatory=$true)]
        [string]$邮件内容, # HTML格式内容

        [ValidateNotNullOrEmpty()]
        [string]$发件人显示名称,

        [ValidateNotNullOrEmpty()]
        [string[]]$附件 # 文件路径数组
    )

    # 创建邮件对象
    $邮件 = New-Object System.Net.Mail.MailMessage
    $邮件.IsBodyHtml = $true
    $邮件.Priority = [System.Net.Mail.MailPriority]::High

    # 设置发件人(含显示名称)
    if ($发件人显示名称) {
        $邮件.From = New-Object System.Net.Mail.MailAddress $发件人, $发件人显示名称
    } else {
        $邮件.From = $发件人
    }

    # 添加收件人、抄送
    $收件人 | ForEach-Object { $邮件.To.Add($_) }
    $抄送 | ForEach-Object { $邮件.Cc.Add($_) }

    # 添加附件
    if ($附件) {
        $附件 | ForEach-Object { $邮件.Attachments.Add($_) }
    }

    $邮件.Subject = $邮件主题
    $邮件.Body = $邮件内容

    # 创建SMTP客户端并发送邮件
    $Smtp客户端 = New-Object Net.Mail.SmtpClient($邮件服务器)
    if ($PSCmdlet.ShouldProcess(
        "发送邮件:主题「$邮件主题」,收件人:$($收件人.Address -join ','),抄送:$($抄送.Address -join ','),附件:$($邮件.Attachments.Name -join ',')",
        $收件人,
        "发送邮件"
    )) {
        $Smtp客户端.Send($邮件)
    }

    # 释放资源
    $邮件.Dispose()
    $Smtp客户端.Dispose()
}

使用示例

# 发送带附件的HTML邮件
Send-Mail -邮件服务器 "smtp.example.com" `
  -发件人 "admin@example.com" `
  -发件人显示名称 "系统管理员" `
  -收件人 "user1@example.com", "user2@example.com" `
  -抄送 "audit@example.com" `
  -邮件主题 "服务器运行报告" `
  -邮件内容 "<p>以下是今日服务器运行状况:<br><ul><li>CPU使用率:25%</li><li>内存使用率:60%</li></ul></p>" `
  -附件 "C:\reports\server_health.log" -Verbose

内容的提问来源于stack exchange,提问作者Arbelac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:12:49