调试PowerShell UTM9 SMTP代理日志解析脚本问题
修复后的PowerShell脚本
# 若未安装ImportExcel模块,先执行下方安装命令(需当前用户权限) # Install-Module -Name ImportExcel -Scope CurrentUser -Force # 配置路径 $logFilePath = "C:\your\path\utm9_smtp_proxy.log" $outputExcelPath = "C:\your\output\email_summary.xlsx" # 读取日志并按邮件条目分割(假设每个邮件以"F From:"作为起始标识) $fullLog = Get-Content -Path $logFilePath -Raw $emailItems = $fullLog -split '(?=F From:)' | Where-Object { $_ -match '\S' } # 初始化结果集合 $resultList = @() foreach ($item in $emailItems) { # 提取日期 $date = if ($item -match 'Date:\s*(.*?)\r?\n') { $matches[1].Trim() } else { $null } # 提取发件人 $sender = if ($item -match 'From:\s*(.*?)\r?\n') { $matches[1].Trim() } else { $null } # 提取收件人 $recipient = if ($item -match 'To:\s*(.*?)\r?\n') { $matches[1].Trim() } else { $null } # 提取主题(匹配到下一个非空格开头的行或条目结束为止) $subject = if ($item -match 'Subject:\s*(.*?)(?=\r?\n\S|$)' -simplematch) { $matches[1].Trim() } else { $null } # 组装对象加入结果集合 $resultList += [PSCustomObject]@{ 日期 = $date 发件人 = $sender 收件人 = $recipient 主题 = $subject } } # 导出标准Excel文件(避免损坏) $resultList | Export-Excel -Path $outputExcelPath -AutoSize -FreezeTopRow # 若不想用ImportExcel模块,可导出为CSV(无损坏风险,Excel可直接打开) # $resultList | Export-Csv -Path "C:\your\output\email_summary.csv" -Encoding UTF8 -NoTypeInformation
核心修复说明
1. 按邮件条目拆分日志
原脚本逐行处理导致主题字段误包含后续内容,修复时用正则(?=F From:)(正向预查)将整个日志拆分为独立的邮件条目,确保每个字段提取都在单个邮件范围内进行。
2. 精准截断主题内容
用正则Subject:\s*(.*?)(?=\r?\n\S|$)匹配主题:
.*?采用非贪婪匹配,避免过度抓取(?=\r?\n\S|$)作为终止条件,遇到换行后非空格开头的行(如Thread-Index行)或条目结束时立即停止,确保只提取主题本身。
3. 解决Excel损坏问题
原脚本大概率是直接将CSV改后缀为.xlsx导致格式错误,改用ImportExcel模块生成标准的Excel文件;若不愿安装模块,直接导出CSV格式(纯文本无损坏风险,Excel可直接识别)。
注意事项
- 确认日志中邮件的起始标识确实是
F From:,若实际格式不同,需修改分割正则中的对应内容。 - 若日志编码非默认,需在
Get-Content中添加-Encoding参数(如-Encoding UTF8)指定正确编码。
内容的提问来源于stack exchange,提问作者Markus Meyer
相关产品推荐
相关产品推荐

