На днях руководитель центра обработки заявок попросила сделать выгрузку содержимого общего почтового ящика в файл, чтобы проанализировать работу (количество заявок) за полгода. То есть ей потребовался отчет в виде таблички с информацией по каждому письму (тема, дата, отправитель) в общем почтовом ящике, куда приходят все заявки от клиентов.
Итак, исходные данные:
- сервер 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 |