У нас есть почтовый ящик, который получает электронные письма о статусе, которые нам необходимо сохранить навсегда, и они содержат потенциально большие вложения. Мне нужно иметь возможность регулярно (ежедневно или еженедельно) перемещать эти сообщения в PST, поэтому хочу автоматизировать это.
На данный момент я использую MailboxExportRequest
чтобы поместить их в PST:
New-MailboxExportRequest -ContentFilter {(Received -ge '01/01/2013') -and (Received -lt '01/02/2013')} -Mailbox "MonitorMailbox" -FilePath "\\Server\backup\EmailLog\MonitorMailbox 2013-01.pst"
И я следую за этим SearchMailbox -DeleteContent
:
Get-Mailbox -Identity "MonitorMailbox" | Search-Mailbox -SearchQuery "Received:01/01/2013..01/02/2013" -DeleteContent
Проблема в том, что мне приходится вручную обновлять параметры даты каждый раз в четырех местах, и меня беспокоит, что это не очень транзакционный (если это вообще имеет смысл в данном контексте).
Я пытаюсь создать небольшой скрипт PS для перебора дат по месяцам и создания набора команд для просмотра и экспорта этой информации, но мне было интересно, есть ли более простой способ «перейти на PST», или мне нужно попробуйте построить приведенные выше утверждения динамически.
Вот более полный сценарий, который у меня есть, который должен экспортировать все элементы за 10 дней, предшествующих началу этого месяца (для ускорения тестирования):
$mailbox = "Cylindric"
$endDate = Get-Date -Day 1 "00:00:00"
$startDate = $endDate.AddDays(-10)
$month = "{0:D2}" -f [int]$startDate.Month
$year = "{0:D4}" -f [int]$startDate.Year
Write-Host -NoNewline "Exporting items between $startDate and $endDate..."
New-MailboxExportRequest -Name "EmailLog$year$month" -ContentFilter {(Received -ge $startDate) -and (Received -lt $endDate)} -Mailbox $mailbox -FilePath "\\ReadyNAS\backup\Mailboxes\EmailLog\EmailLog${year}-${month}.pst"
Write-Host "Done."
Write-Host -NoNewline "Waiting for export to complete..."
While(!(Get-MailboxExportRequest -Mailbox $mailbox -Name "EmailLog$year$month" -Status Completed))
{
#Sleep for a few minutes
Write-Host -NoNewline "."
Start-Sleep -s 60
}
Write-Host "Done."
Write-Host -NoNewline "Removing Export Request..."
Get-MailboxExportRequest -Mailbox $mailbox -Status Completed -Name "EmailLog$year$month" | Remove-MailboxExportRequest
Write-Host "Done."
И вывод:
Exporting items between 05/22/2013 00:00:00 and 06/01/2013 00:00:00...
Name Mailbox Status
---- ------- ------
EmailLog201305 Cylindric Queued
Done.
Waiting for export to complete..........Done.
Похоже, что это намного больше, чем эти 10 дней. Кажется, что PST содержит ВСЕ электронные письма!
Использовать Get-Date
командлет!
Приведенный ниже фрагмент проверит, какой сейчас месяц, вычтет 1 и экспортирует все сообщения в ваш файл .pst.
$endDate = Get-Date -Day 1 "00:00:00"
$startDate = $endDate.AddMonths(-1)
$month = "{0:D2}" -f [int]$startDate.Month
# Convert dates to short date strings
$endDate = $endDate.ToShortDateString()
$startDate = $startDate.ToShortDateString()
New-MailboxExportRequest -ContentFilter {(Received -ge $startDate) -and (Received -lt $endDate)} -Mailbox "MonitorMailbox" -FilePath "\\Server\backup\EmailLog\MonitorMailbox 2013-${month}.pst"
while(!(Get-MailboxExportRequest -Mailbox "MonitorMailbox" -Status Completed))
{
#Sleep for a few minutes
Start-Sleep -s 300
}
Get-MailboxExportRequest -Mailbox "MonitorMailbox" -Status Completed | Remove-MailboxExportRequest
Get-Mailbox -Identity "MonitorMailbox" | Search-Mailbox -SearchQuery "Received:'${startDate}'..'${endDate}'" -DeleteContent
Просто запускайте это один раз в месяц, чтобы архивировать электронные письма за последние месяцы.
Если вы хотите поместить это в запланированную задачу, это должно получить то, что вы ищете:
$now=get-datetime
$fromtime=$now.addHours(-$now.hour).addMinutes(-$now.minute).addSeconds(-$now.second).addDay(-2)
$totime=$now.addHours(-$now.hour).addMinutes(-$now.minute).addSeconds(-$now.second).addDay(-1)
New-MailboxExportRequest -ContentFilter {(Received -ge $fromtime) -and (Received -lt $totime)} -Mailbox "MonitorMailbox" -FilePath "\\Server\backup\EmailLog\MonitorMailbox "+$totime.year+"-"+$totime.month+"-"+$totime.day"+".pst"
$mailQuery="Received:"+fromtime.toString("d")+".."+$totime.toString("d")
Get-Mailbox -Identity "MonitorMailbox" | Search-Mailbox -SearchQuery $mailQuery -DeleteContent
Что он делает, так это использует функции обработки даты Powershell. В $fromtime
и $totime
переменные сначала обнуляются до полуночи, затем устанавливаются на расстояние в один день. Затем мы используем эти переменные при построении запросов, необходимых для командлетов Exchange.