API-Schlüssel
`keys->list`, `listAll`, `iterate`, `get`, `create`, `update`, `delete`, `rotate` und `revoke` sowie die Leser für Anfrageprotokoll, Aktivität und Statistiken.
Jede Methode
use OpenEmail\Constants\ApiScopes; $key = $client->keys->create([ 'name' => 'Billing sender', 'scopes' => [ApiScopes::EMAILS_SEND], 'domainAllowlist' => ['billing.acme.com'], 'expiresInMinutes' => 60 * 24 * 90,]); file_put_contents('.openemail-billing-key', $key['token']); $client->keys->update($key['id'], ['enabled' => false]); $rotated = $client->keys->rotate($key['id']);file_put_contents('.openemail-billing-key', $rotated['token']); $client->keys->revoke($key['id'], ['reason' => 'Replaced']);$client->keys->delete($key['id']);create und rotate sind die einzigen Aufrufe, die ein Secret zurückgeben, in token, einmal. Jeder Lesezugriff liefert stattdessen maskedKey. update schaltet einen Schlüssel mit enabled aus und ein, die umkehrbare Alternative zu revoke, und delete entfernt nur einen widerrufenen Schlüssel: Jeder andere ergibt einen 409 not_revoked, geworfen als ConflictException. Lesen braucht keys:read und jede Änderung keys:manage.
list gibt eine OpenEmail\Result\Page zurück, listAll gibt alle Schlüssel in einem einzigen Array zurück, und iterate gibt einen Generator zurück, der einen Schlüssel nach dem anderen liefert. create und update nehmen den Body als ein einzelnes Array unter den Namen der API, und revoke nimmt ein optionales Array mit reason. Ein OAuth-Zugriffstoken erreicht diese Aufrufe nur, wenn die Person, die die App verbunden hat, Eigentümer des Workspace ist. Das Token jeder anderen Person bekommt eine PermissionException mit errorCode gleich owner_only.
Das Paket wiederholt create und rotate nie. Eine Wiederholung nach einer verlorenen Antwort würde einen zweiten Schlüssel erzeugen oder das Secret ungültig machen, das der erste Versuch zurückgegeben hat. update und revoke werden nach einem Netzwerkfehler wiederholt, weil eine Wiederholung denselben Schlüssel hinterlässt, delete dagegen nicht.
Nie weiter als der Aufrufer
Ein Schlüssel erzeugt oder erreicht nie einen Schlüssel, der weiter reicht als er selbst. Scopes, Rolle, Ablauf, Modus und Sendebereich müssen alle innerhalb des aufrufenden Schlüssels liegen, sonst wirft der Aufruf eine PermissionException mit errorCode gleich beyond_caller_authority, und param nennt die Achse. Ein auf bestimmte Domains oder Adressen eingegrenzter Schlüssel sieht nur die Schlüssel innerhalb seines eigenen Sendebereichs. rotate auf dem aufrufenden Schlüssel funktioniert auch mit keys:write, wie $client->me->rotate().
Die erneute Bestätigung kann bei einem Aufruf mit einem Schlüssel nicht greifen, also ist keys:manage ein Zugang, der Zugänge erzeugt. Geben Sie ihn nur einer Automatisierung, die Schlüssel ausstellt, geben Sie diesem Schlüssel eine Rolle, einen Sendebereich und einen Ablauf, und beobachten Sie listWorkspaceActivity, wo alles, was er tut, auf ihn verbucht wird.
Anfrageprotokoll und Aktivität
$failures = $client->keys->listRequests( '4c1b257a66287fd113bd89d0', failedOnly: true, since: new \DateTimeImmutable('-1 day'),);echo count($failures), PHP_EOL; foreach ($client->keys->iterateWorkspaceActivity() as $change) { echo $change['keyName'], ' ', $change['type'], ' ', $change['actor']['label'] ?? 'system', PHP_EOL;}listRequests und listActivity lesen einen Schlüssel, und listWorkspaceRequests und listWorkspaceActivity lesen jeden Schlüssel oder die, die keyIds: nennt, als Array oder als ein einzelner kommagetrennter String. Jede hat ein Gegenstück mit listAll und eines mit iterate daneben, etwa listAllRequests und iterateRequests. Sie nehmen since: und until: als DateTimeInterface oder ISO-8601-String, und die Anfrage-Leser nehmen zusätzlich failedOnly:.
stats liest, was die Schlüssel innerhalb eines Zeitfensters getan haben: die gesendete Mail und was aus ihr wurde, die abgelehnten Aufrufe, die gestellten Anfragen und die aufgerufenen Routen. Es nimmt dieselben keyIds:, since: und until:, dazu grain: und offsetMinutes:, deckt die letzten 30 Tage bis jetzt ab, wenn Sie kein Fenster angeben, und braucht emails:read neben keys:read.
until: muss später als since: liegen, sonst wirft der Aufruf eine InvalidRequestException mit errorCode gleich invalid_parameter und param gleich until. Ein DateTimeInterface wird in UTC gesendet und ein String so, wie er geschrieben ist. Er muss daher ein Zeitstempel nach ISO 8601 sein, etwa 2026-09-01T00:00:00Z.