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
相关产品推荐
相关产品推荐

