大容量ファイルをboxへ自動登録してライブラリ化(その1)

大容量ファイルの保存問題

オフィスで取り扱う業務データは、主にExcel、Word、PowerPointなどのドキュメントファイルで、サイズは大きくても数十MB程度です。しかし近年、教育や技術伝承を中心とした業務で、サイズの大きい動画が活用されるケースが増えています。

また、情報セキュリティの観点から、スマートデバイスを会社で貸与する企業も増加傾向にあり、デバイスに搭載されたカメラで手軽に動画を撮影できるようになったことで、動画ファイルの数はますます増加しています。

企業内で動画を活用し始めると問題となるのが、ディスク容量の圧迫です。特にファイルサーバーに動画を保存し始めると、共有エリアが逼迫し、業務に支障をきたす可能性があります。

さらに、動画はSNSやWeb会議の録画など、クラウドサービスを利用する機会も多く、さまざまな場所に分散してしまうという問題も生じます。

これらのディスク容量問題に対応するクラウドサービスとしては、Box、Dropbox、Googleドライブ、Microsoft 365 OneDriveなどが挙げられますが、いずれのサービスも快適に利用しようとすると、料金が高額になる傾向があります。

この中で、Boxは保存容量を無制限で提供している唯一のサービスです。

この記事では、中小企業でBoxを有効活用するために、Windows 11で共有したネットワークフォルダにファイルを保存すると、自動的にBoxへファイルをアップロードし、その結果をメールで通知する設定について紹介します。

これにより、Boxの1つのアカウントでファイルを自動登録し、登録したファイルのBoxリンクを取得することが可能となります。

取得したBoxリンクはメールで送信されるため、Power Automateで受信メールからリンクを抽出し、SharePointリストに登録することもできます。

まずは、ファイルアップロードからメール送信までの設定について解説します。

ファイルアップロード&メール送信ロジック図

1. 概要

社内ネットにboxアップロード専用のWindowsパソコンを用意し、そのパソコンで共有されたフォルダにファイルをいれると、1分おき実行するタスクスケジューラによってboxの所定のフォルダにファイルが登録され、登録したファイル名とそのファイルのboxリンクを所定のメールアドレスに送信する。

boxへファイルを移動する際は、処理日のフォルダに移動する。
※処理日フォルダがない場合は自動作成

送信するメール本文に

  • ユーザーアップロード用フォルダ名
  • ファイル名
  • box登録時のURL

をカンマ区切りで登録する。


メール本文例

 

2. 前提条件

– Windows 11 がインストールされたPC
– PowerShell 7.0 以上(推奨:7.5.0)
– .NET 6.0 または 8.0 ランタイム(MailKit利用のため)
– Boxの個人またはビジネスアカウント
– Microsoft 365 アカウント(SMTP送信用)
– 管理者権限でのタスク実行設定

PowerShellや。NETは事前にダウンロードしインストールしてください。

Microsoft365でSMTP送信ができるか不明な場合は、Microsoft365の管理者アカウントがある前提で以下の設定をPowerShellから実行してください。

Microsoft365アカウントでSMTP送信がデキルようにする

# PowerShellを管理者モードで起動する
# 以下のコマンドを入力し、Exchange Online PowerShellに接続
Connect-ExchangeOnline

# 以下のコマンドを入力し、特定ユーザーのSMTP AUTHを有効化
Set-CASMailbox -Identity “smtp送信するためのMicrosoft365メールアドレス” -SmtpClientAuthenticationDisabled $false

3. 事前準備

以下のスクリプトを参考に、各ファイルを作成してください。サンプルでは C:\share フォルダに保存しています。:
– boxupload2sendmail.ps1(PowerShellスクリプト)
– boxuploadGo.bat(バッチファイル)

また、最初の1回のみブラウザ認証が必要です(認可コードを取得してPowerShellに貼り付けます)。

boxupload2sendmail.ps1(PowerShellスクリプト)

赤文字の部分は環境によって書き換えてください。
サンプルスクリプトはファイルを入れるフォルダとして、”C:\Share\in”フォルダをネットワーク上に共有しています。

# ——————————————–
# PowerShell(OAuth 2.0 + MailKit対応):Boxアップロード → リンク取得 → 安全にメール送信
# ——————————————–

# 認証情報
$clientId = “YOUR_clientId
$clientSecret = “YOUR_clientSecret
$redirectUri = “http://localhost”
$scope = “item_upload item_readwrite”
$tokenFile = “C:\share\box_token.json
$logFile = “C:\share\box_upload_log.txt

# フォルダ情報とログ設定
$sourceFolder = “C:\share\in
$localBoxPathRoot = “C:\Users\bitgate\Box\root

# メール設定
$mailFrom = “送信用メールアドレス
$mailTo = “受信用メールアドレス
$mailPassword = “送信用メールアドレスパスワード

# 認証URL作成
$authUrl = “https://account.box.com/api/oauth2/authorize?response_type=code&client_id=$clientId&redirect_uri=$redirectUri”

function Get-BoxAccessToken {
if (Test-Path $tokenFile) {
$token = Get-Content $tokenFile | ConvertFrom-Json
return $token.access_token
}

Write-Host “以下のURLをブラウザで開いて、認可コードを取得してください:” -ForegroundColor Cyan
Write-Host $authUrl
$code = Read-Host “取得した認可コードを入力”

$tokenBody = @{
grant_type = “authorization_code”
code = $code
client_id = $clientId
client_secret = $clientSecret
redirect_uri = $redirectUri
}
$tokenResponse = Invoke-RestMethod -Method Post -Uri “https://api.box.com/oauth2/token” -Body $tokenBody
$tokenResponse | ConvertTo-Json | Set-Content $tokenFile
return $tokenResponse.access_token
}

# Box 認証
$accessToken = Get-BoxAccessToken

# フォルダ情報設定
$today = Get-Date -Format “yyyyMMdd”
$boxUploadUrl = “https://upload.box.com/api/2.0/files/content”
Add-Content -Path $logFile -Value “`n=== 実行開始: $(Get-Date) ===”

# SMTP情報(MailKit用)
$smtpServer = “smtp.office365.com”
$smtpPort = 587

# MailKitライブラリの読み込み
Add-Type -Path “C:\share\MimeKit.dll”
Add-Type -Path “C:\share\MailKit.dll”

# HTTP client 初期化
$handler = New-Object System.Net.Http.HttpClientHandler
$client = New-Object System.Net.Http.HttpClient($handler)
$client.DefaultRequestHeaders.Authorization = New-Object System.Net.Http.Headers.AuthenticationHeaderValue(“Bearer”, $accessToken)

# アップロード処理
Get-ChildItem -Path $sourceFolder -File | ForEach-Object {
try {
$filePath = $_.FullName
$fileName = $_.Name
$fileBytes = [System.IO.File]::ReadAllBytes($filePath)

$meta = @{ name = $fileName; parent = @{ id = “0” } } | ConvertTo-Json -Compress
$stringContent = New-Object System.Net.Http.StringContent($meta, [System.Text.Encoding]::UTF8, “application/json”)
$fileContent = [System.Net.Http.ByteArrayContent]::new($fileBytes)

$multipart = New-Object System.Net.Http.MultipartFormDataContent
$multipart.Add($stringContent, “attributes”)
$multipart.Add($fileContent, “file”, $fileName)

$response = $client.PostAsync($boxUploadUrl, $multipart).Result
$responseBody = $response.Content.ReadAsStringAsync().Result

if (-not $response.IsSuccessStatusCode) {
Add-Content -Path $logFile -Value “Upload failed: $fileName => Status $($response.StatusCode)”
Add-Content -Path $logFile -Value “Response: $responseBody”
return
}

$result = $responseBody | ConvertFrom-Json
if (-not $result.entries -or $result.entries.Count -eq 0) {
Add-Content -Path $logFile -Value “Upload response missing entries for: $fileName”
Add-Content -Path $logFile -Value “Raw response: $responseBody”
return
}

$fileId = $result.entries[0].id

# リンク作成
$linkUri = “https://api.box.com/2.0/files/$fileId”
$linkBody = @{ shared_link = @{ access = “open” } } | ConvertTo-Json -Depth 10
$linkResponse = Invoke-RestMethod -Method Put -Uri $linkUri -Headers @{ Authorization = “Bearer $accessToken”; “Content-Type” = “application/json” } -Body $linkBody
$linkUrl = $linkResponse.shared_link.url

# MailKitでメール送信
$msg = New-Object MimeKit.MimeMessage
$msg.From.Add(“$mailFrom”)
$msg.To.Add(“$mailTo”)
$msg.Subject = “boxupload”

$bodyText = “$fileName`n$linkUrl”
$builder = New-Object MimeKit.BodyBuilder
$builder.TextBody = $bodyText
$msg.Body = $builder.ToMessageBody()

$smtp = New-Object MailKit.Net.Smtp.SmtpClient
$smtp.Connect($smtpServer, $smtpPort, [MailKit.Security.SecureSocketOptions]::StartTls)
$smtp.Authenticate($mailFrom, $mailPassword)
$smtp.Send($msg)
$smtp.Disconnect($true)
$smtp.Dispose()

Add-Content -Path $logFile -Value “Success: $fileName => $linkUrl”
Move-Item -Path $filePath -Destination “$localBoxPathRoot\$today\$fileName” -Force

} catch {
Add-Content -Path $logFile -Value “Error uploading $($_.Name): $($_.Exception.Message)”
}
}

boxuploadGo.bat(バッチファイル)

@echo off
REM PowerShell 7 でスクリプトを実行
pwsh -ExecutionPolicy Bypass -File “C:\share\boxupload2sendmail.ps1”

メール送信用DLLのダウンロード

https://www.nuget.org/packages/MailKit/

https://www.nuget.org/packages/MimeKit/

– MailKit.dll
– MimeKit.dll

※DLLはパッケージに含まれていますので、Download Packageをクリックしてダウンロードたファイルの拡張「nupkg」をzipに書き換えて解凍します。
ファイルは「\lib\netstandard2.0」フォルダの中に格納されています。

 

4. Box Developer Console の設定手順

  1. https://app.box.com/developers/console にアクセスし、ログインします。
    2. 「Platformアプリの作成」をクリックし「カスタムアプリ」をクリック。
    3. 任意のアプリ名を入力し、目的は「自動化」、アプリケーションの作成者は「お客様」を選択し、「次へ」をクリックします。
    4. 認証方法で「ユーザー認証(OAuth2.0)」を選択し、「アプリの作成」をクリックします。
    5. 作成したアプリを選択し、「構成」タブで以下の設定を行います:
       – OAuth 2.0リダイレクトURIに「http://localhost」を追加
       – アプリケーションスコープ のコンテンツ操作をすべてチェック(2箇所)して保存します。
  2. アプリが登録できたら、「構成」タブの中にある、クライアントIDとクライアントシークレットをPowerShellスクリプトに入力してください。

# 認証情報
$clientId = “YOUR_clientId
$clientSecret = “YOUR_clientSecret

5. タスクスケジューラの設定手順

  1. [スタート] メニューから「タスクスケジューラ」を起動します。
    2. 「基本タスクの作成」をクリックし、タスク名を入力します(例:BoxUploadTask)。
    3. トリガーで、毎日:繰り返し間隔1分間:継続時間:無期限を設定します。
    4. 操作で「プログラムの開始」を選び、プログラムに以下を設定:
    – プログラム/スクリプト: cmd.exe
    – 引数の追加:/c “C:\share\boxuploadGo.bat”
    5. 「全般」で、「ユーザーがログインしているときのみ実行する」を選択し、「最上位の特権で実行する」をチェックし、構成は「Windows10」を選択します。
    6. 「OK」(または保存)をクリックしてタスクを保存します。

※6.運用管理手順の操作が終わるまで、タスクは無効にしておいてください。

6. 運用管理手順

– 初めて実行するときは、まず「C:\share\boxuploadGo.bat」を管理者モードで実行します。

以下のURLをブラウザで開いて、認可コードを取得してください:の下に出力されたURLをマウスの左ボタンを押しながら選択し、右ボタンをクリックします。

ブラウザを起動して、コピーしたURLを貼り付けてページを開きくとBOXの認証画面が表示されるので、「BOXへのアクセスを許可」ボタンをクリックします。

ブラウザがリダイレクトし、基本的にページはエラー画面が表示されますが、リダイレクトしたURLの「code=」より左側を選択してコピーします。(画面では2hm~L3oTまでをコピーします。

PowerShellの画面に戻り、コピーしたコードを貼り付けて「Enter」キーを押下します。

以上で「C:\share」フォルダに「box_token.json」ファイルが生成されます。

この操作はパソコンの再起動や アクセストークンが期限切れまたは無効になった場合に再度実行する必要があります。
その際はbox_token.json を削除して再度同じ操作をしてください。

認証が完了したら、フォルダにファイルを入れて、再度「c:\share\boxuploadGo.bat」を管理者モードで実行し、ファイルが正常にアップされ、メールが届いていることを確認してください。

ここまでのテストが正常に動作したら、無効化していたタスクを有効にして、運用を開始してください。


– これ以降、処理ログが C:\share\box_upload_log.txt に記録されます。

7. 注意事項

– Microsoft 365 のアプリパスワードをスクリプトに平文で記載している場合、ファイルのアクセス制御を行ってください。
– MailKitのDLLファイルは C:\share に配置されている必要があります。
– タスクスケジューラの実行アカウントが、PowerShell 7 および C:\share\ にアクセス可能な権限を持っていることを確認してください。