Письма Outlook, полученные в нерабочее время в Powershell - PullRequest
0 голосов
/ 03 июля 2019

Давний скрытник и первый постер, поэтому я постараюсь быть здесь настолько конкретным, насколько это возможно!

Цель сценария, который я пишу, - получить дату начала и окончания из файла 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 полученных писем в настоящее время по электронной почте:

Четверг, 23 мая 2019 г. 7:22:19

Четверг, 23 мая 2019 г. 6:55:07

Четверг, 23 мая 2019 г. 6:22:18

Четверг, 23 мая 2019 г. 6:03:07 AM

Четверг, 23 мая 2019 г. 6:02:21

Четверг, 23 мая 2019 г. 5:22:17

Четверг, 23 мая 2019 г. 4:22:03

Четверг, 23 мая 2019 г. 3:55:07

Четверг, 23 мая 2019 г. 3:22:18

Четверг, 23 мая 2019 г. 3:01:33

Thisэто то, что должны быть первые 10 строк:

Среда, 3 апреля 2019 г. 9:00:07

Четверг, 4 апреля,2019 9:00:04 AM

Пятница, апрельil 5, 2019 9:00:08

суббота, 6 апреля 2019 г. 5:03:22

суббота, 6 апреля, 2019 5:11:22

Суббота, 6 апреля 2019 г. 5:22:29 AM

Суббота, 6 апреля 2019 г.7:08:59

Суббота, 6 апреля 2019 г. 8:11:08 AM

Суббота, 6 апреля 2019 г. 8:55:45

Суббота, 6 апреля 2019 г. 9:00:02

Если я пропустил что-то важное, пожалуйста, дайте мнезнать и заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Если вы никогда не позвоните Items.Sort, вам не следует ожидать какого-либо конкретного заказа.В вашем конкретном случае, если вы хотите, чтобы коллекция Предметов была отсортирована по свойству ReceivedTime, вам следует вызвать Items.Sort("[ReceivedTime]", true).

Также, как упомянул Евгений, если вы обрабатываете только подмножество предметов,фильтрация должна выполняться на стороне сервера - используйте Items.Restrict или Items.Find/FindNext.В вашем конкретном случае Items.Restrict, вероятно, будет более уместным.

0 голосов
/ 03 июля 2019

Перебор всех элементов в папке не очень хорошая идея:

 foreach($Email in $Emails) 

Вместо этого я бы предложил получить небольшое подмножество предметов для обработки (куча). Например, вы можете извлекать элементы для каждой недели или месяца и т. Д. Я бы рекомендовал использовать методы Find и FindNext, если в коллекции небольшое количество элементов Outlook (см. Свойство Items.Count). С другой стороны, метод Restrict работает быстрее, чем методы Find / FindNext, если в коллекции большое количество элементов и ожидается, что будет найдено только несколько элементов.

Подробнее об этих методах читайте в следующих статьях:

...