Pāriet uz dokumentāciju
SDK

Sarakstes

`threads.list`, `listAll`, `iterate`, `get`, `update`, `trash`, `snooze`, `unsnooze` un `listAttachments`.

Lasīšana

read-threads.ts
const page = await openemail.threads.list({  folder: 'inbox',  query: 'from:ada',  labelIds: ['INBOX', 'IMPORTANT'],  limit: 25,}) const next = page.nextCursor  ? await openemail.threads.list({ folder: 'inbox', cursor: page.nextCursor })  : null const thread = await openemail.threads.get('thread_…')console.log(thread.messageCount, thread.hasUnread, thread.totalReplies)

API lapo sarakstes ar pageToken. Klients tev to atdod kā nextCursor un pieņem atpakaļ kā cursor, tāpat kā katrs cits saraksts, un listAll un iterate tam seko tavā vietā. Tas ir necaurspīdīgs: padod atpakaļ to, ko saņēmi, un nekad nebūvē savu.

Kārtošana

organise-threads.ts
await openemail.threads.update('thread_…', {  read: true,  addLabelIds: ['Done'],  removeLabelIds: ['INBOX'],}) await openemail.threads.trash('thread_…')await openemail.threads.snooze('thread_…', new Date(Date.now() + 86_400_000))await openemail.threads.unsnooze('thread_…')

Lasīšanas stāvoklis šeit IR etiķete katrā aizmugursistēmā, tāpēc tas ceļo kopā ar etiķešu sarakstiem, un secība ir noteikta, kad iestati abus. Jābūt klāt vismaz vienam no trim laukiem.

Ziņojuma pielikumi

attachments.ts
const files = await openemail.threads.listAttachments('thread_…', 'message_…') for (const file of files) {  console.log(file.filename, file.contentType, file.size)  if (file.content) await save(file.filename, Buffer.from(file.content, 'base64'))}

content ir base64 un tukša virkne, kad saglabātos baitus nevarēja atrast, tāpēc pirms dekodēšanas pārbaudi tā garumu. Šifrēta ziņojuma šifrteksts IR šajā sarakstā un tiek lejupielādēts kā jebkurš cits fails; PGP/MIME versijas daļa un jebkurš atdalīts paraksts — nav. Tie saglabā savus id laukā encryption.parts un neko vairāk.

Ziņojums, kas atnācis šifrēts

Šis SDK ne šifrē, ne atšifrē: tas nevar atvērt ziņojumu, ko šifrējis kāds cits, un nevar nosūtīt šifrētu. Sūtīšanas pieprasījums tiek noraidīts, ja tas nes šifrēšanas marķējumu, jo klientam bez atslēgas nav ko tādu apgalvot. Atslēgas, kas ģenerētas OpenEmail lietotnē, dzīvo tajā pārlūkā, kurš tās izveidoja, un šurp nenonāk; kad šis pārlūks atver aizzīmogotu ziņojumu, atklātais teksts paliek tajā, un saglabātais ziņojums, ko lasa šis izsaukums, joprojām ir šifrteksts. Tas, ko threads.get tev dod, ir atpazīta aploksne. Ziņojums, kas atnācis PGP vai S/MIME ietinumā, nes encryption objektu, tāpēc tukšs decodedBody vairs nav vienīgais, ko tev pasniedz, un encryption ir vienīgais MessageResource lauks ar īstu tipu, jo tas ir tas, kura trūkumu uzminēt nevar izdzīvot.

encrypted-mail.ts
import { isSealed, openemail } from '@openemail/sdk' const thread = await openemail.threads.get('thread_…') for (const message of thread.messages) {  if (!message.encryption) continue  if (!isSealed(message)) continue   console.warn('cannot read this one:', message.encryption.format)}

Zarojies ar isSealed, nekad pēc lauka esamības. Divi no pieciem formātiem, pgp-signed un smime-signed, apraksta saturu, kas atnācis ATKLĀTI blakus atdalītam parakstam, tāpēc vārtu likšana pēc esamības paslēpj pastu, kas nevienam nebija jāslēpj, un lietotājs to neredz un nevar izskaidrot. isSealed tiek piegādāts tieši šī iemesla dēļ: serveris aizzīmogoto kopu nosauc vienreiz, un trešā kopija, kas izrakstīta no apvienojuma, ir tā, kura aizdreifē.

Trūkums nav atklāts teksts. encryption nav nevienam ziņojumam, kas saglabāts pirms noteikšanas ieviešanas, un nekam, kas pastkastē nonācis pa ceļu, kurā detektors nekad nestrādāja. Tas fiksē, ka neviens nav skatījies — faktu par mūsu pārklājumu, nevis par pastu —, un nekas to ar atpakaļejošu datumu neaizpilda.

Ar ko šie atšķiras no pārējiem

  • Katrs ieraksts ThreadResource.messages ir MessageResourceRecord<string, unknown> ar tieši vienu nosauktu lauku. Pārējā tipizēšana būtu klienta apgalvojums par normalizāciju, ko neviens neveic, un encryption tāpat ir nosaukts, jo klients, kas pēc tā nevar zaroties, aizzīmogotu ziņojumu nolasa kā tukšu.
  • Pieprasījums, ko nevar izpildīt godīgi, ir 422 capability_unsupported, nevis atbilde, kas izskatās pareiza un klusi ir nepareiza.

Parametri: threads.list (ThreadListOptions)

folderstring
Kuru mapi uzskaitīt. Serveris to pēc noklusējuma iestata uz `inbox`, tāpēc tā izlaišana sarakstu sašaurina, nevis paplašina līdz visam. Tas attiecas arī uz `query` meklēšanu, ja vien vaicājums pats nenosauc mapi ar `in:` vai mapes `is:`, piemēram, `is:sent`.
querystring
Pastkastes meklēšanas sintakse. Visiem vienkāršajiem vārdiem jāparādās, un katrs sakrīt brīvi: reģistrs, diakritiskās zīmes un atdalītāji tiek ignorēti, un daļa no garāka vārda tiek ieskaitīta, tāpēc gan `min`, gan `ben jamin` atrod “Benjamin”. Pēdiņās likta frāze tiek salīdzināta tā, kā uzrakstīts, atskaitot reģistru un diakritiskās zīmes, tāpēc `"ben jamin"` neatrod “Ben-Jamin”, un pildījuma vārdi tiek atmesti, kad ir palicis vēl kaut kas meklējams. Sašaurini ar operatoriem, piemēram, `from:ada`, `label:Invoices`, `is:unread`, `has:pdf`, `before:2026/01/31` un `older_than:1y`, un apvieno tos ar `OR`, iekavām un priekšā liktu `-`; vērtība, ko meklēšana nevar izmantot, tiek ignorēta, nevis sašaurina rezultātu. Vārdi un operatori `from:`, `to:`, `cc:`, `subject:` un `body:` lasa jaunākā ziņojuma sūtītāju, saņēmējus, tematu un pirmās 4000 rakstzīmes tā pamattekstā ar noņemtu marķējumu, kamēr `filename:` un `has:` lasa katru pielikumu visā sarakstē, bet etiķetes un mapes lasa visu saraksti. Tas sašaurina to pašu indeksu, ko lasa nefiltrētais saraksts. Aizzīmogoti ziņojumi neglabā pamatteksta tekstu, tāpēc tiem var sakrist tikai sūtītājs, saņēmēji un temats.
labelIdsstring | string[]
Ierobežo sarakstu līdz sarakstēm, kurām ir šīs etiķetes. Galapunkts pieņem ar komatiem atdalītu virkni, un klients masīvu tev savieno vienā; cik daudz tu tās nosauc, ierobežojuma nav.
limitnumber
Cik sarakstes atgriezt, no 1 līdz 100. Ja izlaists, apstrādātājs lieto 25. Noklusējums dzīvo apstrādātājā, nevis shēmā, tāpēc trūkstoša vērtība un skaidri norādīts 25 uzvedas vienādi.
cursorstring
Iepriekšējās lapas `nextCursor`, padots atpakaļ burtiski. Tas ir API `pageToken` ar nosaukumu, ko lieto katrs cits saraksts, un tas ir necaurspīdīgs, tāpēc nekad tādu nekonstruē un nerediģē.

Atbilde: Page<ThreadSummaryResource>

itemsThreadSummaryResource[]
Viens ieraksts katrai šīs lapas sarakstei, izcelts ārā no API `data` aploksnes. Katrs ieraksts ir tikai objekta marķējums un id. Sarakstā nav ne temata, ne fragmenta, ne dalībnieku, ne etiķešu, tāpēc jebkas vairāk nozīmē `threads.get` izsaukšanu vajadzīgajām sarakstēm.
items[].idstring
Sarakstes id, ko nemainītu padot `threads.get`, `threads.update` un pārējiem. Tas ir viens un tas pats id neatkarīgi no tā, vai rinda nāk no filtrēta saraksta vai no `query` meklēšanas.
hasMoreboolean
Vai ir vēl viena lapa; atvasināts no `nextCursor`, kur API to nepasaka.
nextCursorstring | null
API `nextPageToken`, ko nosūtīt atpakaļ kā `cursor` nākamajai lapai, vai null, kad tālākas lapas nav. Tukšs marķieris tiek normalizēts uz null, tāpēc falsy pārbaude un null pārbaude sakrīt.