You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于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. 测试与部署

测试步骤:

  1. 手动创建一条今天的告警记录到AlertRecords.txt
  2. 对应创建邮件内容文件,写入测试内容
  3. 以管理员身份运行PowerShell脚本,检查控制台输出,同时查看收件邮箱是否收到邮件

部署到Windows Server 2012任务计划:

  1. 打开「任务计划程序」→ 创建基本任务
  2. 设置触发条件(比如每天凌晨1点,或者每小时执行一次)
  3. 操作选择「启动程序」,程序/脚本填powershell.exe,添加参数填:
    -ExecutionPolicy Bypass -File "D:\Alerts\Send-AlertEmails.ps1"
    
    -ExecutionPolicy Bypass是避免PowerShell的执行策略限制)
  4. 选择「不管用户是否登录都要运行」,并勾选「使用最高权限运行」
  5. 完成后测试任务,确保能正常触发脚本发送邮件

4. 注意事项

  • Windows Server 2012自带PowerShell 3.0,完全支持Send-MailMessage命令,无需额外安装
  • 告警数据文件和内容文件最好放在非系统盘,避免系统盘空间不足影响脚本运行
  • 定期清理AlertRecords.txt的历史记录,避免文件过大导致读取缓慢
  • 确保SMTP服务器允许你的发件人邮箱进行中继,或者使用邮箱服务商提供的授权码作为密码

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

火山引擎 最新活动