如何用PowerShell仅在启动IIS应用程序池时发送邮件?
解决IIS应用池自动重启后按需发送邮件的方案
核心思路
先筛选出所有处于停止状态的应用池并保存到变量,通过判断变量是否为空来决定是否执行重启和发送邮件,同时从变量中提取应用池名称用于邮件内容。
修改后的完整脚本
# 显式导入IIS管理模块(任务计划环境中可能需要) Import-Module WebAdministration # 获取所有处于停止状态的应用池 $stoppedAppPools = Get-ChildItem IIS:\AppPools | Where-Object {$_.State -eq "Stopped"} # 判断是否有需要启动的应用池 if ($stoppedAppPools.Count -gt 0) { # 重启筛选出的应用池 $stoppedAppPools | Restart-WebAppPool # 整理应用池名称列表,用换行分隔 $appPoolList = $stoppedAppPools.Name -join "`n" # 配置邮件参数(根据你的实际环境修改) $mailSettings = @{ From = "monitor@yourdomain.com" To = "admin@yourdomain.com" Subject = "【自动通知】已启动停止的IIS应用池" Body = "检测到以下IIS应用池处于停止状态,已自动启动:`n`n$appPoolList" SmtpServer = "smtp.yourdomain.com" # 如需SSL认证或指定端口,添加以下参数 # Port = 587 # UseSsl = $true # Credential = Get-Credential # 或预先配置的凭据对象 } # 发送邮件 Send-MailMessage @mailSettings }
关键说明
- 筛选逻辑优化:将原脚本的
$_.State -ne "Started"改为$_.State -eq "Stopped",避免误处理正在启动/停止中的应用池,更精准。 - 条件触发邮件:通过
$stoppedAppPools.Count -gt 0判断是否有需要处理的应用池,只有在实际启动了应用池时才发送邮件。 - 邮件内容整理:用
-join "n"`将应用池名称拼接为换行分隔的列表,让邮件内容更易读。 - 任务计划注意事项:确保执行脚本的账户拥有IIS应用池管理权限,且能访问指定的SMTP服务器;若任务计划中模块加载失败,务必保留
Import-Module WebAdministration语句。
内容的提问来源于stack exchange,提问作者Cinderus
相关产品推荐
相关产品推荐

