Zur Dokumentation springen
PHP

Konfiguration

Wie Sie einen Client erzeugen, alle Optionen und was er ablehnt, bevor eine Anfrage gesendet wird.

Optionen

clients.php
use OpenEmail\OpenEmail; $client = new OpenEmail(); OpenEmail::init(timeout: 10);OpenEmail::getClient()->me->ping(); $billing = new OpenEmail(apiKey: (string) getenv('OPENEMAIL_BILLING_API_KEY')); echo $client->mode, ' ', $billing->mode, PHP_EOL;
EinstiegspunktWas Sie damit erhalten
new OpenEmail(...)Ein Client, der aus den benannten Argumenten gebaut wird, die Sie übergeben. Alles, was Sie weglassen, wird aus der Umgebung gelesen: der Schlüssel aus OPENEMAIL_API_KEY oder ein Token aus OPENEMAIL_ACCESS_TOKEN, wenn Sie keine Zugangsdaten übergeben, und die Basis-URL aus OPENEMAIL_BASE_URL, wenn Sie keine übergeben.
OpenEmail::createClient(...)Derselbe Client wie new OpenEmail(...), für Code, der lieber eine Factory aufruft.
OpenEmail::init(...)Baut einen Client, behält ihn als gemeinsamen Client und gibt ihn zurück. Er nimmt dieselben benannten Argumente.
OpenEmail::getClient()Der gemeinsame Client, von überall im Prozess. Vor init aufgerufen, baut er beim ersten Aufruf einen aus der Umgebung.
OpenEmail::resetClient()Verwirft den gemeinsamen Client, sodass der nächste getClient() einen neuen baut, und genau das will ein Test zwischen zwei Fällen.

Dass getenv() in einen String umgewandelt wird, ist Absicht. Eine nicht gesetzte Variable wird zu einem leeren Schlüssel, den der Client mit einer Meldung ablehnt, die die benötigte Variable nennt, während null stillschweigend auf OPENEMAIL_API_KEY zurückfallen würde.

options.php
use OpenEmail\Http\CurlHttpClient;use OpenEmail\OpenEmail; $client = new OpenEmail(    apiKey: (string) getenv('OPENEMAIL_API_KEY'),    baseUrl: 'https://api.openemail.uk',    httpClient: new CurlHttpClient(),    maxRetries: 2,    timeout: 30,    userAgent: 'billing-service/1.4',    headers: ['X-Team' => 'billing'],    disableUpdateNotice: true,);
OptionStandardHinweise
apiKey:OPENEMAIL_API_KEYMuss mit oe_live_ oder oe_test_ beginnen. Wird nur aus der Umgebung gelesen, wenn Sie weder apiKey: noch accessToken: übergeben.
accessToken:OPENEMAIL_ACCESS_TOKENEin OAuth-Zugriffstoken oder ein Callable, das eines zurückgibt. Siehe OAuth-Zugriffstoken weiter unten. Übergeben Sie einen Schlüssel oder ein Token, nie beides.
baseUrl:https://api.openemail.ukOder OPENEMAIL_BASE_URL. Abschließende Schrägstriche werden entfernt, und vor einen bloßen Host kommt https://, vor einen Host auf diesem Rechner http://: localhost, eine 127.x.x.x-Adresse oder ::1. Zugangsdaten werden nie über einfaches http an einen anderen Host gesendet, und 0.0.0.0 oder [::] wird beim Erzeugen des Clients abgelehnt, weil das Adressen sind, auf denen ein Server lauscht, und keine, an die man Anfragen sendet.
timeout:30Sekunden pro Versuch, nicht pro Aufruf, für den Verbindungsaufbau und das Lesen der gesamten Antwort. 0 schaltet es ab. files->upload wartet mindestens 600 Sekunden, sofern Sie bei diesem Aufruf nicht timeout: übergeben.
maxRetries:2Zusätzliche Versuche nach dem ersten, bei Aufrufen, die gefahrlos wiederholt werden können. Wird am Client gesetzt, nicht pro Aufruf. 0 schaltet Wiederholungsversuche ab.
httpClient:CurlHttpClientDie HTTP-Schicht: alles, was OpenEmail\Http\HttpClient implementiert, etwa Psr18HttpClient um Guzzle oder Symfony HttpClient, oder ein Fake in einem Test. Die Seite HTTP-Clients behandelt jede Variante.
headers:[]Werden bei jeder Anfrage gesendet.
userAgent:openemail-php/<version>Werden bei jeder Anfrage gesendet.
disableUpdateNotice:falseÜberspringt die einmal pro Prozess laufende Prüfung auf eine neuere Version bei Packagist. Die Prüfung läuft nur auf der Kommandozeile, wenn die Standardausgabe ein Terminal ist, und OPENEMAIL_DISABLE_UPDATE_NOTICE schaltet sie ebenfalls ab.

Umgebungsvariablen

VariableWas es tut
OPENEMAIL_API_KEYDer Schlüssel, den ein Client verwendet, wenn Sie weder apiKey: noch accessToken: übergeben.
OPENEMAIL_ACCESS_TOKENEin OAuth-Zugriffstoken, das nur gelesen wird, wenn Sie keinen der beiden Zugänge übergeben und OPENEMAIL_API_KEY nicht gesetzt ist. Ein Schlüssel in der Umgebung hat also Vorrang.
OPENEMAIL_BASE_URLDie Basis-URL, wenn Sie keine übergeben. Einem bloßen Host wie localhost:2222 wird das Schema hinzugefügt.
OPENEMAIL_DISABLE_UPDATE_NOTICEJeder nicht leere Wert schaltet den Update-Hinweis ab, für jeden Client im Prozess.
HTTPS_PROXY und NO_PROXY oder https_proxy und no_proxyDer Proxy, über den cURL verbindet, und die Hosts, die direkt erreicht werden. Siehe Proxys und TLS weiter unten.

Jede Variable wird zuerst mit getenv() gelesen, dann aus $_SERVER und $_ENV, ein Wert, den Ihr Framework aus einer .env-Datei geladen hat, zählt also auch. Eine Variable, die gesetzt, aber leer ist, gilt als nicht gesetzt.

Was er vor dem Senden ablehnt

Diese Fälle werfen eine OpenEmail\Exception\InvalidArgumentException in der Zeile, die den falschen Wert enthielt, statt erst als verwirrender Fehlschlag bei Ihrem ersten Versand aufzutauchen. Die Meldung sagt, was falsch war und was Sie stattdessen übergeben sollten, und gibt nie Zugangsdaten wieder.

AbgelehntWarum
Gar keine ZugangsdatenWeder apiKey: noch accessToken: wurde übergeben, und keine der beiden Variablen war gesetzt. Es gibt also nichts, womit sich der Client authentifizieren könnte. Wird beim Erzeugen des Clients geworfen.
Ein Schlüssel und ein Token zusammenJede Anfrage trägt genau einen Zugang, der Client kann also nicht erkennen, welchen Sie gemeint haben.
Ein Session-Cookie, ein Session-Token oder ein Schlüssel für einen anderen DienstNur oe_live_ und oe_test_ authentifizieren hier, und die API sagt das ebenfalls. Geprüft wird nur das Präfix, ein widerrufener Schlüssel scheitert daher erst bei der Anfrage, als AuthenticationException.
Eine baseUrl:, die keine http- oder https-URL ist, oder eine, die einen Benutzernamen oder ein Passwort enthältEtwas anderes ist nicht erreichbar, und Zugangsdaten gehören in apiKey: oder accessToken:, nicht in die URL. Wird beim Erzeugen des Clients geworfen.
Zugangsdaten über einfaches http an einen Host, der nicht auf diesem Rechner liegtWird vom Aufruf geworfen, bevor etwas gesendet wird. Verwenden Sie eine https-Basis-URL.
Ein negatives timeout:Übergeben Sie Sekunden oder 0 für kein Timeout. Wird beim Erzeugen des Clients geworfen, oder vom Aufruf, wenn das Timeout einem einzelnen Aufruf übergeben wurde.
Ein Header-Name, der kein gültiges Token ist, oder ein Zeilenumbruch oder anderes Steuerzeichen in einem Header-WertGeprüft in headers:, userAgent: und idempotencyKey:, weil ein Zeilenumbruch einen zweiten Header beginnen würde. Leerzeichen, Tabulatoren und Zeilenumbrüche am Anfang und Ende eines Werts werden vorher entfernt, wie fetch sie entfernt, sodass ein Schlüssel aus einer Datei, die mit einem Zeilenumbruch endet, trotzdem funktioniert.
Eine leere oder nur aus Punkten bestehende id bei einer beliebigen MethodeWird beim Aufruf der Methode geworfen. Ein Pfadsegment aus Punkten wird von jedem URL-Parser entfernt, die Anfrage träfe also einen anderen Endpunkt. Eine id, die kein gültiges UTF-8 ist, wird ebenfalls abgelehnt.
Anhangsinhalt, der kein base64 istEin String wird immer als base64 gelesen, rohe Bytes darin würden also als Datenmüll gesendet. Kodieren Sie sie mit OpenEmail::toBase64(), oder übergeben Sie eine SplFileInfo, einen Stream oder einen PSR-7-Stream, und der Client kodiert sie.

Die Klasse erweitert PHPs eigene InvalidArgumentException, Code, der diese bereits abfängt, funktioniert also weiter, und sie implementiert OpenEmail\Exception\OpenEmailException wie jede andere Exception, die das Paket wirft. Ein Wert vom falschen Typ, etwa eine Zahl, wo eine String-id hingehört, ist ein TypeError von PHP selbst, weil jede Methode ihre Typen deklariert.

Es gibt keine Option testMode:, und es wird keine geben. Das Schlüsselschema ist Teil des Zugangs und kein bloßer Hinweis, der Modus ist also eine Eigenschaft des Schlüssels. $client->mode liest das Präfix, live oder test, und entscheidet nichts.

Ein Client, mehrere Schlüssel

Erzeugen Sie den Client einmal und teilen Sie ihn. Ein neuer Client pro Anfrage verwirft seine offene Verbindung ohne Nutzen, und nichts von seinem Zustand gehört zu einem bestimmten Aufrufer.

Für den Fall, der sonst einen Client pro Schlüssel erzwingen würde, etwa einen Job, der im Namen mehrerer Workspaces sendet, übergeben Sie apiKey: beim Aufruf. Er ersetzt den Authorization-Header für diese Anfrage und hinterlässt nichts am Client.

per_call_key.php
$message = [    'from' => '[email protected]',    'to' => '[email protected]',    'subject' => 'Your invoice',    'text' => 'Attached.',];$workspaceKey = (string) getenv('OPENEMAIL_API_KEY'); $client->emails->send($message); $client->emails->send($message, apiKey: $workspaceKey); $client->threads->list(folder: 'inbox', apiKey: $workspaceKey);$client->webhooks->list(apiKey: $workspaceKey);

Jede Methode außerhalb von tempMail nimmt ihn als letztes benanntes Argument entgegen, nach den Filtern einer Liste, und die tempMail-Methoden nehmen stattdessen inboxToken:. Er wird vor dem Senden der Anfrage nach derselben Regel geprüft, die der Client verwendet. Ein Tippfehler wirft daher eine InvalidArgumentException zum apiKey dieses Aufrufs statt eines 401 zu Zugangsdaten, die Sie dann erst suchen müssen. Ein wiederholter Aufruf behält den Schlüssel, den er erhalten hat.

$client->mode beschreibt den Schlüssel, mit dem der Client ERZEUGT wurde, und folgt keiner Überschreibung. Sobald ein Client mehrere Schlüssel bedient, gibt es keinen einzelnen Modus mehr zu melden, lesen Sie ihn also an dem Schlüssel ab, den Sie übergeben haben. var_dump($client) zeigt den Modus und die Basis-URL, nie den Schlüssel, und jeder Parameter, der Zugangsdaten entgegennimmt, ist mit #[\SensitiveParameter] markiert, sodass ein Stacktrace an seiner Stelle einen Platzhalter ausgibt.

Endpunkte, die keine Methode kapselt

$client->raw ist der Transport, über den jede Methode läuft. $client->raw->request() ruft einen Pfad auf, den noch keine Methode kapselt, mit den Zugangsdaten, der Basis-URL, dem Timeout und den Wiederholungsregeln des Clients, und gibt den dekodierten Body so zurück, wie es eine Methode tut.

raw_request.php
$ping = $client->raw->request('/ping'); $label = $client->raw->request('/labels', method: 'POST', body: ['name' => 'Invoices']); var_dump($ping, $label);
Benanntes ArgumentWas es tut
method:GET, sofern Sie nichts anderes angeben: POST, PUT, PATCH oder DELETE.
query:Ein Array mit Query-Parametern. null und leere Werte werden weggelassen, eine Liste wird mit Kommas verbunden, und ein DateTimeInterface wird als Zeitpunkt nach ISO 8601 in UTC gesendet.
body:Ein Array, als JSON gesendet.
raw: und contentType:Bytes, die unverändert gesendet werden, als String, Stream-Ressource, SplFileInfo oder PSR-7-Stream, mit application/octet-stream, sofern Sie keinen Typ nennen.
accept: und binary:Ein anderes accept: als JSON gibt den Body als Text zurück, und binary: true gibt ihn als String aus Bytes zurück.
idempotent: und idempotencyKey:idempotent: true hängt einen Idempotency-Key an, der erzeugt wird, sofern Sie keinen eigenen übergeben.
repeatable:Ob ein Fehlschlag wiederholt wird. Das gilt nur für ein GET, sofern Sie nicht repeatable: true übergeben.
anonymous:true sendet überhaupt keine Zugangsdaten.
apiKey:, inboxToken: und timeout:Dieselben Zugangsdaten pro Aufruf und ein Timeout in Sekunden nur für diesen Aufruf.

Der Pfad muss mit einem einzelnen / beginnen, und ein Pfad, dessen fertige URL den Origin der Basis-URL verlassen würde, wirft eine InvalidArgumentException, bevor etwas gesendet wird. So erreichen die Zugangsdaten nie einen anderen Host.

Wegwerf-Postfächer

OpenEmail::createTempMail() erzeugt einen Client für Wegwerf-Posteingänge, der keinen API-Schlüssel trägt und keinen aus der Umgebung liest. Er legt Posteingänge anonym an, und jeder Lesezugriff sendet das Posteingangs-Token, das create zurückgegeben hat, oder das neuere, das extend zurückgegeben hat, entweder pro Aufruf als inboxToken: oder einmalig als OpenEmail::createTempMail(inboxToken: ...).

temp_mail.php
use OpenEmail\OpenEmail; $tempMail = OpenEmail::createTempMail(); $inbox = $tempMail->create();$page = $tempMail->listMessages($inbox['id'], inboxToken: $inbox['token']); echo count($page->items), ' ', $page->expiresAt, PHP_EOL;

OpenEmail::createTempMail() nimmt wie jeder Client baseUrl:, httpClient:, maxRetries:, timeout:, userAgent:, headers: und disableUpdateNotice: entgegen und liest OPENEMAIL_BASE_URL, wenn Sie keine Basis-URL übergeben.

OAuth-Zugriffstoken

Eine App, die jemand über OAuth verbunden hat, etwa ein Kommandozeilenwerkzeug oder ein Agent, hält ein Zugriffstoken statt eines API-Schlüssels. Übergeben Sie es als accessToken:, entweder das Token selbst oder ein Callable, das es zurückgibt, etwa eine Closure oder ein First-Class-Callable. Das Callable läuft einmal pro Aufruf, und die Wiederholungen dieses Aufrufs verwenden, was es zurückgab. Erneuern Sie das Token also darin, wenn es bald abläuft, dann muss der Client nie neu erzeugt werden.

access_token.php
use OpenEmail\OpenEmail; $tokens = ['current' => 'token-from-your-oauth-flow']; $oauthClient = new OpenEmail(accessToken: fn(): string => $tokens['current']); $me = $oauthClient->me->get(); if ($me['object'] === 'oauth_token') {    echo $me['clientId'], ' ', $me['expiresAt'], PHP_EOL;}
FallWas passiert
apiKey: und accessToken: zusammen oder keins von beidenDer Client wirft beim Erzeugen eine InvalidArgumentException. Fehlen beide, nennt die Meldung OPENEMAIL_API_KEY und OPENEMAIL_ACCESS_TOKEN.
Ein Wert, der kein Token istEin Token hat 1 bis 512 Zeichen und beginnt nicht mit oe_, die Prüfung, die OpenEmail::isAccessToken() macht. Ein String, der sie nicht besteht, wird beim Erzeugen des Clients abgelehnt, und ein Callable, das so einen Wert zurückgibt, lässt den Aufruf eine InvalidArgumentException werfen, bevor irgendetwas gesendet wird.
OPENEMAIL_ACCESS_TOKENWird gelesen, wenn Sie keinen der beiden Zugänge übergeben und OPENEMAIL_API_KEY nicht gesetzt ist. Ein Schlüssel in der Umgebung hat also Vorrang.
Ein Callable, das eine Exception wirftDer Aufruf wirft genau diese Exception unverändert, und es wird nichts gesendet.
Ein apiKey: pro AufrufErsetzt das Token für diese eine Anfrage, und das Callable wird nicht aufgerufen.
$client->modeUnter einem Token immer live.
OpenEmail::createTempMail()Sendet keinen Zugang, egal was in der Umgebung steht.
me->get() und me->ping()Für ein Token antwortet get mit object gleich oauth_token, id und roleId null, der clientId der verbundenen App und expiresAt, dem Zeitpunkt, an dem die Freigabe der Person für die App ausläuft. ping antwortet mit kind gleich oauth, keyId null und der clientId. Prüfen Sie object oder kind, bevor Sie id oder keyId lesen.

Ein Token handelt für eine Person und liest ihre Mails so, wie sie es kann. Halten Sie es also wie einen Schlüssel auf einem Server.

Bestätigungscodes

Vor einer heiklen Änderung, etwa dem Löschen einer Domain oder dem Ändern eines Webhooks, verlangt die API von einem Zugriffstoken den Bestätigungscode, den die Web-App von der Person verlangen würde. Der Aufruf wirft eine PermissionException, einen 403, dessen isStepUpRequired() true ist, und es wurde nichts geändert. Fordern Sie einen Code an, bestätigen Sie den, den die Person Ihnen gibt, und rufen Sie dann erneut auf. Ein API-Schlüssel wird nie gefragt.

step_up.php
use OpenEmail\Exception\ApiException; $domainId = 'b3e1f0a4-6c2d-4e8a-9f17-2d5c8a0b4e6f'; try {    $client->domains->delete($domainId);} catch (ApiException $error) {    if (!$error->isStepUpRequired()) {        throw $error;    }     $challenge = $client->security->beginStepUp();     if ($challenge['method'] === 'email') {        echo 'Enter the code we emailed to ', $challenge['sentTo'], PHP_EOL;    } else {        echo 'Enter the code from your authenticator app, or a backup code', PHP_EOL;    }     $client->security->verifyStepUp(['code' => trim((string) fgets(STDIN))]);    $client->domains->delete($domainId);}
MethodeWas es tut
security->stepUpStatus()Ob die App gerade bestätigt ist (elevated, elevatedUntil), wie der nächste Code geprüft wird (method, email oder totp) und minutes, die Länge des Zeitfensters. Sie sendet nichts und meldet keine Pause.
security->beginStepUp()Eröffnet eine Abfrage. Bei email geht ein sechsstelliger Code an die Adresse, mit der sich die Person anmeldet, und sentTo zeigt sie maskiert. Bei totp liest sie einen aus ihrer Authenticator-App ab oder nimmt einen Wiederherstellungscode. Eine noch offene Abfrage mit verbleibenden Versuchen wird wiederverwendet, außer Sie übergeben ['resend' => true], und eine gesperrte oder abgelaufene wird durch einen einfachen Aufruf ersetzt. Jede App darf pro Person 5 Abfragen pro Stunde und 20 in 24 Stunden eröffnen, und die nächste wirft einen 429 step_up_throttled.
security->verifyStepUp(['code' => ...])Prüft den Code und schaltet heikle Änderungen für diese App 60 Minuten lang frei, bis elevatedUntil, über REST und über die MCP-Tools, die dieselben Änderungen vornehmen. Nach 10 falschen Codes in 24 Stunden von dieser App oder 20 von allen Apps der Person zusammen werfen dieser Aufruf und beginStepUp einen 429 step_up_locked, mit einer Meldung, die sagt, wann die Bestätigung wieder möglich ist.

Der Client fragt nie selbst nach einem Code und wiederholt den Aufruf nicht von sich aus, und keine der drei Methoden wird automatisch wiederholt, weil ein erneuter Versuch nach einer verlorenen Antwort eine zweite E-Mail senden oder einen zweiten Versuch verbrauchen könnte. Sie brauchen keinen Scope, und ein API-Schlüssel bekommt bei jeder von ihnen einen 400 step_up_not_applicable. OpenEmail\Constants\StepUpErrorCodes benennt jeden Grund, aus dem eine Bestätigung scheitern kann, und die Fehlerseite der API sagt, was jeweils zu tun ist.

Der Update-Hinweis

Wenn bei Packagist eine neuere Version des Pakets vorliegt, meldet der Client das einmal pro Prozess auf der Standardfehlerausgabe, als Zeile wie ℹ openemail/sdk 0.0.2 is available, you are on 0.0.1., gefolgt von der Seite des Pakets. Die Prüfung läuft nur auf der Kommandozeile, wenn die Standardausgabe ein Terminal ist, und nie unter einem Webserver. Sie startet, wenn der erste Client erzeugt wird, und läuft neben Ihren Anfragen, und am Ende des Skripts wartet sie auf den Rest eines Budgets von zwei Sekunden. Ist Packagist nicht erreichbar, wird das ignoriert.

Die Prüfung stellt ihre eigene Anfrage mit cURL, außerhalb des httpClient: des Clients, ein Fake-HTTP-Client in einem Test sieht sie also nie. Übergeben Sie disableUpdateNotice: true oder setzen Sie OPENEMAIL_DISABLE_UPDATE_NOTICE, um sie abzuschalten.

Proxys und TLS

Der Standard-CurlHttpClient überlässt Proxys cURL, das https_proxy oder HTTPS_PROXY für den Proxy und no_proxy oder NO_PROXY für die Hosts liest, die direkt erreicht werden. Übergeben Sie stattdessen proxy:, um einen im Code zu nennen. Benutzername und Passwort in der Proxy-URL werden an den Proxy gesendet.

curl_options.php
use OpenEmail\Http\CurlHttpClient;use OpenEmail\OpenEmail; $client = new OpenEmail(httpClient: new CurlHttpClient(    caBundle: '/etc/ssl/certs/corporate-ca.pem',    proxy: 'http://proxy.internal:3128',    curlOptions: [CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4],));

Verbindungen nutzen TLS 1.2 oder neuer und prüfen das Zertifikat und den Hostnamen des Servers, und Weiterleitungen werden nie verfolgt. caBundle: nennt die Zertifizierungsstellen, denen vertraut wird, für einen Proxy, der TLS untersucht. curlOptions: setzt jede andere cURL-Option, doch die Einstellungen, die eine Anfrage braucht, haben immer Vorrang: die URL und ihr Port, die Methode, die Header, der Body und abgeschaltete Weiterleitungen. CURLOPT_REQUEST_TARGET wird abgelehnt, und eine Option, die cURL nicht annimmt, wirft eine InvalidArgumentException, die sie nennt.