ファイル
`files->list`、`listAll`、`iterate`、`get`、`download`、`listLinks`、`listAllLinks`、`iterateLinks`、`createLink`、`revokeLink`、`revokeAllLinks`、`stats`、`upload`、`delete`、`deleteMany`。
すべてのメソッド
use OpenEmail\Constants\FileKinds;use OpenEmail\Constants\FileSorts; $largest = $client->files->list(kind: FileKinds::PDF, sort: FileSorts::LARGEST, limit: 1); foreach ($largest as $file) { foreach ($client->files->listAllLinks($file['id']) as $link) { echo $link['url'], ' ', $link['downloads'], PHP_EOL; } file_put_contents(basename($file['filename']), $client->files->download($file['id']));} $stats = $client->files->stats();echo $stats['totals']['files'], ' ', $stats['uploaded']['bytes'], PHP_EOL;メールボックスが保持するすべてのファイルで、送受信した添付ファイルとアップロードしたファイルを含みます。アプリの「ファイル」ページに当たります。download はバイト列を文字列として返し、file_put_contents でそのまま保存できます。リンクはファイルが送られたときのダウンロードリンクで、それぞれの取得回数が付きます。stats は「分析」タブに当たります。
list、listAll、iterate は q:、kind:、sort: に加えて、direction:(inbound、outbound、uploaded)、address:(大文字小文字を区別せずに比較する 1 つのアドレスのファイル)、since: と until:(DateTimeInterface または ISO 8601 の文字列)を受け取ります。since: はその時点を含み、until: はその直前で止まります。DateTimeInterface は UTC で送られ、2026-09-01 のような日付だけの文字列は UTC の午前 0 時として読まれます。
q: はファイル名とその種類を検索します。kind: は image、pdf、audio、video、text のいずれかで、sort: は newest(既定値)、oldest、largest、name のいずれかです。OpenEmail\Constants\FileKinds、FileSorts、FileDirections が選択肢を定義しています。list は OpenEmail\Result\Page を 1 つ返し、listAll はすべてのファイルを 1 つの配列で返します。iterate はファイルを 1 つずつ yield し、ループが必要とするときにだけ次のページを取得する Generator を返します。
読むには files:read、アップロード、削除、リンクの公開と取り消しには files:write が必要で、これは files:read を含みます。ファイルに独自のスコープができる前に作られたキーには、対応するスコープが付与されました。スコープのないキーは 403 insufficient_scope で拒否され、isScopeMissing() が true の PermissionException としてスローされます。特定のアドレスやドメインに限定されたキーは、そこに届いたファイルしか見えないため、ワークスペース全体向けにアップロードされたファイルは見えません。
download はファイル全体をメモリに保持するため、非常に大きなファイルは 1 つずつ取得してください。ファイル名はファイルを送った人から来たものなので、書き込む前にサンプルのように basename() を通してください。
公開リンク
use OpenEmail\Constants\FileDirections; $uploads = $client->files->listAll(direction: FileDirections::UPLOADED, since: new \DateTimeImmutable('2026-09-01T00:00:00Z'));$file = $uploads[0] ?? null; if ($file !== null) { $link = $client->files->createLink($file['id'], domain: 'acme.com'); echo $link['url'], PHP_EOL; $client->files->revokeLink($file['id'], $link['id']);}createLink はサインインなしで開ける公開ダウンロードリンクでファイルを公開し、そのリンクを返します。リンクは、domain: にファイルホストがあればそこ(たとえば files.acme.com)に置かれ、なければファイルが属するアドレスのファイルホスト、それもなければ API のアドレスに置かれます。メッセージで受信または送信されたファイルはまず公開ストレージにコピーされ、プログラムやスクリプトは 422 file_unshareable で拒否され、ValidationException としてスローされます。
createLink は呼び出すたびに新しいリンクを作るので、応答が失われた後もリトライされません。先に listLinks でリンクを探してください。revokeLink はリンクを完全に無効にし、すでに送られたメールの中のリンクも無効になります。戻り値は revokedAt が設定されたリンクです。同じリンクを 2 回取り消しても安全なので、クライアントは読み取りと同じようにリトライします。存在しないリンクは 404 になり、NotFoundException としてスローされます。revokeAllLinks は 1 つのファイルのすべてのリンクを一度に無効にし、その数を revoked で報告します。
アップロードと削除
$report = "month,sent\n2026-09,1200\n";$upload = $client->files->upload($report, filename: 'report.csv', contentType: 'text/csv'); if ($upload['deletable']) { $client->files->delete($upload['id']);} $logo = $client->files->upload(new \SplFileInfo('logo.svg'));echo $logo['filename'], ' ', $logo['mimeType'], PHP_EOL; $result = $client->files->deleteMany(['file_0c4e7a91d2b84f63a5e19b7d', 'file_6bb640f5b99e47deb758f1f5']); foreach ($result['kept'] as $kept) { echo $kept['filename'], ' ', $kept['reason'], PHP_EOL;}upload はバイト列を最大 100 MB までそのまま、filename: の名前で保存し、ファイルを返します。送信時には、emails->send の attachments に ['fileId' => $upload['id']] として添付します。contentType: を渡すか、自身の種類を持つデータを渡してください。それ以外は application/octet-stream として保存されます。種類が filename: から推測されることはないため、バイト列の文字列を別の種類として保存するには contentType: が必要です。2 回目の試行では 2 つ目のコピーが保存されてしまうため、リトライされることはありません。
データはバイト列の文字列、SplFileInfo、fopen() のストリーム、または PSR-7 のストリームかアップロードされたファイルです。SplFileInfo やファイルで開いたストリームには、どちらの引数も必要ありません。名前はファイル自身のもので、種類は .pdf や .png のようにパッケージが知っている拡張子から決まります。Laravel や Symfony のアップロード、PSR-7 のアップロードファイルは、ブラウザーが送った名前と種類を持っています。文字列は名前を持たないため、filename: のない文字列は、何かが送信される前に InvalidArgumentException をスローします。
アップロードは 600 秒、またはクライアントの timeout がそれより長ければその時間まで実行でき、timeout: で 1 回の呼び出しに別の上限を設定できます。timeout: 0 で作ったクライアントは、アップロードにかかるだけ待ちます。
削除できるのは、何からも参照されていないアップロードだけで、各ファイルの deletable と usage がそれを事前に示します。delete はそれ以外のファイルを 409 file_in_use で拒否し、ConflictException としてスローされます。deleteMany は最大 100 個の id を受け取り、削除できるものを削除し、残りを理由付きで kept に、見つからないものを missing に報告します。どちらもリトライされません。応答が失われた後の 2 回目の delete で 404 が返れば 1 回目は成功しており、2 回目の deleteMany はそれらのファイルを missing に報告します。