среда, 12 октября 2011 г.

Парсер attachments в outlook на powershell

В свете моей текущей  должности мне приходит много писем с резюме. Причем письма приходят в таком формате: Письмо, в него вложено ~ 10 других писем (с одинаковой темой) и уже в этих письмах лежат по нескольку резюме. Руками все это разбирать слишком долго и скучно, поэтому я разработал скрипт для автоматизации процесса.

Идея скрипта проста -

С помощью COM обращаемся к outlook.

Задаем нужную папку - Inbox идет под номером 6.

Среди писем в папке Inbox ищем нужное письмо.

Берем вложения этого письма и сохраняем их на диск (вложения сохраняются в формате outlook template).

Берём каждое сохраненное письмо и вытаскиваем из него вложения.

Сохраняем вложения в определенную папку.

Если письмо не содержит вложений, то по опыту резюме лежит в теле письма, и в этом случае мы текст письма сохраняем в файл.

В конце удаляем все временные папки.

Ниже листинг скрипта на PowerShell:

   1:  $ol = new-object -comobject "Outlook.Application" 
   2:  $mapi = $ol.getnamespace("mapi") 
   3:  $items = $Mapi.GetDefaultFolder(6).Items 
   4:   
   5:  foreach($item in $items) 
   6:  {
   7:      if(($item.Subject -like "subject") -and ($item.SenderEmailAddress -like "*e-mail*") ) 
   8:      { 
   9:          $itemCV = $item 
  10:          Continue 
  11:       } 
  12:  } 
  13:   
  14:  $itemAttachments = $itemCV.Attachments 
  15:  $directoryAttachments = "msg" 
  16:  $pathAttachments = "D:\" + $directoryAttachments 
  17:   
  18:  if (!(Test-Path -Path $pathAttachments))    
  19:  { 
  20:       New-Item -Path $pathAttachments -ItemType Directory 
  21:  } 
  22:   
  23:  $itemAttachments | %{
  24:          $_.SaveAsFile("$pathAttachments\$count" + ".msg") 
  25:  } 
  26:   
  27:  $pathCV = "d:\Documents\Собеседования\Резюме\" 
  28:  $nameDirectory = Get-Date -Format dd.MM 
  29:   
  30:  if (!(Test-Path -Path "$pathCV\$nameDirectory")) 
  31:  { 
  32:       New-Item -Path $pathCV -Name $nameDirectory -ItemType Directory 
  33:  } 
  34:   
  35:  $files = Get-Item -Path $pathAttachments + "\*" 
  36:   
  37:  $files | %{ 
  38:              $msg = $ol.CreateItemFromTemplate($_.FullName) 
  39:              $msgAttachments = $msg.Attachments 
  40:              if ($msgAttachments.Count -eq 0) 
  41:             { 
  42:                  $fileName = $msg.SenderName + ".txt" 
  43:                  $msg.Body > "$pathCV\$nameDirectory\$fileName" 
  44:              } 
  45:              else
  46:              { 
  47:                   $msgAttachments | %{ 
  48:                   $_.SaveAsFile("$pathCV\$nameDirectory" + "\" + $_.FileName) 
  49:                   } 
  50:              } 
  51:             } 
  52:   
  53:  Remove-Item $pathAttachments -Recurse



Как обычно, powershell своим могуществом пришел ко мне на помощь. Кстати, очень скоро Игорь Любин расскажет чем еще powershell может помочь тестировщику на супер конференции ConfeT&QA.

1 комментарий:

  1. есть аутлук.
    "почтовый ящик 1@www.ru"
    и подключин еще один "почтовый ящик 2@www.ru"
    обратиться к первому можно так :
    $outlook = New-Object -com outlook.application
    $ns = $Outlook.GetNamespace("MAPI")
    и тд
    Вопрос как обратиться ко второму?

    ОтветитьУдалить