Fichiers
`files->list`, `listAll`, `iterate`, `get`, `download`, `listLinks`, `listAllLinks`, `iterateLinks`, `createLink`, `revokeLink`, `revokeAllLinks`, `stats`, `upload`, `delete` et `deleteMany`.
Toutes les méthodes
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;Chaque fichier que contient la boîte aux lettres, pièces jointes envoyées et reçues et fichiers importés : la page Fichiers de l'application. download renvoie les octets sous forme de chaîne, que file_put_contents enregistre sans modification. Les liens sont les liens de téléchargement sous lesquels un fichier est parti, avec le nombre de fois où chacun a été récupéré, et stats correspond à l'onglet Statistiques.
list, listAll et iterate prennent q:, kind: et sort:, ainsi que direction: (inbound, outbound ou uploaded), address:, les fichiers d'une adresse comparée sans tenir compte de la casse, et since: et until:, un DateTimeInterface ou une chaîne ISO 8601. since: inclut son moment et until: s'arrête juste avant. Un DateTimeInterface est envoyé en UTC, et une chaîne contenant une date seule comme 2026-09-01 est lue comme minuit UTC.
q: cherche dans le nom du fichier et dans son type. kind: vaut image, pdf, audio, video ou text, et sort: vaut newest, la valeur par défaut, oldest, largest ou name. OpenEmail\Constants\FileKinds, FileSorts et FileDirections nomment les choix possibles. list renvoie une OpenEmail\Result\Page, et listAll renvoie tous les fichiers dans un seul tableau. iterate renvoie un Generator qui fournit les fichiers un par un et ne récupère la page suivante que lorsque la boucle en a besoin.
Lire demande files:read, et importer, supprimer, publier ou révoquer des liens demandent files:write, qui inclut files:read. Une clé créée avant que les fichiers aient leurs propres portées a reçu les portées correspondantes. Une clé sans la portée est refusée avec un 403 insufficient_scope, levé sous la forme d'une PermissionException dont isScopeMissing() vaut true. Une clé limitée à certaines adresses ou certains domaines ne voit que les fichiers arrivés à ceux-ci : elle ne voit donc pas les fichiers importés pour tout l'espace de travail.
download garde le fichier entier en mémoire : récupérez donc les très gros fichiers un par un. Passez le nom par basename() avant de l'écrire, comme le fait l'exemple, car il vient de la personne qui a envoyé le fichier.
Liens publics
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 publie un fichier via un lien de téléchargement public qui s'ouvre sans connexion, et renvoie ce lien. Le lien est hébergé sur l'hôte de fichiers de domain: si ce domaine en a un, par exemple files.acme.com, sinon sur l'hôte de fichiers de l'adresse à laquelle appartient le fichier, sinon sur l'adresse de l'API. Un fichier arrivé ou parti avec un message est d'abord copié vers le stockage public, et un programme ou un script est refusé avec un 422 file_unshareable, levé sous la forme d'une ValidationException.
Chaque createLink crée un nouveau lien : il n'est donc jamais réessayé après une réponse perdue. Cherchez d'abord le lien avec listLinks. revokeLink désactive définitivement un lien, y compris dans les messages déjà partis, et le renvoie avec revokedAt renseigné. Révoquer deux fois est sans risque : le client le réessaie donc comme une lecture. Un lien inconnu donne un 404, levé sous la forme d'une NotFoundException. revokeAllLinks désactive d'un coup tous les liens d'un fichier et indique combien dans revoked.
Importer et supprimer
$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 enregistre les octets tels quels, jusqu'à 100 Mo, sous le nom indiqué dans filename:, et renvoie le fichier. Un envoi le joint sous la forme ['fileId' => $upload['id']] dans les attachments d'emails->send. Passez contentType:, ou des données qui portent leur propre type, sinon le fichier est enregistré comme application/octet-stream. Le type n'est jamais deviné à partir de filename: : une chaîne d'octets a donc besoin de contentType: pour être enregistrée comme autre chose. Il n'est jamais réessayé, car une seconde tentative enregistrerait une seconde copie.
Les données sont une chaîne d'octets, un SplFileInfo, un flux issu de fopen(), ou un flux ou un fichier téléversé PSR-7. Un SplFileInfo ou un flux ouvert sur un fichier n'a besoin d'aucun des deux arguments : le nom est celui du fichier, et le type vient de son extension quand le package la connaît, comme .pdf ou .png. Un upload Laravel ou Symfony, et un fichier téléversé PSR-7, apportent le nom et le type envoyés par le navigateur. Une chaîne ne porte pas de nom : une chaîne sans filename: lève donc une InvalidArgumentException avant que rien ne soit envoyé.
Un import peut durer 600 secondes, ou le timeout du client s'il est plus long, et timeout: fixe une autre limite pour un seul appel. Un client construit avec timeout: 0 attend aussi longtemps que dure l'import.
Seul un fichier importé dont rien ne dépend peut être supprimé, et deletable et usage sur chaque fichier l'indiquent à l'avance. delete refuse tout autre fichier avec un 409 file_in_use, levé sous la forme d'une ConflictException. deleteMany prend jusqu'à 100 id, supprime ce qu'il peut et signale le reste dans kept, chacun avec sa raison, et dans missing. Aucun des deux n'est réessayé. Un 404 sur un second delete après une réponse perdue signifie que le premier a fonctionné, et un second deleteMany signale ces fichiers dans missing.