работа с API yandex mail в powershell — часть 2

Пример скрипта, который из папки «c:\tmp\csv\» перебирает все csv-файлы (фильтр отсутствует, поэтому в папке должны быть только csv-файлы «правильного» шаблона, имя каждого csv должно соответствовать имени почтового домена) и блокирует/удаляет почтовые ящики согласно отметкам в csv-файлах в графе comment: block или delete. Скрипт ведет 2 лога:  block_log.txt и delete_log.txt. Собственно сам скрипт с комментариями:

cls

function BlockMailbox ($PddToken, $domain, $Mailbox) {
  # Формируем запрос API - см. документацию по API
  $pddimpUrl = 'https://pddimp.yandex.ru'
  $api = '/api2/admin/email/edit'
  $URL = "$pddimpUrl"+"$api"
  $Headers = @{}
  $Headers.PddToken = $PddToken
  $Body = @{}
  $Body.domain = $domain
  $Body.login = $Mailbox
  # Задаем параметр блокировки ящика
  $Body.enabled = "no"
  # Отправляем запрос API
  $InvokeWebRequest = Invoke-WebRequest -URI $URL -Method Post -Headers $Headers -Body $Body
  # Перевариваем ответ в родной формат powershell
  $a = $InvokeWebRequest.Content | ConvertFrom-Json
  # Пишем результат в лог блокировки почтовых ящиков
  $a >> c:\tmp\block_log.txt
  }

# Функция, аналогичная предыдущей. Отличия: метод API, нет параметра блокировки в API запросе и запись результатов в отдельный лог
function DeleteMailbox ($PddToken, $domain, $Mailbox) {
  $pddimpUrl = 'https://pddimp.yandex.ru'
  $api = '/api2/admin/email/del'
  $URL = "$pddimpUrl"+"$api"
  $Headers = @{}
  $Headers.PddToken = $PddToken
  $Body = @{}
  $Body.domain = $domain
  $Body.login = $Mailbox
  $InvokeWebRequest = Invoke-WebRequest -URI $URL -Method Post -Headers $Headers -Body $Body
  $a = $InvokeWebRequest.Content | ConvertFrom-Json
  $a >> c:\tmp\delete_log.txt
  }

# Задаем полный путь папки с csv-файлами. Имена файла - наименование почтовых доменов.
$Path = "C:\tmp\csv\"
# Получаем список файлов в папке
$all_csv = Get-ChildItem -Path $Path
# Перебираем каждый из csv-файлов
foreach ($csv in $all_csv) {
  # Из имени csv-файла получаем имя домена
  $domain = $csv.BaseName
  # Определяем по имени домена его токен
  switch ($domain) {
    "domain1.com" {$PddToken = "2DZLMPQ3ZHI7CZZ6P3NPTI9TOF2FKNIHCW8CKIHM0BCAAPZMWGXA"; break}
    "domain1.ru" {$PddToken = "GDZKOYYCE7MC1QJUNK06VNX9MD1RWJWFGQB1OCNQ8KF0PY6USVBK"; break}
    "domain2.com" {$PddToken = "BNXXH4O5N7UDEHLBR0OGRYOMKN7W97I6YNKCWKELXHC0EQ9JFD5P"; break}
    "domain2.ru" {$PddToken = "4H9YDA7ITRCIRJNJPIU0EKXILYELYODDEDWEFRLSFYLEQY7ICHBC"; break}
  }
  # Выдергиваем все строки значений из csv-файла
  $Mailboxes = Import-Csv -Delimiter ";" -Path $csv.FullName
  # Перебираем каждую строку значений
  foreach ($MailBox in $MailBoxes) {
    # Если есть пометка block, скармливаем этот ящик функции блокировки
    if ($Mailbox.Comment -eq "block") {
      BlockMailbox $PddToken $domain $Mailbox.login
    }
    # Если есть пометка delete, скармливаем этот ящик функции удаления
    if ($Mailbox.Comment -eq "delete") {
      DeleteMailBox $PddToken $domain $Mailbox.login
    }
  }
}

На что следует обратить внимание:

  1. В предыдущей статье использовался запрос типа Get, в этом скрипте запрос типа Post — см. описание API yandex mail.
  2. Передаваемые в запросе API параметры чувствительны к регистру. Параметр enabled пишется маленькими буквами!
  3. Не разбирался, каким образом так получилось, но в процессе отладки закомментировал строчки в разделе switch, где в зависимости от имени домена задается значение токена. Казалось бы при отправке очередного API запроса, но уже с неверным токеном (нулевое значение или неочищенное значение токена от предыдущих итераций) у меня вместо блокировки ящиков 1 домена (в качестве теста) были заблокированы ящики 2-х доменов. Так что в процессе отладки лучше внимательно отслеживать за текущим значением токена, насильно его обнулять или вообще запускать тест только для 1 csv-файла. Вообще имеет смысл в разделе switch указать default для обнуления значения токена.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *