दस्तावेज़ पर जाएँ
PHP

कॉन्फ़िगरेशन

क्लाइंट कैसे बनाएँ, हर option, और रिक्वेस्ट भेजे जाने से पहले वह क्या अस्वीकार करता है।

विकल्प

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;
प्रवेश बिंदुयह आपको क्या देता है
new OpenEmail(...)आपके पास किए गए named आर्ग्युमेंट से बना एक क्लाइंट। जो कुछ आप छोड़ देते हैं वह एनवायरनमेंट से पढ़ा जाता है: जब आप कोई क्रेडेंशियल पास नहीं करते तो कुंजी OPENEMAIL_API_KEY से या टोकन OPENEMAIL_ACCESS_TOKEN से, और जब आप base URL पास नहीं करते तो वह OPENEMAIL_BASE_URL से।
OpenEmail::createClient(...)new OpenEmail(...) जैसा ही क्लाइंट, उस कोड के लिए जो factory कॉल करना पसंद करता है।
OpenEmail::init(...)एक क्लाइंट बनाता है, उसे साझा क्लाइंट के रूप में रखता है और उसे लौटाता है। यह वही named आर्ग्युमेंट लेता है।
OpenEmail::getClient()प्रोसेस में कहीं से भी साझा क्लाइंट। init से पहले कॉल करने पर यह पहली कॉल पर एनवायरनमेंट से एक क्लाइंट बना लेता है।
OpenEmail::resetClient()साझा क्लाइंट को हटा देता है, ताकि अगला getClient() एक नया क्लाइंट बनाए, जो टेस्ट के मामलों के बीच चाहिए होता है।

getenv() को string में cast करना जानबूझकर है। जो वेरिएबल सेट नहीं है वह एक ख़ाली कुंजी बन जाता है, जिसे क्लाइंट ज़रूरी वेरिएबल का नाम बताने वाले संदेश के साथ अस्वीकार करता है, जबकि null चुपचाप OPENEMAIL_API_KEY पर लौट जाता।

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,);
विकल्पडिफ़ॉल्टटिप्पणियाँ
apiKey:OPENEMAIL_API_KEYoe_live_ या oe_test_ से शुरू होनी चाहिए। एनवायरनमेंट से तभी पढ़ी जाती है जब आप न apiKey: पास करते हैं और न accessToken:।
accessToken:OPENEMAIL_ACCESS_TOKENएक OAuth access टोकन, या ऐसा callable जो उसे लौटाए। नीचे “OAuth access टोकन” देखें। कुंजी या टोकन में से एक पास करें, दोनों कभी नहीं।
baseUrl:https://api.openemail.ukया OPENEMAIL_BASE_URL। अंत के slash हटा दिए जाते हैं, और सिर्फ़ होस्ट के आगे https:// लगता है, या इस मशीन के होस्ट (localhost, 127.x.x.x पता या ::1) के आगे http://। किसी दूसरे होस्ट को क्रेडेंशियल कभी सादे http पर नहीं भेजा जाता, और क्लाइंट बनते समय 0.0.0.0 या [::] अस्वीकार कर दिया जाता है, क्योंकि ये वे पते हैं जिन पर सर्वर सुनता है, न कि जिन पर रिक्वेस्ट भेजी जाती हैं।
timeout:30प्रति कॉल नहीं, प्रति प्रयास सेकंड, जिसमें जुड़ना और पूरा जवाब पढ़ना शामिल है। 0 इसे बंद कर देता है। files->upload कम से कम 600 सेकंड इंतज़ार करता है, जब तक आप उस कॉल पर timeout: पास न करें।
maxRetries:2पहली कोशिश के बाद के अतिरिक्त प्रयास, उन कॉलों पर जिन्हें दोहराना सुरक्षित है। यह क्लाइंट पर सेट होता है, प्रति कॉल नहीं। 0 पुनः प्रयास बंद कर देता है।
httpClient:CurlHttpClientHTTP परत: कोई भी चीज़ जो OpenEmail\Http\HttpClient को implement करे, जैसे Guzzle या Symfony HttpClient के चारों ओर Psr18HttpClient, या टेस्ट में एक नकली क्लाइंट। HTTP क्लाइंट वाला पेज हर एक को समझाता है।
headers:[]हर रिक्वेस्ट पर भेजा जाता है।
userAgent:openemail-php/<version>हर रिक्वेस्ट पर भेजा जाता है।
disableUpdateNotice:falsePackagist पर नए संस्करण के लिए प्रति प्रोसेस एक बार होने वाली जाँच को छोड़ देता है। जाँच सिर्फ़ कमांड लाइन पर चलती है जब standard output एक टर्मिनल हो, और OPENEMAIL_DISABLE_UPDATE_NOTICE भी इसे बंद कर देता है।

एनवायरनमेंट वेरिएबल

वेरिएबलयह क्या करता है
OPENEMAIL_API_KEYवह कुंजी जिसे क्लाइंट तब इस्तेमाल करता है जब आप न apiKey: पास करते हैं और न accessToken:।
OPENEMAIL_ACCESS_TOKENएक OAuth एक्सेस टोकन, जिसे सिर्फ़ तब पढ़ा जाता है जब आप दोनों में से कोई क्रेडेंशियल नहीं देते और OPENEMAIL_API_KEY सेट नहीं है, यानी एनवायरनमेंट में मौजूद कुंजी को प्राथमिकता मिलती है।
OPENEMAIL_BASE_URLबेस URL, जब आप कोई नहीं देते। localhost:2222 जैसे सादे होस्ट में उसकी scheme जोड़ दी जाती है।
OPENEMAIL_DISABLE_UPDATE_NOTICEकोई भी ग़ैर-ख़ाली मान प्रोसेस के हर क्लाइंट के लिए अपडेट सूचना बंद कर देता है।
HTTPS_PROXY और NO_PROXY, या https_proxy और no_proxyवह प्रॉक्सी जिसके ज़रिए cURL जुड़ता है, और वे होस्ट जो सीधे जुड़ते हैं। नीचे “प्रॉक्सी और TLS” देखें।

हर वेरिएबल पहले getenv() से पढ़ा जाता है, फिर $_SERVER और $_ENV से, इसलिए आपके फ़्रेमवर्क द्वारा किसी .env फ़ाइल से लोड किया गया मान भी गिना जाता है। जो वेरिएबल सेट है पर ख़ाली है, उसे सेट नहीं माना जाता।

भेजने से पहले यह क्या अस्वीकार करता है

ये आपके पहले send पर किसी उलझाऊ विफलता के रूप में सामने आने के बजाय उसी पंक्ति से OpenEmail\Exception\InvalidArgumentException throw करते हैं जिसमें ग़लत मान था। संदेश बताता है कि क्या ग़लत था और उसकी जगह क्या पास करना है, और वह कभी कोई क्रेडेंशियल नहीं दोहराता।

अस्वीकृतक्यों
कोई क्रेडेंशियल ही नहींन apiKey: पास किया गया और न accessToken:, और कोई भी वेरिएबल सेट नहीं था, इसलिए प्रमाणित करने के लिए कुछ नहीं है। क्लाइंट बनते समय throw होता है।
एक कुंजी और एक टोकन एक साथहर रिक्वेस्ट एक ही क्रेडेंशियल ले जाती है, इसलिए क्लाइंट यह नहीं बता सकता कि आपका मतलब कौन-सा था।
सेशन कुकी, सेशन टोकन या किसी दूसरी सेवा की कुंजीयहाँ केवल oe_live_ और oe_test_ ही प्रमाणित होते हैं, और API भी यही कहता है। यह जाँच सिर्फ़ prefix देखती है, इससे ज़्यादा कुछ नहीं, इसलिए रद्द की गई कुंजी फिर भी नेटवर्क पर जाकर ही विफल होती है, AuthenticationException के रूप में।
ऐसा baseUrl: जो http या https URL नहीं है, या जिसमें यूज़र नाम या पासवर्ड होकिसी और चीज़ तक पहुँचा नहीं जा सकता, और क्रेडेंशियल की जगह apiKey: या accessToken: में है, URL में नहीं। क्लाइंट बनते समय throw होता है।
सादे http पर ऐसे होस्ट को क्रेडेंशियल जो इस मशीन पर नहीं हैकुछ भी भेजे जाने से पहले कॉल ही इसे throw करती है। https वाला बेस URL इस्तेमाल करें।
ऋणात्मक timeout:सेकंड पास करें, या टाइमआउट न चाहिए तो 0। क्लाइंट बनते समय throw होता है, या किसी एक कॉल को पास किए गए टाइमआउट के लिए उसी कॉल से।
ऐसा हेडर नाम जो HTTP token नहीं है, या हेडर मान में लाइन ब्रेक या कोई दूसरा control characterheaders:, userAgent: और idempotencyKey: में जाँचा जाता है, क्योंकि लाइन ब्रेक एक दूसरा हेडर शुरू कर देता। मान के आगे-पीछे के स्पेस, टैब और लाइन ब्रेक पहले हटा दिए जाते हैं, जैसे fetch हटाता है, इसलिए newline पर ख़त्म होने वाली फ़ाइल से पढ़ी गई key भी काम करती है।
किसी भी method पर खाली या सिर्फ़ बिंदुओं वाला idमेथड कॉल होते ही throw होता है। सिर्फ़ बिंदुओं वाले path segment को हर URL parser हटा देता है, इसलिए रिक्वेस्ट किसी दूसरे endpoint पर पहुँच जाती। जो id वैध UTF-8 नहीं है, उसे भी अस्वीकार किया जाता है।
अटैचमेंट की ऐसी सामग्री जो base64 नहीं हैस्ट्रिंग को हमेशा base64 के रूप में पढ़ा जाता है, इसलिए उसमें रखे कच्चे बाइट्स बेकार डेटा के रूप में भेजे जाते। उन्हें OpenEmail::toBase64() से encode करें, या SplFileInfo, एक stream या PSR-7 stream पास करें और क्लाइंट उसे encode कर देगा।

यह क्लास PHP की अपनी InvalidArgumentException को extend करती है, इसलिए जो कोड पहले से उसे catch करता है वह काम करता रहता है, और पैकेज द्वारा throw होने वाले हर दूसरे exception की तरह यह OpenEmail\Exception\OpenEmailException को implement करती है। ग़लत टाइप का मान, जैसे जहाँ string id चाहिए वहाँ कोई संख्या, ख़ुद PHP का TypeError होता है, क्योंकि हर मेथड अपने टाइप घोषित करता है।

कोई testMode: option नहीं है और न कभी होगा। कुंजी की योजना संकेत नहीं, बल्कि क्रेडेंशियल का हिस्सा है, इसलिए मोड कुंजी का गुण है। $client->mode prefix पढ़ता है, live या test, और कुछ तय नहीं करता।

एक क्लाइंट, कई कुंजियाँ

क्लाइंट एक बार बनाइए और उसी को साझा कीजिए। हर रिक्वेस्ट पर नया क्लाइंट अपना खुला कनेक्शन बेवजह फेंक देता है, और उस पर रखी कोई भी स्थिति प्रति-कॉलर नहीं होती।

जिस स्थिति में वरना हर कुंजी के लिए एक क्लाइंट बनाना पड़ता, जैसे कई वर्कस्पेस की ओर से भेजने वाला कोई जॉब, वहाँ कॉल पर ही apiKey: पास करें। यह उस रिक्वेस्ट के लिए Authorization हेडर बदल देता है और क्लाइंट पर कुछ भी पीछे नहीं छोड़ता।

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);

tempMail के बाहर का हर मेथड इसे अपने आख़िरी named आर्ग्युमेंट के रूप में लेता है, सूची में फ़िल्टरों के बाद, और tempMail के मेथड इसकी जगह inboxToken: लेते हैं। रिक्वेस्ट भेजे जाने से पहले इसे उसी नियम से जाँचा जाता है जो क्लाइंट इस्तेमाल करता है, इसलिए टाइपो होने पर किसी ऐसे क्रेडेंशियल के बारे में 401 के बजाय, जिसे फिर आपको ढूँढना पड़े, इस कॉल को पास की गई apiKey के बारे में InvalidArgumentException throw होता है। retry की गई कॉल वही कुंजी रखती है जो उसे दी गई थी।

$client->mode उस कुंजी का वर्णन करता है जिससे क्लाइंट “बनाया” गया था और override का पालन नहीं करता। जब एक क्लाइंट कई कुंजियों के लिए काम करता है तो बताने के लिए कोई एक मोड नहीं होता, इसलिए इसे पास की गई कुंजी से पढ़ें। var_dump($client) मोड और बेस URL दिखाता है, कुंजी कभी नहीं, और क्रेडेंशियल लेने वाले हर पैरामीटर पर #[\SensitiveParameter] लगा है, इसलिए stack trace उसकी जगह एक placeholder छापता है।

ऐसे endpoints जिन्हें कोई मेथड नहीं लपेटता

$client->raw वह transport है जिससे हर मेथड गुज़रता है। $client->raw->request() ऐसे path को कॉल करता है जिसे अभी कोई मेथड नहीं लपेटता, क्लाइंट के क्रेडेंशियल, बेस URL, टाइमआउट और retry नीति को लागू करते हुए, और डिकोड की गई बॉडी उसी तरह लौटाता है जैसे कोई मेथड लौटाता है।

raw_request.php
$ping = $client->raw->request('/ping'); $label = $client->raw->request('/labels', method: 'POST', body: ['name' => 'Invoices']); var_dump($ping, $label);
Named आर्ग्युमेंटयह क्या करता है
method:GET, जब तक आप कुछ और न कहें: POST, PUT, PATCH या DELETE।
query:query पैरामीटर का एक array। null और ख़ाली मान छोड़ दिए जाते हैं, सूची को कॉमा से जोड़ा जाता है, और DateTimeInterface को UTC में ISO 8601 क्षण के रूप में भेजा जाता है।
body:एक array, जो JSON के रूप में भेजा जाता है।
raw: और contentType:जैसे हैं वैसे भेजे जाने वाले बाइट्स, स्ट्रिंग, stream resource, SplFileInfo या PSR-7 stream के रूप में, application/octet-stream के साथ जब तक आप कोई टाइप न बताएँ।
accept: और binary:JSON के अलावा कोई accept: बॉडी को टेक्स्ट के रूप में लौटाता है, और binary: true उसे बाइट्स की स्ट्रिंग के रूप में लौटाता है।
idempotent: और idempotencyKey:idempotent: true एक Idempotency-Key जोड़ता है, जो तब बनाई जाती है जब आप अपनी न दें।
repeatable:क्या किसी विफलता पर पुनः प्रयास होता है। सिर्फ़ GET पर होता है, जब तक आप repeatable: true पास न करें।
anonymous:true होने पर कोई भी क्रेडेंशियल नहीं भेजा जाता।
apiKey:, inboxToken: और timeout:वही प्रति-कॉल क्रेडेंशियल, और सिर्फ़ इसी कॉल के लिए सेकंड में एक टाइमआउट।

path एक अकेले / से शुरू होना चाहिए, और ऐसा path जिसका पूरा बना URL बेस URL के origin से बाहर चला जाए, कुछ भी भेजे जाने से पहले InvalidArgumentException throw करता है, ताकि क्रेडेंशियल कभी किसी दूसरे होस्ट तक न पहुँचे।

डिस्पोज़ेबल इनबॉक्स

OpenEmail::createTempMail() डिस्पोज़ेबल इनबॉक्स के लिए ऐसा क्लाइंट बनाता है जो कोई API कुंजी नहीं रखता और एनवायरनमेंट से भी कोई नहीं पढ़ता। यह गुमनाम रूप से इनबॉक्स बनाता है, और हर पढ़ाई वह इनबॉक्स टोकन भेजती है जो create ने लौटाया था, या वह नया टोकन जो extend ने लौटाया, या तो प्रति कॉल inboxToken: के रूप में या एक बार 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() किसी भी क्लाइंट की तरह baseUrl:, httpClient:, maxRetries:, timeout:, userAgent:, headers: और disableUpdateNotice: लेता है, और जब आप कोई बेस URL नहीं देते तो OPENEMAIL_BASE_URL पढ़ता है।

OAuth एक्सेस टोकन

किसी व्यक्ति द्वारा OAuth से जोड़ा गया ऐप, जैसे कोई कमांड लाइन टूल या एजेंट, API कुंजी के बजाय एक access टोकन रखता है। इसे accessToken: के रूप में पास करें, या तो ख़ुद टोकन या उसे लौटाने वाला callable, जैसे कोई closure या first-class callable। callable हर कॉल के लिए एक बार चलता है, और उस कॉल के retry उसी का लौटाया मान दोबारा इस्तेमाल करते हैं, इसलिए टोकन की समय-सीमा पास आने पर उसके अंदर ही उसे नया करें, और क्लाइंट को कभी दोबारा बनाने की ज़रूरत नहीं पड़ती।

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;}
स्थितिक्या होता है
apiKey: और accessToken: एक साथ, या दोनों में से कोई नहींक्लाइंट बनते समय InvalidArgumentException throw करता है। दोनों में से कोई न हो तो संदेश OPENEMAIL_API_KEY और OPENEMAIL_ACCESS_TOKEN का नाम लेता है।
ऐसा मान जो टोकन नहीं हैटोकन 1 से 512 अक्षरों का होता है और oe_ से शुरू नहीं होता, यही जाँच OpenEmail::isAccessToken() करता है। इसमें विफल स्ट्रिंग क्लाइंट बनते समय अस्वीकार कर दी जाती है, और ऐसा मान लौटाने वाला callable कुछ भी भेजे जाने से पहले कॉल से InvalidArgumentException throw करवाता है।
OPENEMAIL_ACCESS_TOKENजब आप दोनों में से कोई क्रेडेंशियल नहीं देते और OPENEMAIL_API_KEY सेट नहीं है, तब इसे पढ़ा जाता है, यानी एनवायरनमेंट में मौजूद कुंजी को प्राथमिकता मिलती है।
ऐसा callable जो throw करेकॉल वही exception, बिना बदले, throw करती है, और कुछ नहीं भेजा जाता।
प्रति-कॉल apiKey:सिर्फ़ उस एक रिक्वेस्ट के लिए टोकन की जगह लेता है, और callable नहीं चलता।
$client->modeटोकन के साथ हमेशा live।
OpenEmail::createTempMail()वातावरण में जो भी हो, कोई क्रेडेंशियल नहीं भेजता।
me->get() और me->ping()टोकन के लिए, get ऐसा जवाब देता है जिसमें object का मान oauth_token होता है, id और roleId null होते हैं, जुड़े हुए ऐप का clientId होता है, और expiresAt होता है, यानी वह समय जब व्यक्ति की ऐप के लिए दी गई स्वीकृति समाप्त होती है। ping ऐसा जवाब देता है जिसमें kind का मान oauth, keyId null और clientId होता है। id या keyId पढ़ने से पहले object या kind जाँचें।

टोकन किसी व्यक्ति की ओर से काम करता है और उसका मेल वैसे ही पढ़ता है जैसे वह ख़ुद पढ़ सकता है, इसलिए इसे कुंजी की तरह सर्वर पर ही रखें।

सत्यापन कोड

किसी संवेदनशील बदलाव से पहले, जैसे कोई डोमेन हटाना या कोई वेबहुक बदलना, API access टोकन से वही सत्यापन कोड माँगता है जो वेब ऐप व्यक्ति से माँगता। कॉल एक PermissionException throw करती है, एक 403 जिसका isStepUpRequired() true होता है, और कुछ भी नहीं बदला गया। कोड माँगें, व्यक्ति जो कोड दे उसे सत्यापित करें, फिर कॉल दोबारा करें। API कुंजी से कभी कोड नहीं माँगा जाता।

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);}
मेथडयह क्या करता है
security->stepUpStatus()ऐप अभी सत्यापित है या नहीं (elevated, elevatedUntil), अगला कोड कैसे जाँचा जाएगा (method, email या totp), और minutes, यानी अवधि की लंबाई। यह कुछ नहीं भेजता और रोक की जानकारी नहीं देता।
security->beginStepUp()एक challenge खोलता है। email के साथ, छह अंकों का कोड उस पते पर जाता है जिससे व्यक्ति साइन इन करता है, और sentTo उसे छिपाकर दिखाता है। totp के साथ, व्यक्ति अपने authenticator ऐप से कोड पढ़ता है या कोई बैकअप कोड इस्तेमाल करता है। जो challenge अभी खुला है और जिसमें प्रयास बचे हैं, उसे दोबारा इस्तेमाल किया जाता है जब तक आप ['resend' => true] पास न करें, और लॉक या समाप्त हो चुके challenge को सामान्य कॉल से बदल दिया जाता है। हर ऐप हर व्यक्ति के लिए एक घंटे में 5 और 24 घंटे में 20 challenge खोल सकता है, और उसके बाद वाला 429 step_up_throttled throw करता है।
security->verifyStepUp(['code' => ...])कोड जाँचता है और इस ऐप के लिए संवेदनशील बदलावों को 60 मिनट के लिए, elevatedUntil तक, REST पर और वही बदलाव करने वाले MCP टूल के ज़रिए खोल देता है। इस ऐप से 24 घंटे में 10 ग़लत कोड, या व्यक्ति के सभी ऐप से मिलाकर 20 ग़लत कोड के बाद, यह कॉल और beginStepUp एक 429 step_up_locked throw करते हैं, जिसके संदेश में बताया जाता है कि सत्यापन कब फिर शुरू होगा।

क्लाइंट ख़ुद कभी कोड नहीं माँगता और न कॉल दोहराता है, और तीनों में से कोई मेथड अपने-आप दोबारा नहीं आज़माया जाता, क्योंकि खोए जवाब के बाद दोबारा कोशिश दूसरा ईमेल भेज सकती है या दूसरी कोशिश ख़र्च कर सकती है। इन्हें scope की ज़रूरत नहीं, और इनमें से किसी को कॉल करने वाली API कुंजी को 400 step_up_not_applicable मिलता है। OpenEmail\Constants\StepUpErrorCodes हर उस तरीके का नाम लेता है जिससे सत्यापन विफल हो सकता है, और API त्रुटियों वाला पेज बताता है कि हर एक पर क्या करना है।

अपडेट सूचना

जब Packagist पर पैकेज का नया संस्करण होता है, तो क्लाइंट प्रति प्रोसेस एक बार standard error पर यह बताता है, ℹ openemail/sdk 0.0.2 is available, you are on 0.0.1. जैसी एक पंक्ति के रूप में, जिसके बाद पैकेज का पेज आता है। जाँच सिर्फ़ कमांड लाइन पर चलती है, जब standard output एक टर्मिनल हो, और वेब सर्वर के अंतर्गत कभी नहीं। यह पहला क्लाइंट बनते समय शुरू होती है और आपकी रिक्वेस्ट के साथ-साथ चलती है, और स्क्रिप्ट के अंत में दो सेकंड के बजट में से जो बचा हो उतना इंतज़ार करती है। Packagist तक न पहुँच पाने को अनदेखा किया जाता है।

यह जाँच क्लाइंट के httpClient: के बाहर cURL से अपनी रिक्वेस्ट करती है, इसलिए टेस्ट में नकली HTTP क्लाइंट उसे कभी नहीं देखता। इसे बंद करने के लिए disableUpdateNotice: true पास करें या OPENEMAIL_DISABLE_UPDATE_NOTICE सेट करें।

प्रॉक्सी और TLS

डिफ़ॉल्ट CurlHttpClient प्रॉक्सी का काम cURL पर छोड़ देता है, जो प्रॉक्सी के लिए https_proxy या HTTPS_PROXY पढ़ता है और सीधे जुड़ने वाले होस्ट के लिए no_proxy या NO_PROXY। इसके बजाय कोड में प्रॉक्सी बताने के लिए proxy: पास करें। प्रॉक्सी URL में यूज़र नाम और पासवर्ड प्रॉक्सी को भेजे जाते हैं।

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],));

कनेक्शन TLS 1.2 या उसके बाद का इस्तेमाल करते हैं और सर्वर का सर्टिफ़िकेट और होस्ट नाम जाँचते हैं, और redirect का कभी पालन नहीं किया जाता। caBundle: भरोसा किए जाने वाले certificate authorities बताता है, ऐसे प्रॉक्सी के लिए जो TLS की जाँच करता है। curlOptions: कोई भी दूसरा cURL option सेट करता है, लेकिन रिक्वेस्ट के लिए ज़रूरी सेटिंग्स को हमेशा प्राथमिकता मिलती है: URL और उसका पोर्ट, मेथड, हेडर, बॉडी और बंद रहने वाले redirect। CURLOPT_REQUEST_TARGET अस्वीकार किया जाता है, और जिस option को cURL स्वीकार नहीं करता वह उसका नाम बताते हुए InvalidArgumentException throw करता है।