Как создать JSON полезную нагрузку с использованием Power Shell цикла Foreach - PullRequest
1 голос
/ 03 апреля 2020

Требование: Для отправки электронной почты через учетную запись Send Grid (Send Grid API), прикрепив несколько вложений.

Описание: Я могу создать полезную нагрузку json и могу отправлять с одним вложением по значениям вложений жесткого кодирования. Я открываю диалоговое окно формы окна и могу выбрать один / несколько файлов, которые необходимо прикрепить.

Код:

          $FileBrowser = New-Object System.Windows.Forms.OpenFileDialog -Property @{ 
    InitialDirectory = [Environment]::GetFolderPath('Desktop') 
    #Filter = 'Documents (*.docx)|*.docx|SpreadSheet (*.xlsx)|*.xlsx'
    Filter           = 'All files (*.*)| *.*'
    Title            = 'Select  File(s) for Attachments'
    Multiselect      = $true
  }
  $FileBrowser.ShowDialog() | Out-Null
  $FilesEncodedContents = New-Object System.Collections.ArrayList
  $AttachmentsjsonRequest = @()
  if ($FileBrowser.FileNames.Count -gt 0) {
    foreach ($file in $FileBrowser.FileNames) {
      [string] $filerawContent = $null
      $filedetails = Get-Item $file
      $filerawContent = ConvertToBase64Encode $file

      if (![string]::IsNullOrWhitespace($filerawContent)) {
        $FilesEncodedContents.Add($filerawContent) 
          $obj = New-Object -TypeName PSObject
        $obj | Add-Member -MemberType NoteProperty -Name filename -Value (Get-Item $file).Name
        $obj | Add-Member -MemberType NoteProperty -Name content_id -Value (Get-Item $file).Name
        $obj | Add-Member -MemberType NoteProperty -Name content -Value $filerawContent
        $obj | Add-Member -MemberType NoteProperty -Name disposition -Value 'attachment'
        $AttachmentsjsonRequest += $obj
      }
    }
  }    
      Write-Host "$AttachmentsjsonRequest"

          $headers = @{ }
$headers.Add("Authorization", "Bearer $ApiKey")
$headers.Add("Content-Type", "application/json")
$jsonRequest = [ordered]@{
  personalizations = @(@{to = @(@{email = "$MailTo" })
      subject               = "$Subject" 
    })
  from             = @{email = "no-reply@xxx.com" }
  attachments      = "$AttachmentsjsonRequest"
  content          = @( @{ type = "text/plain"
      value            = "Sample Mail Body" 
    }
  )
} | ConvertTo-Json -Depth 100
           Write-Host $jsonRequest | ConvertTo-Json -Depth 100
       Invoke-RestMethod   -Uri "https://api.sendgrid.com/v3/mail/send" -Method Post -Headers 
    $headers -Body $jsonRequest

Write-Host "Mail Sent"



      #region ConvertToBase64Encode
     Function ConvertToBase64Encode([string] $AttachementFile) {
     [string] $fileContentEncoded = $null
     if (Test-Path $AttachementFile -PathType leaf) {
$fileContent = get-content $AttachementFile
$fileContentBytes = [System.Text.Encoding]::UTF8.GetBytes($fileContent)
$fileContentEncoded = [System.Convert]::ToBase64String($fileContentBytes)
$fileContentEncoded | set-content ((Get-Item -Path $AttachementFile).Name + ".b64")
   }
   else {
     $fileContentEncoded = $null
     Write-Host "File : $FileAttachment not exists,skipping and continue to add if any other 
   attachments  uploaded"
    }
    return $fileContentEncoded

     }
      #endregion

Проблема: [ОБНОВЛЕНО]

Ошибка ниже, когда я пытаюсь загрузить одно или несколько вложений

  {"errors":[{"message":"Invalid type. Expected: array, given: string.","field":"attachments","help":"http://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/errors.html#message.attachments"}]} .

Ссылки: Отправка документации по Grid API:

https://sendgrid.com/docs/API_Reference/api_v3.html

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Я понял подробности ошибки в конце. Он давал подсказку в JSON поле «вложения» полезной нагрузки отображается как строка, а не как объект массива, который исправляется добавлением @ (@ ()) к attachmentjsonrequest в "$ jsonrequest" переменная.

Короче:" attachmentjsonrequest - это объект массива, который необходимо преобразовать в JSON полезную нагрузку с использованием @ ()

Спасибо за предложение использовать объект массива.

       attachments      = @(@($AttachmentsjsonRequest))
0 голосов
/ 03 апреля 2020

Мой совет: не создавайте JSON как текст, сначала создайте объект Powshell, который вы конвертируете в JSON с помощью ConvertTo-Json.

. С помощью этого метода массивы будут правильно отображаться. в JSON. не забудьте установить -DEPTH параметр.

attachments array[object] An array of objects in which you can specify any attachments you want to include.

Так что в вашем объекте Powershell attachments будет @().

объектов с содержимым, введите , имя файла, расположение, свойства conten_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...