基于PowerShell实现文本文件内容发件及日期匹配告警邮件需求
实现基于文本文件的Windows Server 2012告警邮件发送方案
没问题,我帮你梳理出一套完整的实现方案,完全符合你在Windows Server 2012上用PowerShell基于文本文件发告警邮件的需求,不用依赖任何数据库——下面一步步来,从自定义文本结构到脚本编写、测试部署都给你安排明白:
1. 定义自定义文本文件结构
首先得把告警数据用清晰的格式存在文本文件里,我推荐用**竖线|**作为字段分隔符(避免和内容里的逗号冲突),每行一条告警记录,字段顺序固定为:日期|告警收件邮箱|事件描述|邮件内容文件路径
举个实际的例子(文件命名比如AlertRecords.txt):
2024-05-20|admin@example.com|服务器C盘空间不足10%|D:\AlertContents\DiskLow_Warning.txt 2024-05-20|ops-team@example.com|IIS服务意外停止|D:\AlertContents\ServiceDown_Alert.txt 2024-05-21|dev@example.com|数据库备份失败|D:\AlertContents\BackupFail_Message.txt
字段说明:
- 日期:统一用
yyyy-MM-dd格式,方便PowerShell精准匹配 - 告警收件邮箱:可以填多个邮箱,用逗号分隔(比如
admin@example.com,tech@example.com) - 事件描述:简短的告警标题,会作为邮件主题的一部分
- 邮件内容文件路径:指向存储具体告警内容的文本文件(比如故障详情、排查步骤等)
2. 编写PowerShell核心脚本
下面是针对Windows Server 2012环境优化的脚本,注释很详细,你可以直接修改配置参数使用:
# -------------------------- 基础配置区 -------------------------- # SMTP服务器信息(根据你的邮件服务商调整) $smtpServer = "smtp.example.com" $smtpPort = 587 $smtpFrom = "server-alerts@example.com" # 读取预存的SMTP凭证(后续部署时用,避免手动输入密码) $smtpCredential = Import-Clixml -Path "D:\Alerts\SmtpCredential.xml" # 告警数据文件路径 $alertDataFile = "D:\Alerts\AlertRecords.txt" # 目标检索日期(这里默认是今天,可改为指定日期比如"2024-05-20") $targetDate = Get-Date -Format "yyyy-MM-dd" # -------------------------- 配置结束 -------------------------- # 读取并筛选目标日期的告警记录 $alertRecords = Get-Content $alertDataFile | Where-Object { $_ -match "^$targetDate\|" } if ($alertRecords.Count -eq 0) { Write-Host "[$(Get-Date)] 目标日期 $targetDate 没有需要发送的告警邮件" exit } # 遍历每条记录发送邮件 foreach ($record in $alertRecords) { # 拆分记录字段(处理可能的多邮箱情况) $fields = $record -split "\|" $recipientList = $fields[1] -split "," | ForEach-Object { $_.Trim() } $eventDesc = $fields[2] $contentFilePath = $fields[3] # 读取邮件内容文件 if (Test-Path $contentFilePath) { $mailBody = Get-Content $contentFilePath -Raw # -Raw保留文本格式 } else { $mailBody = "⚠️ 告警内容文件不存在:$contentFilePath`n`n事件描述:$eventDesc" Write-Warning "[$(Get-Date)] 无法找到邮件内容文件:$contentFilePath" } # 发送邮件 try { Send-MailMessage -From $smtpFrom ` -To $recipientList ` -Subject "【服务器告警】$eventDesc" ` -Body $mailBody ` -SmtpServer $smtpServer ` -Port $smtpPort ` -Credential $smtpCredential ` -UseSsl Write-Host "[$(Get-Date)] 成功向 $($recipientList -join ', ') 发送告警邮件:$eventDesc" } catch { Write-Error "[$(Get-Date)] 发送邮件失败(收件人:$($recipientList -join ', ')):$_" } }
关键细节说明:
- SMTP凭证预存:第一次运行时,先执行下面的命令把SMTP账户密码加密存储(只有当前服务器的当前用户能读取):
Get-Credential -Message "输入SMTP发件人账户(格式:邮箱@域名)和密码" | Export-Clixml -Path "D:\Alerts\SmtpCredential.xml" - 日期检索灵活调整:如果需要检索指定日期,把
$targetDate改成固定字符串比如"2024-05-20"即可 - 多邮箱支持:收件邮箱字段可以用逗号分隔多个地址,脚本会自动拆分处理
- 格式保留:用
Get-Content -Raw读取邮件内容,能保留文本里的换行、空格格式
3. 测试与部署
测试步骤:
- 手动创建一条今天的告警记录到
AlertRecords.txt - 对应创建邮件内容文件,写入测试内容
- 以管理员身份运行PowerShell脚本,检查控制台输出,同时查看收件邮箱是否收到邮件
部署到Windows Server 2012任务计划:
- 打开「任务计划程序」→ 创建基本任务
- 设置触发条件(比如每天凌晨1点,或者每小时执行一次)
- 操作选择「启动程序」,程序/脚本填
powershell.exe,添加参数填:
(-ExecutionPolicy Bypass -File "D:\Alerts\Send-AlertEmails.ps1"-ExecutionPolicy Bypass是避免PowerShell的执行策略限制) - 选择「不管用户是否登录都要运行」,并勾选「使用最高权限运行」
- 完成后测试任务,确保能正常触发脚本发送邮件
4. 注意事项
- Windows Server 2012自带PowerShell 3.0,完全支持
Send-MailMessage命令,无需额外安装 - 告警数据文件和内容文件最好放在非系统盘,避免系统盘空间不足影响脚本运行
- 定期清理
AlertRecords.txt的历史记录,避免文件过大导致读取缓慢 - 确保SMTP服务器允许你的发件人邮箱进行中继,或者使用邮箱服务商提供的授权码作为密码
内容的提问来源于stack exchange,提问作者axemanit




