Konfigurimi
Si të ndërtoni një klient, çdo opsion, dhe çfarë refuzon përpara se të dërgohet një kërkesë.
Opsionet
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;| Pika e hyrjes | Çfarë ju jep |
|---|---|
| new OpenEmail(...) | Një klient i ndërtuar nga argumentet me emër që jepni. Çdo gjë që nuk e jepni lexohet nga mjedisi: çelësi nga OPENEMAIL_API_KEY ose një token nga OPENEMAIL_ACCESS_TOKEN kur nuk jepni asnjë kredencial, dhe URL-ja bazë nga OPENEMAIL_BASE_URL kur nuk jepni asnjë. |
| OpenEmail::createClient(...) | I njëjti klient si new OpenEmail(...), për kodin që preferon të thërrasë një fabrikë. |
| OpenEmail::init(...) | Ndërton një klient, e mban si klientin e përbashkët dhe e kthen. Merr të njëjtat argumente me emër. |
| OpenEmail::getClient() | Klienti i përbashkët, nga kudo në proces. Nëse thirret para init, ndërton një nga mjedisi në thirrjen e parë. |
| OpenEmail::resetClient() | Heq klientin e përbashkët, ndaj getClient() i radhës ndërton një të ri, gjë që i duhet një testi mes rasteve. |
Shndërrimi i getenv() në string është i qëllimshëm. Një variabël që nuk është vendosur bëhet çelës bosh, të cilin klienti e refuzon me një mesazh që emërton variablin që i duhet, ndërsa null do të kalonte në heshtje te OPENEMAIL_API_KEY.
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,);| Opsioni | Parazgjedhja | Shënime |
|---|---|---|
| apiKey: | OPENEMAIL_API_KEY | Duhet të fillojë me oe_live_ ose oe_test_. Lexohet nga mjedisi vetëm kur nuk jepni as apiKey: as accessToken:. |
| accessToken: | OPENEMAIL_ACCESS_TOKEN | Një token qasjeje OAuth, ose një objekt i thirrshëm që kthen një të tillë. Shihni “Tokenat e qasjes OAuth” më poshtë. Jepni një çelës ose një token, kurrë të dyja. |
| baseUrl: | https://api.openemail.uk | Ose OPENEMAIL_BASE_URL. Slash-et në fund hiqen, dhe përpara një hosti të zhveshur vendoset https://, ose http:// përpara një hosti në këtë makinë: localhost, një adresë 127.x.x.x ose ::1. Një kredencial nuk dërgohet kurrë me http të thjeshtë te ndonjë host tjetër, dhe 0.0.0.0 ose [::] refuzohen kur ndërtohet klienti, sepse këto janë adresa ku dëgjon një server, jo adresa ku dërgohen kërkesa. |
| timeout: | 30 | Sekonda për përpjekje, jo për thirrje, që mbulojnë lidhjen dhe leximin e gjithë përgjigjes. 0 e çaktivizon. files->upload pret të paktën 600 sekonda, përveç nëse jepni timeout: në atë thirrje. |
| maxRetries: | 2 | Përpjekje shtesë pas së parës, te thirrjet që mund të përsëriten pa rrezik. Vendoset te klienti, jo për çdo thirrje. 0 i çaktivizon riprovat. |
| httpClient: | CurlHttpClient | Shtresa HTTP: çdo gjë që implementon OpenEmail\Http\HttpClient, si Psr18HttpClient rreth Guzzle ose Symfony HttpClient, ose një imitim në test. Faqja Klientët HTTP i trajton secilin. |
| headers: | [] | Dërgohen në çdo kërkesë. |
| userAgent: | openemail-php/<version> | Dërgohen në çdo kërkesë. |
| disableUpdateNotice: | false | Kapërcen kontrollin për një version më të ri në Packagist, që bëhet një herë për proces. Kontrolli ekzekutohet vetëm në rreshtin e komandave, kur dalja standarde është një terminal, dhe OPENEMAIL_DISABLE_UPDATE_NOTICE e çaktivizon gjithashtu. |
Variablat e mjedisit
| Variabli | Çfarë bën |
|---|---|
| OPENEMAIL_API_KEY | Çelësi që përdor një klient kur nuk jepni as apiKey: as accessToken:. |
| OPENEMAIL_ACCESS_TOKEN | Një token qasjeje OAuth, që lexohet vetëm kur nuk jepni asnjë kredencial dhe OPENEMAIL_API_KEY nuk është vendosur, ndaj një çelës në mjedis ka përparësi. |
| OPENEMAIL_BASE_URL | URL-ja bazë kur nuk jepni asnjë. Një hosti të zhveshur si localhost:2222 i shtohet skema. |
| OPENEMAIL_DISABLE_UPDATE_NOTICE | Çdo vlerë jo bosh e çaktivizon njoftimin për përditësim, për çdo klient në proces. |
| HTTPS_PROXY dhe NO_PROXY, ose https_proxy dhe no_proxy | Proxy-ja përmes së cilës lidhet cURL dhe hostet që lidhen drejtpërdrejt. Shihni “Proxy-t dhe TLS” më poshtë. |
Çdo variabël lexohet fillimisht me getenv(), pastaj nga $_SERVER dhe $_ENV, ndaj llogaritet edhe një vlerë që framework-u juaj e ngarkoi nga një skedar .env. Një variabël që është vendosur, por është bosh, llogaritet si e pavendosur.
Çfarë refuzon para dërgimit
Këto hedhin OpenEmail\Exception\InvalidArgumentException nga rreshti që përmbante vlerën e gabuar, në vend që të shfaqen si një dështim i paqartë në dërgimin tuaj të parë. Mesazhi thotë çfarë ishte gabim dhe çfarë të jepni në vend të saj, dhe nuk e përsërit kurrë një kredencial.
| Refuzohet | Pse |
|---|---|
| Asnjë kredencial | Nuk u dha as apiKey: as accessToken:, dhe nuk u vendos asnjë nga variablat, ndaj nuk ka asgjë për t’u autentikuar. Hidhet kur ndërtohet klienti. |
| Një çelës dhe një token bashkë | Çdo kërkesë mbart një kredencial, ndaj klienti nuk mund ta dallojë cilin keni pasur parasysh. |
| Një cookie sesioni, një token sesioni ose një çelës për një shërbim tjetër | Këtu autentikojnë vetëm oe_live_ dhe oe_test_, dhe këtë e thotë edhe API-ja. Kontrolli është vetëm i prefiksit dhe asgjë më shumë, ndaj një çelës i revokuar dështon prapëseprapë kur kërkesa arrin te serveri, si një AuthenticationException. |
| Një baseUrl: që nuk është URL http ose https, ose që përmban emër përdoruesi ose fjalëkalim | Asgjë tjetër nuk mund të arrihet, dhe vendi i kredencialit është te apiKey: ose accessToken:, jo në URL. Hidhet kur ndërtohet klienti. |
| Një kredencial me http të thjeshtë drejt një hosti që nuk është në këtë makinë | Hidhet nga thirrja, para se të dërgohet çfarëdo. Përdorni një URL bazë me https. |
| Një timeout: negativ | Jepni sekonda, ose 0 për të mos pasur afat skadimi. Hidhet kur ndërtohet klienti, ose nga thirrja, për një afat skadimi të dhënë në një thirrje të vetme. |
| Një emër header-i që nuk është token HTTP, ose një ndërprerje rreshti apo karakter tjetër kontrolli në vlerën e një header-i | Kontrollohet te headers:, userAgent: dhe idempotencyKey:, sepse një ndërprerje rreshti do të niste një header të dytë. Hapësirat, tab-et dhe ndërprerjet e rreshtit rreth një vlere hiqen më parë, ashtu si i heq fetch, ndaj një çelës i lexuar nga një skedar që mbaron me rresht të ri funksionon gjithsesi. |
| Një id bosh ose e përbërë vetëm nga pika te çfarëdo metode | Hidhet kur thirret metoda. Një segment shtegu prej pikash hiqet nga çdo parser URL-je, pra kërkesa do të arrinte te një endpoint tjetër. Refuzohet gjithashtu një id që nuk është UTF-8 i vlefshëm. |
| Përmbajtje bashkëngjitjeje që nuk është base64 | Një string lexohet gjithmonë si base64, ndaj bajtet e papërpunuara brenda tij do të dërgoheshin si mbeturina. Kodojini me OpenEmail::toBase64(), ose jepni një SplFileInfo, një stream ose një stream PSR-7 dhe klienti e kodon. |
Klasa zgjeron vetë InvalidArgumentException të PHP-së, ndaj kodi që e kap tashmë atë vazhdon të funksionojë, dhe implementon OpenEmail\Exception\OpenEmailException si çdo përjashtim tjetër që hedh paketa. Një vlerë e tipit të gabuar, si një numër aty ku shkon një id string, është një TypeError nga vetë PHP-ja, sepse çdo metodë i deklaron tipet e saj.
Nuk ka opsion testMode: dhe nuk do të ketë. Skema e çelësit është pjesë e kredencialit, jo një sugjerim, ndaj modaliteti është veti e çelësit. $client->mode lexon prefiksin, live ose test, dhe nuk vendos asgjë.
Një klient, disa çelësa
Ndërtojeni klientin një herë dhe ndajeni. Një klient i ri për çdo kërkesë e hedh poshtë lidhjen e hapur pa asnjë përfitim, dhe asnjë pjesë e gjendjes mbi të nuk është e veçantë për thirrësin.
Për rastin që përndryshe do të detyronte një klient për çdo çelës, si një punë në sfond që dërgon në emër të disa hapësirave të punës, jepni apiKey: te thirrja. Ai zëvendëson header-in Authorization për atë kërkesë dhe nuk lë asgjë pas te klienti.
$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);Çdo metodë jashtë tempMail e merr si argumentin e saj të fundit me emër, pas filtrave të një liste, ndërsa metodat e tempMail marrin në vend të tij inboxToken:. Kontrollohet para se të dërgohet kërkesa, me të njëjtin rregull që përdor klienti, ndaj një gabim shtypi hedh një InvalidArgumentException për apiKey-n e dhënë në këtë thirrje, në vend të një 401 për një kredencial që pastaj duhet ta kërkoni. Një thirrje e riprovuar e ruan çelësin që iu dha.
$client->mode përshkruan çelësin me të cilin u NDËRTUA klienti dhe nuk ndjek një mbishkrim. Kur një klient shërben disa çelësa, nuk ka një modalitet të vetëm për të raportuar, ndaj lexojeni nga çelësi që dhatë. var_dump($client) tregon modalitetin dhe URL-në bazë, kurrë çelësin, dhe çdo parametër që merr një kredencial është shënuar me #[\SensitiveParameter], ndaj një stack trace shtyp një vendmbajtës në vend të tij.
Endpoint-e që nuk i mbështjell asnjë metodë
$client->raw është transporti përmes të cilit kalon çdo metodë. $client->raw->request() thërret një shteg që ende nuk e mbështjell asnjë metodë, duke zbatuar kredencialin, URL-në bazë, afatin e skadimit dhe politikën e riprovimit të klientit, dhe kthen trupin e dekoduar ashtu si një metodë.
$ping = $client->raw->request('/ping'); $label = $client->raw->request('/labels', method: 'POST', body: ['name' => 'Invoices']); var_dump($ping, $label);| Argumenti me emër | Çfarë bën |
|---|---|
| method: | GET, përveç nëse thoni ndryshe: POST, PUT, PATCH ose DELETE. |
| query: | Një array parametrash query. Vlerat null dhe ato bosh lihen jashtë, një listë bashkohet me presje, dhe një DateTimeInterface dërgohet si një çast ISO 8601 në UTC. |
| body: | Një array, i dërguar si JSON. |
| raw: dhe contentType: | Bajte për t’u dërguar ashtu siç janë, si string, burim stream-i, SplFileInfo ose stream PSR-7, me application/octet-stream përveç nëse emërtoni një tip. |
| accept: dhe binary: | Një accept: tjetër nga JSON e kthen trupin si tekst, ndërsa binary: true e kthen si string bajtesh. |
| idempotent: dhe idempotencyKey: | idempotent: true bashkëngjit një Idempotency-Key, të gjeneruar përveç nëse jepni tuajin. |
| repeatable: | Nëse një dështim riprovohet. Riprovohet vetëm një GET, përveç nëse jepni repeatable: true. |
| anonymous: | true nuk dërgon fare kredencial. |
| apiKey:, inboxToken: dhe timeout: | Të njëjtat kredenciale për thirrje dhe një afat skadimi në sekonda vetëm për këtë thirrje. |
Shtegu duhet të fillojë me një / të vetme, dhe një shteg URL-ja përfundimtare e të cilit do të dilte nga origjina e URL-së bazë hedh InvalidArgumentException para se të dërgohet çfarëdo, ndaj kredenciali nuk arrin kurrë te një host tjetër.
Kuti të përkohshme
OpenEmail::createTempMail() ndërton një klient për kutitë e përkohshme që nuk mban çelës API dhe nuk lexon asnjë nga mjedisi. Krijon kuti në mënyrë anonime, dhe çdo lexim dërgon tokenin e kutisë që ktheu create, ose atë më të riun që ktheu extend, qoftë në çdo thirrje si inboxToken:, qoftë një herë si OpenEmail::createTempMail(inboxToken: ...).
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() merr baseUrl:, httpClient:, maxRetries:, timeout:, userAgent:, headers: dhe disableUpdateNotice: si çdo klient, dhe lexon OPENEMAIL_BASE_URL kur nuk jepni URL bazë.
Tokenat e qasjes OAuth
Një aplikacion që një person e lidhi përmes OAuth, si një mjet i rreshtit të komandave ose një agjent, mban një token qasjeje në vend të një çelësi API. Jepeni si accessToken:, qoftë vetë tokenin, qoftë një objekt të thirrshëm që e kthen atë, si një closure ose një first-class callable. Objekti i thirrshëm ekzekutohet një herë për çdo thirrje, dhe riprovat e asaj thirrjeje ripërdorin atë që ktheu, ndaj rinovojeni tokenin brenda tij kur i afrohet skadimi, dhe klienti nuk ka nevojë të rindërtohet kurrë.
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;}| Rasti | Çfarë ndodh |
|---|---|
| apiKey: dhe accessToken: bashkë, ose asnjëri | Klienti hedh InvalidArgumentException kur ndërtohet. Kur nuk ka asnjërin, mesazhi përmend OPENEMAIL_API_KEY dhe OPENEMAIL_ACCESS_TOKEN. |
| Një vlerë që nuk është token | Një token ka nga 1 deri në 512 karaktere dhe nuk fillon me oe_; këtë kontroll e bën OpenEmail::isAccessToken(). Një string që nuk e kalon refuzohet kur ndërtohet klienti, dhe një objekt i thirrshëm që kthen një të tillë bën që thirrja të hedhë InvalidArgumentException para se të dërgohet çfarëdo. |
| OPENEMAIL_ACCESS_TOKEN | Lexohet kur nuk jepni asnjë kredencial dhe OPENEMAIL_API_KEY nuk është vendosur, ndaj një çelës në mjedis ka përparësi. |
| Një objekt i thirrshëm që hedh përjashtim | Thirrja e hedh atë përjashtim të pandryshuar dhe nuk dërgohet asgjë. |
| Një apiKey: për thirrje | Zëvendëson tokenin vetëm për atë kërkesë, dhe objekti i thirrshëm nuk thirret. |
| $client->mode | Gjithmonë live me një token. |
| OpenEmail::createTempMail() | Nuk dërgon asnjë kredencial, çfarëdo që të ketë mjedisi. |
| me->get() dhe me->ping() | Për një token, get përgjigjet me object të barabartë me oauth_token, id dhe roleId null, clientId e aplikacionit të lidhur dhe expiresAt, kur skadon miratimi që personi i ka dhënë aplikacionit. ping përgjigjet me kind të barabartë me oauth, keyId null dhe clientId. Kontrolloni object ose kind para se të lexoni id ose keyId. |
Një token vepron për një person dhe lexon postën e tij ashtu siç mund ta lexojë ai, ndaj mbajeni në një server si një çelës.
Kodet e verifikimit
Para një ndryshimi të ndjeshëm, si fshirja e një domeni ose ndryshimi i një webhook-u, API-ja i kërkon një tokeni qasjeje kodin e verifikimit që aplikacioni web do t’ia kërkonte personit. Thirrja hedh një PermissionException, një 403 me isStepUpRequired() true, dhe asgjë nuk ndryshoi. Kërkoni një kod, verifikoni atë që ju jep personi, pastaj bëjeni thirrjen sërish. Një çelësi API nuk i kërkohet kurrë.
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);}| Metoda | Çfarë bën |
|---|---|
| security->stepUpStatus() | Nëse aplikacioni është i verifikuar tani (elevated, elevatedUntil), si kontrollohet kodi i radhës (method, email ose totp), dhe minutes, gjatësia e dritares. Nuk dërgon asgjë dhe nuk raporton një ndalesë. |
| security->beginStepUp() | Hap një sfidë verifikimi. Me email një kod gjashtëshifror shkon te adresa me të cilën personi hyn, dhe sentTo e tregon atë të maskuar. Me totp personi e lexon kodin nga aplikacioni i tij i autentikimit ose përdor një kod rezervë. Një sfidë që është ende e hapur dhe ka përpjekje të mbetura ripërdoret përveç nëse jepni ['resend' => true], ndërsa një sfidë e bllokuar ose e skaduar zëvendësohet nga një thirrje e zakonshme. Çdo aplikacion mund të hapë 5 në orë dhe 20 në 24 orë për çdo person, dhe e radhësja hedh një 429 step_up_throttled. |
| security->verifyStepUp(['code' => ...]) | Kontrollon kodin dhe zhbllokon ndryshimet e ndjeshme për këtë aplikacion për 60 minuta, deri në elevatedUntil, përmes REST dhe përmes mjeteve MCP që bëjnë të njëjtat ndryshime. Pas 10 kodeve të gabuara në 24 orë nga ky aplikacion, ose 20 nga të gjitha aplikacionet e personit bashkë, kjo thirrje dhe beginStepUp hedhin një 429 step_up_locked me një mesazh që thotë kur rifillon verifikimi. |
Klienti nuk kërkon kurrë vetë një kod dhe nuk e përsërit vetë thirrjen, dhe asnjë nga tri metodat nuk riprovohet automatikisht, sepse një riprovim pas një përgjigjeje të humbur mund të dërgonte një email të dytë ose të harxhonte një përpjekje të dytë. Nuk kërkojnë fushë, dhe një çelës API që thërret njërën prej tyre merr një 400 step_up_not_applicable. OpenEmail\Constants\StepUpErrorCodes emërton çdo mënyrë si mund të dështojë një verifikim, dhe faqja e gabimeve të API-së thotë çfarë të bëni për secilën.
Njoftimi për përditësim
Kur në Packagist ka një version më të ri të paketës, klienti e thotë këtë një herë për proces, në daljen standarde të gabimeve, me një rresht si ℹ openemail/sdk 0.0.2 is available, you are on 0.0.1. të ndjekur nga faqja e paketës. Kontrolli ekzekutohet vetëm në rreshtin e komandave, kur dalja standarde është një terminal, dhe kurrë nën një server web. Nis kur ndërtohet klienti i parë dhe ecën krahas kërkesave tuaja, dhe në fund të skriptit pret sa ka mbetur nga një buxhet prej dy sekondash. Një dështim për të arritur Packagist shpërfillet.
Kontrolli bën kërkesën e vet me cURL, jashtë httpClient: të klientit, ndaj një klient HTTP imitim në test nuk e sheh kurrë. Jepni disableUpdateNotice: true ose vendosni OPENEMAIL_DISABLE_UPDATE_NOTICE për ta çaktivizuar.
Proxy-t dhe TLS
CurlHttpClient i parazgjedhur ia lë proxy-t cURL-it, i cili lexon https_proxy ose HTTPS_PROXY për proxy-n dhe no_proxy ose NO_PROXY për hostet që lidhen drejtpërdrejt. Jepni proxy: për ta emërtuar një në kod. Emri i përdoruesit dhe fjalëkalimi në URL-në e proxy-t i dërgohen proxy-t.
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],));Lidhjet përdorin TLS 1.2 ose më të ri dhe kontrollojnë certifikatën dhe emrin e hostit të serverit, dhe ridrejtimet nuk ndiqen kurrë. caBundle: emërton autoritetet e certifikimit që duhen besuar, për një proxy që inspekton TLS-në. curlOptions: vendos çdo opsion tjetër të cURL, por cilësimet që i duhen një kërkese kanë gjithmonë përparësi: URL-ja dhe porta e saj, metoda, header-at, trupi dhe ridrejtimet e çaktivizuara. CURLOPT_REQUEST_TARGET refuzohet, dhe një opsion që cURL nuk e pranon hedh një InvalidArgumentException që e emërton.