Отчет о содержимом почтового ящика Exchange

15.01.2013

На днях руководитель центра обработки заявок попросила сделать выгрузку содержимого общего почтового ящика в файл, чтобы проанализировать работу (количество заявок) за полгода. То есть ей потребовался отчет в виде таблички с информацией по каждому письму (тема, дата, отправитель) в общем почтовом ящике, куда приходят все заявки от клиентов.

Итак, исходные данные:
- сервер Microsoft Exchange Server 2010;
- клиент Microsoft Windows 7 Proffesional 64bit;
- общик почтовый ящик размером 10 ГБ, который подключен всем сотрудникам колл-центра;
- административные права к домену и почтовой системе (Domain Admin, Domain Exchange Admin).

Задача:
- выгрузить информацию о содержимом почтового ящика в CSV файл.

Решение:
- установить на клиент, с которого выполняется выгрузка, пакет Microsoft Exchange Web Services Managed API 2.0;
- назначить своей учетной записи права Full access на требуемый почтовый ящик (подсказка здесь);
- использовать нижеприведенный скрипт для обработки почтового ящика (в тексте скрипта исправить e-mail выгружаемого ящика);
- CSV файл с результатом, появившийся на рабочем столе, обработать в Excel, указав в качестве разделителей знаки табуляции;
- убрать права Full access с обрабатываемого почтового ящика для своей учетной записи.

Скрипт обработки почтового ящика

# Этот скрипт использует Microsoft Exchange Web Services Managed API 2.0
# http://www.microsoft.com/en-us/download/details.aspx?id=35371

# Удаление переменной ScriptResult, если она использовалась, и создание пустого массива.
Remove-Variable ScriptResult -ErrorAction SilentlyContinue
$ScriptResult = @()

# Загрузка библиотеки Microsoft Exchange Web Services DLL в память
$DllPath = "C:\Program Files\Microsoft\Exchange\Web Services\2.0\Microsoft.Exchange.WebServices.dll"
[void][Reflection.Assembly]::LoadFile($DllPath)

# Подключение к серверу Exchange с текущей учетной записью
$Service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010)
$WindowsIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$SidBind = "LDAP://<SID=" + $WindowsIdentity.user.Value.ToString() + ">"
$AceUser = [ADSI]$SidBind
$Service.AutodiscoverUrl($AceUser.mail.ToString())

# Открытие почтового ящика
$MailboxName = "mailbox@domain.com"
$FolderId = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox,$MailboxName)
$InboxFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($Service,$FolderId)

# Настройка фильтра поиска
$Sfir = new-object Microsoft.Exchange.WebServices.Data.SearchFilter _
 + IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::IsRead, $True)
$Sflt = new-object Microsoft.Exchange.WebServices.Data.SearchFilter _
 + IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::IsRead, $False)
$sfCollection = new-object Microsoft.Exchange.WebServices.Data.SearchFilter _
 + SearchFilterCollection([Microsoft.Exchange.WebServices.Data.LogicalOperator]::Or);
$sfCollection.add($Sfir)
$sfCollection.add($Sflt)

# Получение всех писем из папки Входящие
$offset = 0;
$view = new-object Microsoft.Exchange.WebServices.Data.ItemView(100, $offset)
While (($results = $InboxFolder.FindItems($sfCollection, $view)).Items.Count -gt 0)
{
   ForEach ($item in $results)
   {
       # Write Information regarding every e-mail in the folder
       $MailboxContent = New-Object System.Object
       $MailboxContent | Add-Member -MemberType NoteProperty -Name Folder -Value $InboxFolder.Displayname
       $MailboxContent | Add-Member -MemberType NoteProperty -Name Sender -Value $item.From.Name
       $MailboxContent | Add-Member -MemberType NoteProperty -Name Subject -Value $item.Subject
       $MailboxContent | Add-Member -MemberType NoteProperty -Name Received -Value $item.DateTimeReceived
       $MailboxContent | Add-Member -MemberType NoteProperty -Name Size -Value $item.Size
       $ScriptResult += $MailboxContent
   }
   $offset += $results.Items.Count
   $view = new-object Microsoft.Exchange.WebServices.Data.ItemView(100, $offset)
}

# Получение всех писем из всех подпапок папки Входящие
$fvFolderView = New-Object Microsoft.Exchange.WebServices.Data.FolderView(1000);
$fvFolderView.Traversal = [Microsoft.Exchange.WebServices.Data.FolderTraversal]::Deep
$ffResponse= $InboxFolder.FindFolders($fvFolderView);
ForEach ($folder in $ffResponse.Folders)
{
   $offset = 0;
   $view = new-object Microsoft.Exchange.WebServices.Data.ItemView(100, $offset)
   While (($results = $folder.FindItems($sfCollection, $view)).Items.Count -gt 0)
   {
       ForEach ($item in $results)
       {
           # Write Information regarding every e-mail in the folder
           $MailboxContent = New-Object System.Object
           $MailboxContent | Add-Member -MemberType NoteProperty -Name Folder -Value $folder.Displayname
           $MailboxContent | Add-Member -MemberType NoteProperty -Name Sender -Value $item.From.Name
           $MailboxContent | Add-Member -MemberType NoteProperty -Name Subject -Value $item.Subject
           $MailboxContent | Add-Member -MemberType NoteProperty -Name Received _
             -Value $item.DateTimeReceived
           $MailboxContent | Add-Member -MemberType NoteProperty -Name Size -Value $item.Size
           $ScriptResult += $MailboxContent
       }
       $offset += $results.Items.Count
       $view = new-object Microsoft.Exchange.WebServices.Data.ItemView(100, $offset)
   }
}

# Выгрузка результата в файл
$ScriptResult | Export-Csv ((Get-Childitem env:USERPROFILE).Value + "\Desktop\PSOutput.csv") _
 -Delimiter "`t" -Encoding UTF8

Результат работы скрипта

Folder Sender Subject Received Size
Managers manager@domain.com Отправка 1460293 01.08.2012 8:45 37478
Managers manager@domain.com Отправка 1460295 01.08.2012 9:40 1101209
Customers customer@domain.com Заявка 1254556 01.08.2012 10:06 439047
Managers manager@domain.com Отправка 1460296 01.08.2012 10:33 37460
Claims claims@domain.com Жалоба 122355 01.08.2012 10:38 839714
Managers manager@domain.com Отправка 1460297 01.08.2012 10:46 37496
Inbox unknown@domain.com Вопрос по ремонту 01.08.2012 11:29 702757