Поиск писем в папке Почты старше определенной даты с помощью Microsoft Graph и Powershell

 Если вы делаете какое-либо архивирование, очистку или просто ищете сообщения, которые старше определенной даты, вам нужно будет использовать фильтр на receivedDateTime.

Свойство receivedDateTime

Это свойство представляет, когда сообщение было получено выражено и сохранено в UTC времени, это означает, что при запросе его вы также должны убедиться, что ваше значение запроса находится в UTC.

Так например если бы я искал всю электронную почту в папке JunkEmail старше 30 дней я мог бы использовать ее

/v1. 0 / пользователи('gscales@datarumble.com')/MailFolders ('JunkEmail') / messages?$Top=10&$filter=receivedDateTime lt 2020-10-21T00:00:00Z

Если почтовые ящики находятся в часовом поясе отличном от UTC то сначала преобразуйте фактическую дату в локальную дату которую вы хотите включить в UTC например в Powershell что то вроде

(Get-Date).adddays (-30).Дата.ToUniversalTime ().ToString ("o")

Это означает, что если мой часовой пояс равен +11 UTC, то мое фактическое время запроса будет выглядеть следующим образом

2020-10-20T13:00:00.0000000 Z на основе фактического значения дня 2020-10-21T00:00: 00.0000000+11: 00

Точность

Последнее, что следует учитывать при receivedDateTime, - это точность, Exchange Server хранит элемент с точностью до миллисекунд в EWS вы можете настроить точность ваших запросов до миллисекунды, однако Graph API не позволяет вам этого сделать. Таким образом, если вы запрашиваете элементы на графике и используете операторы GT или LT, вы можете увидеть, что они работают больше как GE и LE из-за потери точности. Хотя это звучит как мелочь, это может быть довольно болезненно в зависимости от того, что вы пытаетесь сделать.

Ордерби

По умолчанию при использовании фильтра вы получите результаты обратно в порядке возрастания поэтому если вы хотите сначала увидеть последние сообщения убедитесь что вы используете их

OrderBy=receivedDateTime desc

если вы добавите больше полей в предложение Filter они также должны быть добавлены в OrderBy

Я создал сценарий Powershell, чтобы идти вместе с док-вызовом ItemAgeModule. ps1, доступным из https://github.com/gscales/Powershell-Scripts/blob/master/Graph101/ItemAgeModule.ps1

Некоторые примеры таковы получить последние 10 писем в почтовом ящике старше 30 дней будет выглядеть так

Get-EmailOlderThan-имя почтового ящика gscales@domain.com -FolderName Inbox -OlderThanDays 30 -MessageCount 10

Чтобы получить всю электронную почту в папке нежелательной почты старше 30 дней, используйте следующее, И он будет перелистывать их обратно по 100 элементов за раз

Get-EmailOlderThan-имя почтового ящика gscales@domain.com -FolderName Inbox-OlderThanDays 30

Чтобы получить всю электронную почту старше 30 дней с определенной темой, вы можете использовать (обратите внимание, что требуется OrderByExtraFields, который должен иметь разделенный запятыми список дополнительных полей, используемых в фильтре)

Get-EmailOlderThan-имя почтового ящика gscales@domain.com -FolderName Inbox-OlderThanDays 30-фильтр "Subject eq 'test' " - OrderByExtraFields subject

Перемещение найденных электронных писем

Как уже упоминалось, одна из основных причин, по которой вы можете найти сообщения определенного возраста, - это архивирование, перемещение или удаление их. Для этого вам нужно использовать операцию перемещения на конечной точке элемента например в графике это в основном сообщение типа

https://graph.microsoft.com/v1.0/me/messages/AAK.....=/move

с целевой папкой в теле сообщения (либо folderId, либо WellknownFolderName), например

{"destinationId": "архив" }

Перемещал бы сообщения в архивную папку почтового ящика (а не в мой собственный архив)

Так что если бы я хотел архивировать все сообщения в моем почтовом ящике от конкретного отправителя, который был старше 2 лет, я мог бы использовать

Move-EmailOlderThan-MailboxName gscales@domain.com -FolderName Inbox-OlderThanDays 30-фильтр " from/emailAddress/address eq 'user@domain.com' "- OrderByExtraFields "from/emailAddress / address" - архив назначения

Этот код использует пакетирование и перемещает элементы в количестве 4 штук, чтобы не превысить квоту одновременного пользователя

Или если бы я хотел мягко удалить элементы я мог бы переместить их в папку RecoverableItemsDeletions

напр.

Move-EmailOlderThan-MailboxName gscales@domain.com -FolderName Inbox-OlderThanDays 30-фильтр " from/emailAddress/address eq 'info@twitter.com' "- OrderByExtraFields "from/emailAddress / address" - Destination RecoverableItemsDeletions-verbose

сценарий для этого поста можно найти здесь https://github.com/gscales/Powershell-Scripts/blob/master/Graph101/ItemAgeModule.ps1