【Pleasanter】Outlookの.msgファイルをPowerShellで自動登録する

問い合わせメールを受け取るたびに管理台帳へ転記するのは手間がかかります。Outlookから保存した .msg ファイルをフォルダへ入れるだけで、件名と本文を読み取り、プリザンターの記録テーブルへ登録する仕組みをPowerShellで作ります。

前提

Windows 11、Windows PowerShell 5.1、Classic Outlook(COM対応)、プリザンターのAPIキー、レコード作成権限のある記録テーブルを使用します。New OutlookではOutlook COMを利用できません。まずは検証用テーブルでAPIの接続と項目への登録を確かめてから運用します。

登録先の項目

プリザンター項目 用途
Title メール件名
DescriptionA 送信者・本文
ClassA 種別(障害・問い合わせ)

対象テーブルで説明Aと分類Aを有効化してください。この例では ClassA を問い合わせ種別として使います。チケット番号などに割り当てたテーブルへ流用する場合は、項目の割り当てを合わせて変更する必要があります。

APIの登録形式

レコード登録には POST /api/items/{サイトID}/create を使用します。SiteId は登録先テーブルのIDです。

{
  "ApiVersion": 1.1,
  "ApiKey": "YOUR_API_KEY",
  "Title": "【障害】ログインできない",
  "ClassHash": {"ClassA": "障害"},
  "DescriptionHash": {"DescriptionA": "メール本文"}
}

フォルダ構成

C:\MsgPleasanter\
  config.json
  import.ps1
  inbox\
  done\

config.json

{
  "BaseUrl": "https://pleasanter.example.com",
  "SiteId": 12345,
  "Inbox": "C:\\MsgPleasanter\\inbox",
  "Done": "C:\\MsgPleasanter\\done"
}

APIキーはファイルに平文保存せず、Windowsのユーザー環境変数 PLEASANTER_API_KEY に登録します。

[Environment]::SetEnvironmentVariable('PLEASANTER_API_KEY', 'YOUR_API_KEY', 'User')

設定後にPowerShellを開き直し、環境変数が読み込まれていることを確認します。APIキーは第三者に共有しないでください。

import.ps1(全文)

$ErrorActionPreference = 'Stop'
$config = Get-Content "$PSScriptRoot\config.json" -Raw -Encoding UTF8 | ConvertFrom-Json
$key = [Environment]::GetEnvironmentVariable('PLEASANTER_API_KEY', 'User')
if (!$key) { throw 'APIキーが設定されていません。' }
if (!$config.BaseUrl.StartsWith('https://')) { throw 'HTTPSのURLを設定してください。' }
New-Item -ItemType Directory -Force -Path $config.Inbox, $config.Done | Out-Null

while ($true) {
  Get-ChildItem -LiteralPath $config.Inbox -Filter '*.msg' -File | ForEach-Object {
    $path = $_.FullName
    $app = $null
    $mail = $null
    try {
      # コピー途中のファイルは次回処理
      $size = $_.Length
      Start-Sleep -Milliseconds 500
      if ((Get-Item -LiteralPath $path).Length -ne $size) { return }
      $app = New-Object -ComObject Outlook.Application
      $mail = $app.Session.OpenSharedItem($path)
      $title = [string]$mail.Subject
      $kind = if ($title -match '【障害】') { '障害' } else { '問い合わせ' }
      $desc = "差出人: $($mail.SenderEmailAddress)`n`n$($mail.Body)"
      $payload = @{
        ApiVersion = 1.1
        ApiKey = $key
        Title = $title
        ClassHash = @{ ClassA = $kind }
        DescriptionHash = @{ DescriptionA = $desc }
      } | ConvertTo-Json -Depth 10
      $url = "$($config.BaseUrl.TrimEnd('/'))/api/items/$($config.SiteId)/create"
      $response = Invoke-RestMethod -Uri $url -Method Post -ContentType 'application/json; charset=utf-8' -Body ([Text.Encoding]::UTF8.GetBytes($payload))
      if ([int]$response.StatusCode -ne 200) { throw "APIエラー: $($response.Message)" }
      $name = [guid]::NewGuid().ToString('N') + '_' + $_.Name
      Move-Item -LiteralPath $path -Destination (Join-Path $config.Done $name)
      Write-Host "登録成功 ID=$($response.Id)"
    }
    catch { Write-Warning "$path : $($_.Exception.Message)" }
    finally {
      if ($mail) { [void][Runtime.InteropServices.Marshal]::ReleaseComObject($mail) }
      if ($app) { [void][Runtime.InteropServices.Marshal]::ReleaseComObject($app) }
    }
  }
  Start-Sleep -Seconds 3
}

PowerShellから powershell.exe -NoProfile -File C:\MsgPleasanter\import.ps1 を実行すると、約3秒ごとに inbox を確認します。登録に成功した .msg は done へ移動するため、次の巡回では対象になりません。継続実行する場合はタスクスケジューラの「ログオン時」に起動します。Outlook COMを使用するので、Outlookを操作できるユーザーの対話セッションで実行してください。

運用時の注意点

APIへの登録が成功しても、ファイル移動の直前に処理が中断すると次の巡回で再登録される可能性があります。業務利用する場合はMessage-IDなどによる重複チェックと処理ログを追加してください。また、メール本文には個人情報が含まれることがあるため、対象テーブルのアクセス権とログの保存範囲にも注意が必要です。

本記事のスクリプトは最小構成です。運用環境への投入前に、正常登録・APIエラー・二重登録の動きをテストしてください。

参考資料

Previous Post Next Post