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
Вверх