問い合わせメールを受け取るたびに管理台帳へ転記するのは手間がかかります。Outlookから保存した .msg ファイルをフォルダへ入れるだけで、件名と本文を読み取り、プリザンターの記録テーブルへ登録する仕組みをPowerShellで作ります。
Windows 11、Windows PowerShell 5.1、Classic Outlook(COM対応)、プリザンターのAPIキー、レコード作成権限のある記録テーブルを使用します。New OutlookではOutlook COMを利用できません。まずは検証用テーブルでAPIの接続と項目への登録を確かめてから運用します。
| プリザンター項目 | 用途 |
|---|---|
| Title | メール件名 |
| DescriptionA | 送信者・本文 |
| ClassA | 種別(障害・問い合わせ) |
対象テーブルで説明Aと分類Aを有効化してください。この例では ClassA を問い合わせ種別として使います。チケット番号などに割り当てたテーブルへ流用する場合は、項目の割り当てを合わせて変更する必要があります。
レコード登録には 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\
{
"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キーは第三者に共有しないでください。
$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エラー・二重登録の動きをテストしてください。