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