Bisedat
Lexoni dhe organizoni postën.
Ekzekuton cilëndo nga 7 thirrjet e kësaj faqeje kundrejt hapësirës suaj të punës, me çelësin tuaj.
Listimi
GET /threads?folder=inbox. Kalimi i query kërkon në të njëjtin indeks lokal. Fjalët e thjeshta duhet të shfaqen të gjitha, dhe secila përputhet lirshëm, duke shpërfillur shkronjat e mëdha e të vogla, theksat dhe ndarësit, prandaj min gjen "Benjamin". Një frazë në thonjëza përputhet ashtu si është shkruar, përveç shkronjave të mëdha e theksave, prandaj "ben jamin" nuk gjen "Ben-Jamin". Fjalët mbushëse si the ose emails hiqen nga një listë fjalësh të thjeshta kur mbetet diçka tjetër për t'u kërkuar. Operatorë si from:, to:, subject:, label:, is:unread, has:pdf, after:2026/01/31 dhe newer_than:7d e ngushtojnë kërkimin, ndërsa OR, kllapat dhe një - në fillim i kombinojnë. Marrësit ruhen si një listë e vetme pa role dhe nuk mbajnë kurrë një Bcc, prandaj cc: lexon të njëjtën fushë si to: dhe bcc: nuk përputhet me asgjë të vetën. from:me është posta që keni dërguar, ndërsa to:me është posta që mbart një nga adresat tuaja, përfshirë aliaset, mes marrësve të saj ose si adresa te e cila u dorëzua.
Fjalët dhe operatorët from:, to:, cc:, subject: dhe body: lexojnë mesazhin më të ri të secilës bisedë: dërguesin e tij, marrësit, subjektin dhe 4.000 karakteret e para të trupit. filename: dhe has: lexojnë çdo bashkëngjitje të gjithë bisedës, ndërsa label:, in: dhe is: lexojnë gjithë bisedën. folder vazhdon të zbatohet, përveçse kur query-ja emërton një dosje me in:, ose me një is: që është dosje, si is:sent, ndërsa in:anywhere kërkon në çdo dosje, si më vete ashtu edhe pranë termave të tjerë. Listimi i skicave është përjashtimi dhe mbetet te skicat, çfarëdo që të emërtojë query-ja.
Një vlerë që kërkimi nuk mund ta përdorë shpërfillet në vend që të ngushtojë, prandaj një gabim shtypi në një vlerë e zgjeron rezultatin në vend që ta zbrazë: category:, larger:, smaller:, size:, messagesize:, list:, rfc822msgid:, received:, sent:, fjalët e kategorive si is:promotions, një fjalë has: që nuk emërton asnjë lloj bashkëngjitjeje, një importance: i ndryshëm nga high ose low, një datë e palexueshme dhe një kohëzgjatje njësia e së cilës nuk është h, d, w, m ose y. Një emër operatori që ai nuk e njeh, project: për shembull, kërkohet si tekst i thjeshtë. Datat lexojnë aktivitetin më të ri të bisedës, në UTC, ku after: e përfshin ditën që emërton dhe before: e përjashton; shkruajeni një të tillë si YYYY/MM/DD, YYYY-MM-DD, YYYYMMDD, si vit i thjeshtë, ose si sekonda a milisekonda epoch.
nextPageToken është opak. Kthejeni prapa pikërisht atë që ju është dhënë; mos ndërtoni dhe mos redaktoni kurrë një të tillë. Forma e tij nuk është pjesë e kontratës.
Marrja
GET /threads/{id} kthen çdo mesazh të bisedës, jo vetëm më të fundit, bashkë me etiketat e saj dhe me faktin nëse ka ndonjë gjë të palexuar në të.
Mesazhet që mbërritën të enkriptuara
Kjo API as enkripton dhe as deshifron. Ajo nuk mund të hapë një mesazh që e enkriptoi dikush tjetër, dhe nuk mund të dërgojë një të enkriptuar. Një kërkesë që mbart një shënues enkriptimi refuzohet me një 422, sepse të vetmet sipërfaqe që mund ta vendosin një të tillë janë ato që mbajnë çelësat, dhe asnjë klient API nuk mban çelës. Ajo që bën është të NJOHË një zarf të vulosur gjatë hyrjes, nga Content-Type-i i nivelit të parë dhe asgjë më shumë, dhe pastaj ta thotë atë te mesazhi.
OpenEmail tani mban vetë çelësa, dhe ia vlen të jemi të saktë se cilën gjysmë dhe ku. Pronari i një kutie postare gjeneron një identitet OpenPGP në shfletuesin e tij dhe publikon çelësin PUBLIK në një drejtori që mund ta zgjidhin dërgues të tjerë OpenEmail të identifikuar. Gjysma private krijohet në atë shfletues, nuk dërgohet kurrë këtu dhe nuk rikthehet kurrë, prandaj asgjë në këtë API nuk mund të deshifrojë asgjë, dhe asnjë kërkesë mbështetjeje, urdhër gjyqësor apo kopje rezervë e jona nuk prodhon një çelës që të mundej. Aplikacioni web tani mund të HAPË një mesazh PGP/MIME ose PGP inline kur çelësi ndodhet në shfletuesin e lexuesit, por ai deshifrim ndodh në skedë dhe teksti i tij i hapur nuk shkruhet kurrë mbrapsht: mesazhi i ruajtur mbetet tekst i shifruar, dhe asnjë përgjigje e kësaj API-je nuk mbart kurrë tekstin e hapur. Aplikacioni tani mund ta vulosë një mesazh të ri në shfletues dhe ta dërgojë: kompozuesi enkripton drejt çelësave të publikuar të marrësve dhe posta niset si PGP/MIME. Kjo API ende nuk mund të vulosë asgjë, prandaj fusha më poshtë përshkruan si postën që e enkriptoi dikush tjetër, ashtu edhe postën e vulosur në një skedë të OpenEmail-it.
Kjo meriton një fushë për shkak të asaj që ishte alternativa. Një mesazh i vulosur nuk ruan asnjë trup të lexueshëm, prandaj decodedBody kthehet si "", po ato bajte si një mesazh që në të vërtetë nuk kishte përmbajtje. encryption është ajo që ju lejon t'i dalloni të dyja përpara se të veproni mbi njërën, dhe është pohim për zarfin dhe jo verifikim: të shohësh se një mesazh është i vulosur nuk është njësoj si ta kesh hapur.
{ "object": "thread", "id": "thread_2f9b…", "messages": [ { "id": "msg_7c41…", "subject": "Q3 numbers", "decodedBody": "", "encryption": { "format": "pgp-mime", "detectedAt": "2026-08-30T09:14:22.117Z", "rawRetained": false, "parts": [ { "index": 0, "attachmentId": "msg_7c41…-0", "role": "version" }, { "index": 1, "attachmentId": "msg_7c41…-1", "role": "ciphertext" } ] } } ] }encryption
format'pgp-mime' | 'pgp-signed' | 'pgp-inline' | 'smime-encrypted' | 'smime-signed'- Cili zarf mbërriti. Lexohet nga `Content-Type`-i i nivelit të parë (parametri i tij `protocol` për PGP, `smime-type` i tij për S/MIME) ose, për `pgp-inline`, nga një trup që fillon me headerin e armor-it PGP. Një pjesë `pkcs7-mime` që nuk mbart fare `smime-type` lexohet si `smime-encrypted`, që është ajo çka e bën RFC 8551 si parazgjedhje.
detectedAtstring- ISO 8601, kur u ekzekutua detektori, që është çasti kur mesazhi u fut këtu. Ajo nuk thotë asgjë për kohën kur u enkriptua mesazhi, ose nga kush.
rawRetainedboolean- Nëse u ruajtën bajtet origjinale RFC822, që mesazhi të mund të kthehej i plotë. False për çdo mesazh sot, meqë asgjë këtu nuk ruan ende postë të papërpunuar. Ajo është në përgjigje që tani, që dita kur kjo ndryshon të mos jetë edhe dita kur çdo mesazh i ruajtur duhet të migrohet sërish.
partsobject[]- Pjesët e zarfit që përdor ky format. E pranishme kurdo që është `encryption`, dhe bosh kur nuk ka asnjë për të emërtuar: `pgp-inline` nuk ka fare pjesë të veçantë, meqë armor-i i tij ËSHTË trupi dhe mbërrin te `decodedBody`.
parts[].indexnumber- Cila pjesë MIME e mesazhit origjinal ishte kjo, e numëruar mbi pjesët ashtu si mbërritën dhe jo mbi `attachments`. Të dyja listat ndryshojnë, që është arsyeja e vetme pse kjo regjistrohet.
parts[].attachmentIdstring- Id-ja që mbart kjo pjesë te `attachments`, aty ku shfaqet fare: id-ja e mesazhit me indeksin e pjesës të shtuar. Pjesa `ciphertext` listohet dhe shkarkohet si çdo skedar tjetër; `version` dhe `signature` mbahen jashtë listës, prandaj id-të e tyre vetëm i lidhin dy pamjet dhe asgjë më. Endpoint-i i bashkëngjitjeve nuk do t'i kthejë ato.
parts[].role'version' | 'ciphertext' | 'signature'- `version` është pjesa e kontrollit PGP/MIME, `ciphertext` është mesazhi, `signature` është një nënshkrim i shkëputur. Vetëm `ciphertext` ia vlen të merret; dy të tjerat janë mobilje protokolli që dikur shfaqeshin si bashkëngjitje të kota dhe tani jo më.
| format | Çfarë mbërriti | Trupi |
|---|---|---|
| pgp-mime | Një zarf PGP/MIME: multipart/encrypted me protocol=application/pgp-encrypted. | I vulosur |
| pgp-inline | Armor te vetë trupi. Lexohet vetëm nga teksti i trupit, prandaj një përgjigje që thjesht citon një bllok armor nuk ngatërrohet me një të tillë. | I vulosur |
| smime-encrypted | Një pjesë S/MIME pkcs7-mime me smime-type=enveloped-data, ose një pa fare smime-type. | I vulosur |
| pgp-signed | Një nënshkrim i shkëputur PGP pranë mesazhit: multipart/signed me protocol=application/pgp-signature. | I lexueshëm |
| smime-signed | Një nënshkrim i shkëputur S/MIME: një protokoll pkcs7-signature, ose smime-type=signed-data. | I lexueshëm |
I nënshkruar nuk është i vulosur, dhe degëzimi mbi praninë e encryption në vend të format e merr këtë pikërisht së prapthi. Një nënshkrim është pretendim për atë që shkroi mesazhin, jo një mbështjellje rreth tij: trupi i një mesazhi të nënshkruar është i hapur dhe lexohet si çdo tjetër. Trajtoni pgp-mime, pgp-inline dhe smime-encrypted si të palexueshme, ndërsa dy formatet e nënshkruara si postë të zakonshme.
Çfarë ndryshon te një mesazh i vulosur
Vetëm tre formatet e vulosura ndryshojnë diçka, dhe ndryshimi ndodh në fazën e futjes, jo në këtë përgjigje. Çdo gjë që do ta kishte lexuar trupin tërhiqet, në vend që të lexojë tekst të shifruar dhe të raportojë një rezultat që nuk mund ta kishte nxjerrë:
- Kërkimi mbi trupin. Mesazhi indeksohet me një fragment trupi bosh, prandaj gjendet ende nga dërguesi, subjekti, adresa dhe etiketa, dhe jo nga asgjë brenda tij.
- Kalimi mbi trupin i vlerësuesit të phishing-ut. Verdikti mbërrin gjithsesi dhe thotë çfarë nuk mundi të bënte:
risk.signalsmbartbody-encrypteddherisk.aiCheckedështë false. - Kontrolli i autorësisë nga AI, i cili refuzon në vend që të hamendësojë:
aiWritten.levelështëunknowndheaiWritten.skippedështëencrypted. - Kushtet mbi trupin te rregullat. Kushtet mbi zarfin dhe headerët ekzekutohen pikërisht si më parë; një rregull që pyeste për trupin regjistrohet si i pavlerësuar dhe jo si mospërputhje, sepse "nuk u përputh" dhe "nuk mund të lexohej" janë përgjigje të ndryshme.
- Importimi i ftesave të kalendarit. Ftesa është brenda tekstit të shifruar, dhe ndërtimi i një ngjarjeje nga zarfi do të vendoste një zë të gabuar në një kalendar të vërtetë.
- Përmbledhjet dhe embedding-et e bisedave, për të gjithë bisedën. Mjafton një përgjigje e vetme e vulosur. Një përmbledhje është leximi i një modeli mbi tekstin e hapur, i ruajtur si metadata e qartë, që është i vetmi vend në këtë rrjedhë ku një trup do të rridhte në një depo që askush nuk e mendon si trup.
Çdo gjë që nuk ka nevojë për trupin mbetet e paprekur:
- DMARC, DKIM dhe SPF. Ato lexohen nga
Authentication-Results, të cilin teksti i shifruar nuk e fsheh, prandaj një mesazh i enkriptuar merr gjithsesi një verdikt të vërtetë autentikimi dhe jo asnjë. - Grupimi në biseda, arkivimi i spam-it dhe lista e bllokimit: të gjitha punë mbi zarfin dhe headerët.
- Bashkëngjitjet. Pjesa
ciphertextmbetet teattachments, e emërtuarencrypted-message.asckur mbërrin pa emër, dhe shkarkohet përmes endpoint-it më poshtë. Është pikërisht ajo që merr dhe deshifron në shfletues lexuesi i vetë aplikacionit web; për një klient API, i cili nuk mban asnjë çelës, ai shkarkim mbetet e vetmja mënyrë për ta lexuar postën. Hapeni në një klient që ka një çelës. - Një mesazh i nënshkruar nuk humb asgjë nga kjo. Çdo kontroll i mësipërm vazhdon të ekzekutohet mbi të dhe asgjë nuk mbahet mbrapsht, prandaj lista e të vulosurve është listë me tre formate dhe jo me pesë.
Mungesa e encryption nuk është pretendim se mesazhi është i hapur. Ajo do të thotë se askush nuk pa: mesazhi i paraprin detektimit, ose arriti kutinë postare nga një rrugë që nuk e ekzekuton detektorin. Asgjë nuk e plotëson me prapaveprim, prandaj një fushë që thotë "nuk kontrolluam" nuk duhet lexuar kurrë si "kontrolluam dhe nuk gjetëm asgjë".
Shënimi dhe etiketimi
PATCH /threads/{id} merr read, addLabelIds dhe removeLabelIds. Gjendja e leximit është etiketë në çdo backend që mbështet ky produkt, prandaj caktimi i read dhe zhvendosja e etiketave në një thirrje të vetme e mban renditjen deterministe.
{ "read": true, "addLabelIds": ["USER_INVOICES"] }TRASH dhe SNOOZED refuzohen këtu me label_not_directly_settable. Asnjëra gjendje nuk mbahet vetëm nga etiketa e saj (hedhja te koshi pastron edhe etiketat e dosjeve, ndërsa një shtyrje ka nevojë për një kohë zgjimi të ruajtur pranë saj), prandaj caktimi i tyre me dorë e lë një bisedë në një gjendje që aplikacioni nuk e prodhon kurrë dhe nga e cila nuk mund të shërohet. Përdorni endpoint-et më poshtë.
Trash dhe shtyrja
| Endpoint | Bën |
|---|---|
| POST /threads/{id}/trash | E zhvendos te Bin, duke pastruar njëherësh INBOX, SPAM, SNOOZED dhe ARCHIVE. |
| POST /threads/{id}/snooze | Body { "wakeAt": "…" }. E fsheh atë dhe planifikon kthimin e saj. |
| POST /threads/{id}/unsnooze | E kthen tani, dhe anulon kthimin e planifikuar. |
Shtyrja shkruan dy gjëra: etiketën që e fsheh bisedën, dhe zërin që e sjell prapa. Të bësh njërën pa tjetrën është pikërisht arsyeja pse këto janë endpoint-e dhe jo ndryshime etiketash.
Bashkëngjitjet
GET /threads/{id}/messages/{messageId}/attachments kthen çdo bashkëngjitje me filename, contentType, size dhe content si base64. content është varg bosh aty ku bajtet e ruajtura nuk u gjetën dot, prandaj kontrolloni gjatësinë e tij përpara se të dekodoni.
Një zarf i enkriptuar nuk është i tëri këtu. Teksti i shifruar është (është mesazhi, dhe shkarkimi i tij është e vetmja mënyrë që një klient API ta lexojë këtë postë), por pjesa version e PGP/MIME dhe çdo nënshkrim i shkëputur mbahen jashtë listës, sepse shfaqeshin si bashkëngjitje të kota dhe nuk ka asgjë që mund të bëjë një thirrës me to. Të dyja i ruajnë id-të e tyre te encryption.parts, e cila i lidh dy pamjet; ky endpoint nuk i kthen ato.