Dateien
`files->list`, `listAll`, `iterate`, `get`, `download`, `listLinks`, `listAllLinks`, `iterateLinks`, `createLink`, `revokeLink`, `revokeAllLinks`, `stats`, `upload`, `delete` und `deleteMany`.
Jede Methode
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;Jede Datei, die das Postfach enthält, gesendete und empfangene Anhänge und die hochgeladenen Dateien: die Seite „Dateien“ der App. download gibt die Bytes als String zurück, den file_put_contents unverändert speichert. Die Links sind die Download-Links, als die eine Datei verschickt wurde, mit der Angabe, wie oft jeder abgerufen wurde, und stats ist der Tab „Analysen“.
list, listAll und iterate nehmen q:, kind: und sort:, außerdem direction: (inbound, outbound oder uploaded), address:, die Dateien einer Adresse, ohne Beachtung der Groß- und Kleinschreibung verglichen, sowie since: und until:, ein DateTimeInterface oder einen String nach ISO 8601. since: schließt seinen Zeitpunkt ein, und until: endet davor. Ein DateTimeInterface wird in UTC gesendet, und ein String mit einem bloßen Datum wie 2026-09-01 wird als Mitternacht UTC gelesen.
q: durchsucht den Dateinamen und seinen Typ. kind: ist image, pdf, audio, video oder text, und sort: ist newest, der Standard, oldest, largest oder name. OpenEmail\Constants\FileKinds, FileSorts und FileDirections nennen die Auswahlmöglichkeiten. list gibt eine OpenEmail\Result\Page zurück, und listAll gibt alle Dateien in einem einzigen Array zurück. iterate gibt einen Generator zurück, der eine Datei nach der anderen liefert und die nächste Seite erst holt, wenn die Schleife sie braucht.
Lesen braucht files:read, und Hochladen, Löschen sowie das Veröffentlichen oder Widerrufen von Links brauchen files:write, das files:read einschließt. Ein Schlüssel, der erstellt wurde, bevor Dateien eigene Scopes hatten, erhielt die passenden. Ein Schlüssel ohne den Scope wird mit einem 403 insufficient_scope abgelehnt, geworfen als PermissionException, deren isScopeMissing() true ist. Ein auf bestimmte Adressen oder Domains beschränkter Schlüssel sieht nur die Dateien, die bei diesen eingegangen sind, und sieht daher keine Dateien, die für den ganzen Workspace hochgeladen wurden.
download hält die ganze Datei im Speicher. Holen Sie sehr große Dateien daher einzeln. Leiten Sie den Namen vor dem Schreiben durch basename(), wie es das Beispiel tut, denn er stammt von der Person, die die Datei gesendet hat.
Öffentliche Links
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 veröffentlicht eine Datei unter einem öffentlichen Download-Link, der sich ohne Anmeldung öffnet, und gibt den Link zurück. Der Link liegt auf dem Datei-Host von domain:, wenn diese Domain einen hat, etwa files.acme.com, sonst auf dem Datei-Host der Adresse, zu der die Datei gehört, sonst auf der API-Adresse. Eine Datei, die mit einer Nachricht ein- oder ausging, wird zuerst in öffentlichen Speicher kopiert, und ein Programm oder ein Skript wird mit einem 422 file_unshareable abgelehnt, geworfen als ValidationException.
Jedes createLink erzeugt einen neuen Link und wird deshalb nach einer verlorenen Antwort nie wiederholt: Suchen Sie den Link zuerst mit listLinks. revokeLink legt einen Link endgültig still, auch in bereits verschickten Mails, und gibt ihn mit gesetztem revokedAt zurück. Zweimal zu widerrufen ist unbedenklich, der Client wiederholt es daher wie einen Lesevorgang. Ein unbekannter Link ergibt einen 404, geworfen als NotFoundException. revokeAllLinks legt alle Links einer Datei auf einmal still und meldet in revoked, wie viele es waren.
Hochladen und löschen
$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 speichert die Bytes, wie sie sind, bis 100 MB, unter dem Namen in filename: und gibt die Datei zurück. Ein Versand hängt sie als ['fileId' => $upload['id']] in den attachments von emails->send an. Übergeben Sie contentType: oder Daten, die ihren eigenen Typ mitbringen, alles andere wird als application/octet-stream gespeichert. Der Typ wird nie aus filename: erraten, ein String aus Bytes braucht daher contentType:, um als etwas anderes gespeichert zu werden. Es wird nie wiederholt, weil ein zweiter Versuch eine zweite Kopie speichern würde.
Die Daten sind ein String aus Bytes, eine SplFileInfo, ein Stream aus fopen() oder ein PSR-7-Stream oder eine hochgeladene Datei. Eine SplFileInfo oder ein auf einer Datei geöffneter Stream braucht keines der beiden Argumente: Der Name ist der eigene der Datei, und der Typ ergibt sich aus der Endung, wenn das Paket sie kennt, etwa .pdf oder .png. Ein Laravel- oder Symfony-Upload und eine hochgeladene PSR-7-Datei bringen den Namen und den Typ mit, die der Browser gesendet hat. Ein String trägt keinen Namen, ein String ohne filename: wirft daher eine InvalidArgumentException, bevor etwas gesendet wird.
Ein Upload darf 600 Sekunden laufen oder so lange wie das timeout des Clients, wenn dieses länger ist, und timeout: setzt für einen Aufruf ein anderes Limit. Ein mit timeout: 0 erzeugter Client wartet so lange, wie ein Upload dauert.
Nur ein Upload, von dem nichts abhängt, kann gelöscht werden, und deletable und usage an jeder Datei sagen das vorab. delete lehnt jede andere Datei mit einem 409 file_in_use ab, geworfen als ConflictException. deleteMany nimmt bis zu 100 ids, löscht, was es kann, und meldet den Rest in kept, jede mit ihrem Grund, und in missing. Keines von beiden wird wiederholt. Ein 404 bei einem zweiten delete nach einer verlorenen Antwort bedeutet, dass das erste funktioniert hat, und ein zweites deleteMany meldet diese Dateien in missing.