Bisedat
`threads->list`, `listAll`, `iterate`, `get`, `update`, `trash`, `snooze`, `unsnooze` dhe `listAttachments`.
Leximi
$page = $client->threads->list( folder: 'inbox', query: 'from:ada', labelIds: ['INBOX', 'IMPORTANT'], limit: 25,); if ($page->nextCursor !== null) { $nextPage = $client->threads->list(folder: 'inbox', cursor: $page->nextCursor); echo count($nextPage), PHP_EOL;} $thread = $client->threads->get('CAHk7pQ2x9LmZ4-mail.example.com');echo $thread['messageCount'], ' ', $thread['hasUnread'] ? 'unread' : 'read', ' ', $thread['totalReplies'], PHP_EOL;API-ja i faqos thread-et me një pageToken. Klienti jua jep si nextCursor dhe e merr prapë si cursor:, si çdo listë tjetër, ndërsa listAll dhe iterate e ndjekin për ju. Është i errët: ktheni atë që ju u dha dhe mos ndërtoni kurrë një të tillë.
Filtrat e listës janë argumente me emër (labelIds:, dateFrom:), ndërsa fushat e trupit të një kërkese janë çelësa array-i me emrat e API-së (addLabelIds te update). Një thread kthehet si array me çelësa në camelCase, ndaj $thread['messageCount'] lexon numrin.
use OpenEmail\Constants\ThreadSorts; $lastWeek = $client->threads->listAll( sort: ThreadSorts::OLDEST, dateFrom: new \DateTimeImmutable('-7 days'), dateTo: new \DateTimeImmutable(), fromContacts: true,);echo count($lastWeek), PHP_EOL; foreach ($client->threads->iterate(sort: ThreadSorts::SENDER) as $thread) { echo $thread['id'], PHP_EOL;}sort:, dateFrom:, dateTo: dhe fromContacts: janë kontrollet e vetë listës së thread-eve. sort: është newest, oldest, sender ose subject, dhe OpenEmail\Constants\ThreadSorts i emërton. Datat marrin një DateTimeInterface, që dërgohet si çast në UTC, ose një string ISO 8601 me orë dhe zhvendosje, dhe të dy skajet përfshihen. Një string date pa orë refuzohet me një 422. fromContacts: true mban postën, mesazhi më i ri i së cilës erdhi nga një kontakt i ruajtur. Çdo renditje faqoset deri në fund pa kapërcyer apo përsëritur asnjë thread.
listAll kthen një array të vetëm sapo të ketë mbërritur faqja e fundit. iterate kthen një Generator që jep çdo thread dhe e merr faqen e radhës vetëm kur cikli ka nevojë për të, ndaj një break i ndalon kërkesat sapo të keni atë që ju duhet.
Organizimi
$threadId = 'CAHk7pQ2x9LmZ4-mail.example.com'; $client->threads->update($threadId, ['read' => true, 'addLabelIds' => ['USER_DONE'], 'removeLabelIds' => ['INBOX']]); $client->threads->trash($threadId);$client->threads->snooze($threadId, new \DateTimeImmutable('+1 day'));$client->threads->unsnooze($threadId);Gjendja e leximit është një etiketë në çdo backend këtu, ndaj udhëton me listat e etiketave, dhe rendi është i fiksuar kur vendosni të dyja: heqjet zbatohen para shtimeve, ndaj një id që gjendet në të dyja listat përfundon te thread-i. Duhet të jetë e pranishme të paktën njëra nga tri fushat.
addLabelIds merr id nga labels->list dhe id-të e sistemit si ARCHIVE dhe STARRED. Një id që nuk emërton asnjë etiketë refuzohet me një 422 label_not_found në vend që të krijohet, prandaj krijoni së pari etiketën me labels->create. $client->threads->list(folder: 'USER_DONE') liston çdo thread që mban një etiketë, në cilëndo dosje qoftë.
Bashkëngjitjet e një mesazhi
$files = $client->threads->listAttachments('CAHk7pQ2x9LmZ4-mail.example.com', 'message_4c1b257a'); foreach ($files as $file) { echo $file['filename'], ' ', $file['contentType'], ' ', $file['size'], PHP_EOL; $bytes = base64_decode($file['content'], true); if ($file['content'] !== '' && $bytes !== false) { file_put_contents(basename($file['filename']), $bytes); }}listAttachments kthen një listë array-sh. content është base64, të cilin base64_decode() e kthen sërish në bajte, dhe është string bosh kur bajtet e ruajtura nuk u gjetën, ndaj kontrollojeni para dekodimit. Teksti i shifruar i një mesazhi të enkriptuar është në këtë listë dhe shkarkohet si çdo skedar tjetër. Pjesa e versionit PGP/MIME dhe çdo nënshkrim i shkëputur nuk janë aty. Ato ruajnë vetëm id-të e tyre te encryption.parts dhe asgjë më shumë.
Një mesazh që mbërriti i enkriptuar
Kjo paketë as enkripton, as dekripton. Nuk mund të hapë një mesazh që e enkriptoi dikush tjetër dhe nuk mund të dërgojë një mesazh të enkriptuar. Kërkesa e dërgimit refuzohet nëse mbart një shenjues enkriptimi, sepse një klient pa çelës nuk ka pse të pohojë një të tillë. Çelësat e gjeneruar në aplikacionin OpenEmail jetojnë në shfletuesin që i krijoi dhe nuk mbërrijnë askund këtu. Kur ai shfletues hap një mesazh të vulosur, teksti i qartë mbetet brenda tij, dhe mesazhi i ruajtur që lexon kjo thirrje mbetet tekst i shifruar. Ajo që ju jep threads->get është zarfi, i njohur si i tillë. Një mesazh që mbërriti i mbështjellë me PGP ose S/MIME mbart një array encryption, kështu që një decodedBody bosh pushon së qeni e vetmja gjë që ju jepet. encryption është e vetmja fushë e një mesazhi që API-ja e garanton, sepse është ajo mungesën e së cilës nuk e kaloni dot duke hamendësuar.
use OpenEmail\OpenEmail; $thread = $client->threads->get('CAHk7pQ2x9LmZ4-mail.example.com'); foreach ($thread['messages'] as $message) { if (!isset($message['encryption']) || !OpenEmail::isSealed($message)) { continue; } error_log('cannot read this one: ' . $message['encryption']['format']);}Degëzoni me OpenEmail::isSealed(), kurrë sipas pranisë së fushës. Dy nga pesë formatet, pgp-signed dhe smime-signed, përshkruajnë një trup që mbërriti i hapur përkrah një nënshkrimi të shkëputur, ndaj kushtëzimi sipas pranisë fsheh postë që nuk kishte pse fshihej, dhe përdoruesi as e sheh dot, as e shpjegon dot. OpenEmail::isSealed() ekziston pikërisht për këtë arsye. Serveri e deklaron një herë të vetme bashkësinë e të vulosurave, kopja e paketës gjenerohet nga i njëjti burim, dhe një kopje e tretë e shkruar me dorë është kopja që rrëshqet. OpenEmail\Constants\MessageEncryptionFormats i emërton të pesë formatet.
Mungesa nuk do të thotë tekst i qartë. encryption mungon në çdo mesazh të ruajtur para se të dilte zbulimi, si dhe në çdo gjë që mbërriti në kutinë postare përmes një rruge ku zbuluesi nuk u ekzekutua kurrë. Ajo regjistron faktin që askush nuk shikoi, një fakt për mbulimin tonë e jo për vetë postën, dhe asgjë nuk e mbush atë në mënyrë retroaktive.
Ku ndryshojnë këto nga të tjerat
- Çdo element te
messagesi një thread-i është array-i që ruajti kutia postare, pa një listë të fiksuar fushash, ndaj lexojeni çdo çelës tjetër përveçencryptionme?? null. Të premtoje më shumë do të thoshte që klienti të pohonte një normalizim që nuk e kryen askush.encryptionështë e vetmja fushë që API-ja e garanton gjithsesi, sepse një klient që nuk mund të degëzojë sipas saj e lexon një mesazh të vulosur si një mesazh bosh. - Një kërkesë që nuk mund të shërbehet me besnikëri jep një 422
capability_unsupported, të hedhur siValidationException, dhe jo një përgjigje që duket e saktë, por është në heshtje e gabuar.
Parametrat: threads->list
folderstring- Cila dosje të listohet. Serveri e vendos si parazgjedhje `inbox`, ndaj lënia e saj jashtë e ngushton listimin në vend që ta zgjerojë te gjithçka. Vlen edhe për një kërkim me `query:`, veç nëse vetë pyetja emërton një dosje me `in:` ose me një `is:` dosjeje, si `is:sent`.
querystring- Sintaksa e kërkimit në kutinë postare. Fjalët e thjeshta duhet të shfaqen të gjitha dhe secila përputhet në mënyrë të lirshme: shkronjat e mëdha a të vogla, theksat dhe ndarësit shpërfillen, dhe edhe pjesa e një fjale më të gjatë numërohet, ndaj si `min`, ashtu edhe `ben jamin` e gjejnë “Benjamin”. Një frazë në thonjëza përputhet ashtu siç është shkruar, përveç shkronjave të mëdha a të vogla dhe theksave, ndaj `"ben jamin"` nuk e gjen “Ben-Jamin”, dhe fjalët mbushëse hidhen tej kur mbetet diçka tjetër për të kërkuar. Kur asgjë nuk përputhet saktësisht, kthehen në vend të saj shkrime të afërta, ndaj `benjimin` gjen “Benjamin”: një fjalë e thjeshtë, ose vlera e `from:`, `to:`, `cc:`, `subject:`, `body:`, `filename:` ose `label:`, mund të ndryshojë nga fillimi i një fjale me një gabim shtypi (një shkronjë të ndryshuar, që mungon, të tepërt ose të ndërruar vendi) kur ka katër deri në shtatë shkronja, dhe me dy kur ka tetë ose më shumë. Një frazë në thonjëza, një fjalë me shifër, një fjalë më e shkurtër dhe një fjalë e përjashtuar përputhen ende vetëm saktësisht, dhe faqet që pasojnë vazhdojnë të përputhen në të njëjtën mënyrë. Ngushtojeni me operatorë si `from:ada`, `label:Invoices`, `is:unread`, `has:pdf`, `before:2026/01/31` dhe `older_than:1y`, dhe kombinojini me `OR`, me kllapa dhe me një `-` në fillim. Një vlerë që kërkimi nuk e përdor dot shpërfillet në vend që të ngushtojë. Fjalët dhe operatorët `from:`, `to:`, `cc:`, `subject:` dhe `body:` lexojnë dërguesin, marrësit, subjektin e mesazhit më të fundit dhe 4.000 karakteret e para të trupit të tij me markup-in e hequr, ndërsa `filename:` dhe `has:` lexojnë çdo bashkëngjitje të gjithë bisedës, kurse etiketat dhe dosjet lexojnë gjithë bisedën. Ai ngushton të njëjtin indeks që lexon listimi i pafiltruar. Mesazhet e vulosura nuk ruajnë tekst trupi, ndaj mund të përputhen vetëm dërguesi, marrësit dhe subjekti i tyre. Një fjalë e thjeshtë përputhet edhe me emrin e çdo bashkëngjitjeje në bisedë, cilido qoftë mesazhi që e solli.
labelIdsstring or array- Kufizojeni listimin te thread-et që mbajnë këto etiketa. Endpoint-i merr një string të ndarë me presje, dhe klienti jua bashkon një array në një të tillë. Nuk ka kufi se sa prej tyre emërtoni.
limitint- Sa thread-e të kthehen, nga 1 deri në 100. Kur lihet jashtë, handler-i përdor 25. Parazgjedhja ndodhet te handler-i dhe jo te skema, ndaj një vlerë që mungon dhe një 25 e shprehur sillen njësoj.
cursorstring- `nextCursor` i faqes së mëparshme, i dhënë prapa fjalë për fjalë. Është `pageToken` i API-së me emrin që përdor çdo listë tjetër, dhe është i errët, ndaj mos e ndërtoni dhe mos e ndryshoni kurrë.
Përgjigjja: OpenEmail\Result\Page
itemsarray- Një array për çdo thread në këtë faqe, i nxjerrë nga zarfi `data` i API-së. Secili është vetëm një shenjues `object` dhe një `id`. Listimi nuk mbart subjekt, fragment, pjesëmarrës apo etiketa, ndaj çdo gjë më shumë do të thotë të thirret `threads->get` për thread-et që doni.
items[].idstring- Id-ja e thread-it, e lexuar si `$item['id']`, për t’ua dhënë të pandryshuar `threads->get`, `threads->update` dhe të tjerave. Është e njëjta id, qoftë kur rreshti vjen nga një listim i filtruar, qoftë nga një kërkim me `query:`.
hasMorebool- Nëse ka një faqe tjetër, e marrë nga API-ja kur ajo e deklaron dhe e nxjerrë nga `nextCursor` kur nuk e deklaron.
nextCursorstring or null- `nextPageToken` i API-së, për t’u dërguar prapa si `cursor:` për faqen pasuese, ose null kur nuk ka faqe tjetër. Një token bosh normalizohet në null, ndaj një kontroll për null është gjithçka që ju duhet.