在Powershell中解析电子邮件正文参数

时间:2018-07-24 07:30:40

标签: regex powershell outlook

我正在创建一个脚本来解析Outlook电子邮件正文,以便可以在字符串ID: xxxxxx Date: xxxxxx Name:xxxxx之后说一个(ID号,日期,名称)。我正在四处张望,没有任何可以让我在比赛后接弦的东西。

到目前为止,我管理的是查询Outlook中特定用户发送的电子邮件。

    Add-Type -Assembly "Microsoft.Office.Interop.Outlook"
    $Outlook = New-Object -ComObject Outlook.Application
    $namespace = $Outlook.GetNameSpace("MAPI")
    $inbox =                 $namespace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderInbox)
    foreach ($items in $inbox.items){if (($items.to -like "*email*") -or ($items.cc -like "*email.add*")){$FindID = $items.body}}

现在,我在for循环中有电子邮件正文,我想知道如何解析内容?

在段落之间将是这样的文本

ID: xxxxxxxx
Name: xxxxxxxxx
Date Of Birth : xxxxxxxx

我在下面进行了一些测试,以查看是否可以将其添加到for循环中,但是看来我无法破坏这些段落。

$FindID| ForEach-Object {if (($_ -match 'ID:') -and ($_ -match ' ')){$testID = ($_ -split 'ID: ')[1]}}

我得到以下结果,而不仅仅是ID。

我执行$ testID时的采样结果

xxxxxxxx
 Name: xxxxxxxxx 
 Date Of Birth : xxxxxxxx

 Regards,
 xxxxx xxxxx
 xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

如何仅获得所需的结果?我只是在那部分挣扎。

2 个答案:

答案 0 :(得分:2)

您将需要一个具有(命名)捕获组的正则表达式来grep这些值。 See example on rexgex101.com
$item.body不是html且不是单个字符串,这可能有效:

## Q:\Test\2018\07\24\SO_51492907.ps1
Add-Type -Assembly "Microsoft.Office.Interop.Outlook"
$Outlook = New-Object -ComObject Outlook.Application
$namespace = $Outlook.GetNameSpace("MAPI")
$inbox = $namespace.GetDefaultFolder(
    [Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderInbox)
## see $RE on https://regex101.com/r/1B2rD1/1
$RE = [RegEx]'(?sm)ID:\s+(?<ID>.*?)$.*?Name:\s+(?<Name>.*?)$.*?Date Of Birth\s*:\s*(?<DOB>.*?)$.*'

$Data = ForEach ($item in $inbox.items){
    if (($item.to -like "*email*") -or 
        ($item.cc -like "*email.add*")){
        if (($item.body -match $RE )){
            [PSCustomObject]@{
                ID   = $Matches.ID
                Name = $Matches.Name
                DOB  = $Matches.DOB
            }
        }
    }
}
$Data 
$Data | Export-CSv '.\data.csv' -NoTypeInformation

使用上述匿名邮件对输出进行采样

> Q:\Test\2018\07\24\SO_51492907.ps1

ID        Name       DOB
--        ----       ---
xxxxxx... xxxxxxx... xxxxxx...

答案 1 :(得分:1)

我目前没有可用的Outlook,但我认为这可以正常工作

Add-Type -Assembly "Microsoft.Office.Interop.Outlook"
$Outlook = New-Object -ComObject Outlook.Application
$namespace = $Outlook.GetNameSpace("MAPI")
$inbox = $namespace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderInbox)
$inbox.items | Where-Object { $_.To -like "*email*" -or $_.CC -like "*email.add*"} {
    $body = $_.body
    if ($body -match '(?s)ID\s*:\s*(?<id>.+)Name\s*:\s*(?<name>.+)Date Of Birth\s*:\s*(?<dob>\w+)') {
        New-Object -TypeName PSObject -Property @{
            'Subject'        = $_.Subject
            'Date Received'  = ([datetime]$_.ReceivedTime).ToString()
            'ID'             = $matches['id']
            'Name'           = $matches['name']
            'Date of Birth'  = $matches['dob']

        }
    }
}