Kalo te dokumentacioni
Ruby

Bisedat

`threads.list`, `list_all`, `iterate`, `get`, `update`, `trash`, `snooze`, `unsnooze` dhe `list_attachments`.

Leximi

read_threads.rb
page = client.threads.list(  folder: "inbox",  query: "from:ada",  label_ids: ["INBOX", "IMPORTANT"],  limit: 25) if page.next_cursor  next_page = client.threads.list(folder: "inbox", cursor: page.next_cursor)  puts next_page.items.sizeend thread = client.threads.get("CAHk7pQ2x9LmZ4-mail.example.com")puts thread[:messageCount], thread[:hasUnread], thread[:totalReplies]

API-ja i faqos thread-et me një pageToken. Klienti jua jep si next_cursor dhe e merr prapë si cursor:, si çdo listë tjetër, ndërsa list_all 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ë fjalë kyçe të Ruby-t në snake_case (label_ids:, date_from:), ndërsa fushat e trupit të një kërkese ruajnë emrat camelCase të API-së (addLabelIds: te update). Një thread kthehet si Hash me çelësa Symbol, ndaj thread[:messageCount] lexon numrin.

sort_threads.rb
last_week = client.threads.list_all(  sort: "oldest",  date_from: Time.now - (7 * 86_400),  date_to: Time.now,  from_contacts: true)puts last_week.size client.threads.iterate(sort: "sender") do |thread|  puts thread[:id]end

sort:, date_from:, date_to: dhe from_contacts: janë kontrollet e vetë listës së thread-eve. sort: është newest, oldest, sender ose subject, dhe OpenEmail::THREAD_SORTS i emërton. Datat marrin një Time, një DateTime ose një string ISO 8601 me orë dhe zhvendosje, dhe të dy skajet përfshihen. Një Date e Ruby-t dërgohet si datë e zhveshur, të cilën këto fusha e refuzojnë me një 422. from_contacts: 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.

list_all kthen një Array të vetëm sapo të ketë mbërritur faqja e fundit. iterate ia jep çdo thread një blloku dhe e merr faqen e radhës vetëm kur cikli ka nevojë për të. Pa bllok kthen një Enumerator, ndaj first(10) ose lazy ndalojnë sapo të kenë atë që u duhet.

Organizimi

organise_threads.rb
thread_id = "CAHk7pQ2x9LmZ4-mail.example.com" client.threads.update(thread_id, read: true, addLabelIds: ["USER_DONE"], removeLabelIds: ["INBOX"]) client.threads.trash(thread_id)client.threads.snooze(thread_id, Time.now + 86_400)client.threads.unsnooze(thread_id)

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

attachments.rb
files = client.threads.list_attachments("CAHk7pQ2x9LmZ4-mail.example.com", "message_4c1b257a") files.each do |file|  puts "#{file[:filename]} #{file[:contentType]} #{file[:size]}"  File.binwrite(file[:filename], file[:content].unpack1("m")) unless file[:content].to_s.empty?end

list_attachments kthen një Array me Hash-e. content është base64, të cilin unpack1("m") e kthen në një String binar, dhe është string bosh kur bajtet e ruajtura nuk u gjetën, ndaj kontrolloni gjatësinë e tij 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

Ky gem 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ë Hash 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.

encrypted_mail.rb
thread = client.threads.get("CAHk7pQ2x9LmZ4-mail.example.com") thread[:messages].each do |message|  next unless message[:encryption]  next unless OpenEmail.sealed?(message)   warn "cannot read this one: #{message[:encryption][:format]}"end

Degëzoni me OpenEmail.sealed?, 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.sealed? ekziston pikërisht për këtë arsye. Serveri e deklaron një herë të vetme bashkësinë e të vulosurave, kopja e gem-it gjenerohet nga i njëjti burim, dhe një kopje e tretë e shkruar me dorë është kopja që rrëshqet. OpenEmail::MESSAGE_ENCRYPTION_FORMATS 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 messages i një thread-i është Hash-i që ruajti kutia postare, pa një listë të fiksuar fushash. 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ë ngritur si OpenEmail::ValidationError, 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.
label_idsString or Array<String>
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 ose një Set në një të tillë. Nuk ka kufi se sa prej tyre emërtoni.
limitInteger
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
`next_cursor` 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::Page

itemsArray<Hash>
Një Hash 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:`.
has_more?Boolean
Nëse ka një faqe tjetër, e marrë nga API-ja kur ajo e deklaron dhe e nxjerrë nga `next_cursor` kur nuk e deklaron.
next_cursorString or nil
`nextPageToken` i API-së, për t’u dërguar prapa si `cursor:` për faqen pasuese, ose nil kur nuk ka faqe tjetër. Një token bosh normalizohet në nil, ndaj `if page.next_cursor` dhe një kontroll për nil japin të njëjtin rezultat.