Powershell中的Outlook电子邮件ReceivedTime混乱

时间:2019-07-03 13:58:58

标签: powershell outlook

长期潜伏者和初次发布者,所以我会在这里尽量具体点!

我正在编写的脚本的目标是从Excel文件中获取开始和结束日期,并使用该范围从该范围中提取来自Outlook的最新电子邮件。这些电子邮件中的信息然后用于在电子表格中进行报告。

该脚本按预期的方式工作,原因是某些日期的ReceivedTime属性不正确,并且它会抢先获取最早的条目,而不是最新的条目。

如果我在控制台中输入$Emails.ReceivedTime,它将显示乱序,从而导致问题。如果输入$Emails.ReceivedTime | sort,问题就消失了。我的问题是,无论我在哪里尝试将其插入脚本,它都将挂起并且永远不会完成执行。

Function GetEmails ()
{
    Add-Type -Assembly "Microsoft.Office.Interop.Outlook"
    $Outlook = New-Object -ComObject Outlook.Application
    $Namespace = $Outlook.GetNameSpace("MAPI")
    $Inbox = $Namespace.Folders.Item('UsernameHere').Folders.Item('Inbox').Items
    return $Inbox
}

Function GetXYZ($Emails) {

    $XYZ = $null
    foreach($Email in $Emails) {   
        if ($Email.SenderEmailAddress -ne $null -and $Email.SenderEmailAddress.Contains('xyz@123.com')) {  
            if (($Email.ReceivedTime -le $end_date) -and ($Email.ReceivedTime -ge $start_date)) {  

                $XYZ = New-Object psobject -Property @{'Sender' = $Email.SenderEmailAddress; 'Time' = $Email.ReceivedTime; 'Body' = $Email.Body}                  
            }

        }
    }

    #Split the body of the email into an array and remove whitespace from the array.
    $Array = $XYZ.Body.Split("`r`n",[System.StringSplitOptions]::RemoveEmptyEntries)

    #Create an array of numeric values only
    $numArray = @()
    $numArray += $Array -replace '[^.0-9]'

    $junk1, [int]$Item1, [int]Item2, [int]$Item3, $junk2 = $numArray

    return New-Object psobject -Property @{'Name' = 'XYZ'; 'Time' = $XYZ.Time; 'Item1' = $Item1.toString("N0"); 'Item2' = $Item2.toString("N0"); 'Item3' = $Item3.toString("N0")}
}


$Emails = GetEmails

GetXYZ($Emails)

#Rest of the code runs here to do things unrelated to my problem...

这是当前前10条电子邮件的接收时间:

2019年5月23日星期四上午7:22:19

2019年5月23日,星期四6:55:07 AM

2019年5月23日,星期四6:22:18 AM

2019年5月23日,星期四6:03:07 AM

2019年5月23日星期四6:02:21 AM

2019年5月23日星期四5:22:17 AM

2019年5月23日,星期四,上午4:22:03

2019年5月23日,星期四3:55:07 AM

2019年5月23日,星期四3:22:18 AM

2019年5月23日,星期四3:01:33 AM

这应该是前10行:

2019年4月3日,星期三,上​​午9:00:07

2019年4月4日,星期四9:00:04

2019年4月5日,星期五,9:00:08

2019年4月6日星期六5:03:22 AM

2019年4月6日星期六5:11:22 AM

2019年4月6日星期六5:22:29 AM

2019年4月6日星期六上午7:08:59

2019年4月6日星期六上午8:11:08

2019年4月6日星期六上午8:55:45

2019年4月6日星期六9:00:02 AM

如果我在这里遗漏了任何重要内容,请随时让我知道,并提前致谢!

2 个答案:

答案 0 :(得分:0)

遍历文件夹中的所有项目并不是一个好主意:

 foreach($Email in $Emails) 

相反,我建议获取一小部分项目进行处理(一堆)。例如,您可以提取每周或每月等的项目。如果集合中的Outlook项目数量很少,我建议使用FindFindNext方法(请参阅Items.Count)属性)。另一方面,如果集合中有大量项目,并且预计只会发现少量项目,则Restrict方法的运行速度比Find / FindNext方法要快。 / p>

在以下文章中了解有关这些方法的更多信息:

答案 1 :(得分:0)

如果您从不致电Items.Sort,则不要期望任何特定的顺序。在您的特定情况下,如果希望对ReceivedTime属性的Items集合进行排序,则应调用Items.Sort("[ReceivedTime]", true)

此外,正如Eugene所述,如果您仅处理项目的子集,则必须在服务器端进行过滤-使用Items.RestrictItems.Find/FindNext。在您的情况下,Items.Restrict可能更合适。