Belgelere geç
PHP

Yazışmalar

`threads->list`, `listAll`, `iterate`, `get`, `update`, `trash`, `snooze`, `unsnooze` ve `listAttachments`.

Okuma

read_threads.php
$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 konuşma dizilerini bir pageToken ile sayfalar. İstemci, diğer her listede olduğu gibi bunu size nextCursor olarak verir ve cursor: olarak geri alır; listAll ve iterate onu sizin için izler. Opaktır: size verileni geri geçirin ve asla kendiniz oluşturmayın.

Liste filtreleri adlandırılmış argümanlardır (labelIds:, dateFrom:); bir istek gövdesinin alanları ise API'deki adlarıyla dizi anahtarlarıdır (update üzerinde addLabelIds). Bir konuşma dizisi camelCase anahtarlı bir dizi olarak döner; bu yüzden $thread['messageCount'] sayıyı okur.

sort_threads.php
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: ve fromContacts: konuşma dizisi listesinin kendi denetimleridir. sort: değeri newest, oldest, sender ya da subject olur ve OpenEmail\Constants\ThreadSorts bunları adlandırır. Tarihler, UTC'de bir an olarak gönderilen bir DateTimeInterface ya da saat ve ofset içeren bir ISO 8601 dizesi alır ve her iki uç da dahildir. Saat içermeyen bir tarih dizesi 422 ile reddedilir. fromContacts: true, en yeni iletisi kayıtlı bir kişiden gelen postaları tutar. Her sıralama, hiçbir konuşma dizisini atlamadan ya da tekrarlamadan sonuna kadar sayfalanır.

listAll son sayfa geldiğinde tek bir dizi döndürür. iterate, her konuşma dizisini veren ve bir sonraki sayfayı yalnızca döngü ihtiyaç duyduğunda getiren bir Generator döndürür; bu yüzden ihtiyacınız olanı alır almaz bir break istekleri durdurur.

Düzenleme

organise_threads.php
$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);

Okunma durumu buradaki her arka uçta bir etikettir; bu yüzden etiket listeleriyle birlikte taşınır ve ikisini birden ayarladığınızda sıra sabittir: kaldırmalar eklemelerden önce uygulanır, bu yüzden iki listede de bulunan bir kimlik sonunda konuşma dizisinde kalır. Üç alandan en az biri bulunmalıdır.

addLabelIds, labels->list içindeki kimlikleri ve ARCHIVE ve STARRED gibi sistem kimliklerini alır. Hiçbir etiketi belirtmeyen bir kimlik oluşturulmaz, 422 label_not_found ile reddedilir; bu yüzden etiketi önce labels->create ile oluşturun. $client->threads->list(folder: 'USER_DONE'), hangi klasörde olursa olsun bir etiketi taşıyan her konuşma dizisini listeler.

Bir iletideki ekler

attachments.php
$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 dizilerden oluşan bir liste döndürür. content base64'tür ve base64_decode() onu yeniden baytlara dönüştürür; saklanan baytlar bulunamadığında boş bir dizedir, bu yüzden çözmeden önce onu kontrol edin. Şifreli bir iletinin şifreli metni bu listededir ve diğer her dosya gibi indirilir. PGP/MIME sürüm parçası ve ayrık imza ise listede yoktur. Bunların yalnızca kimlikleri encryption.parts içinde tutulur.

Şifreli olarak gelen bir ileti

Bu paket ne şifreler ne de şifre çözer. Başkasının şifrelediği bir iletiyi açamaz ve şifreli bir ileti gönderemez. Gönderme isteği bir şifreleme işareti taşıyorsa reddedilir, çünkü anahtarı olmayan bir istemcinin böyle bir iddiada bulunmaya hakkı yoktur. OpenEmail uygulamasında üretilen anahtarlar onları üreten tarayıcıda yaşar ve buraya hiçbir şekilde ulaşmaz. O tarayıcı mühürlü bir iletiyi açtığında düz metin tarayıcıda kalır ve bu çağrının okuduğu saklı ileti hâlâ şifreli metindir. threads->get size tanınmış hâliyle zarfı verir. PGP ya da S/MIME sarmalıyla gelen bir ileti bir encryption dizisi taşır; böylece elinize tutuşturulan tek şey boş bir decodedBody olmaktan çıkar. encryption, API'nin bir iletide taahhüt ettiği tek alandır, çünkü yokluğunu tahmine dayanarak atlatamayacağınız alan odur.

encrypted_mail.php
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']);}

Alanın varlığına göre değil, OpenEmail::isSealed() ile dallanın. Beş biçimden ikisi, pgp-signed ve smime-signed, ayrık bir imzanın yanında açık hâlde gelen bir gövdeyi tanımlar; bu yüzden varlığa göre kapı koymak, kimsenin gizlemesi gerekmeyen postayı gizler ve kullanıcı ne onu görebilir ne de açıklayabilir. OpenEmail::isSealed() tam da bu nedenle vardır. Sunucu mühürlü kümeyi bir kez bildirir, paketteki kopya aynı kaynaktan üretilir ve elle yazılmış üçüncü bir kopya, zamanla kayan kopyadır. OpenEmail\Constants\MessageEncryptionFormats beş biçimin tamamını adlandırır.

Yokluk, düz metin demek değildir. encryption, algılama yayımlanmadan önce saklanan her iletide ve algılayıcının hiç çalışmadığı bir yoldan posta kutusuna ulaşan her şeyde eksiktir. Kimsenin bakmadığını kaydeder; bu, postaya değil kapsamımıza dair bir olgudur ve hiçbir şey onu geriye dönük doldurmaz.

Bunların diğerlerinden ayrıldığı nokta

  • Bir konuşma dizisinin messages içindeki her kayıt, posta kutusunun sakladığı dizidir ve sabit bir alan listesi yoktur; bu yüzden encryption dışındaki her anahtarı ?? null ile okuyun. Daha fazlasını vaat etmek, istemcinin kimsenin yapmadığı bir normalleştirmeyi iddia etmesi olurdu. encryption yine de API'nin taahhüt ettiği tek alandır, çünkü ona göre dallanamayan bir istemci mühürlü bir iletiyi boş bir ileti olarak okur.
  • Aslına uygun şekilde karşılanamayan bir istek, doğru görünüp sessizce yanlış olan bir yanıt değil, ValidationException olarak fırlatılan 422 capability_unsupported verir.

Parametreler: threads->list

folderstring
Hangi klasörün listeleneceği. Sunucu bunu varsayılan olarak `inbox` alır; bu yüzden belirtmemek, listelemeyi her şeye genişletmek yerine daraltır. Sorgu, `in:` ile ya da `is:sent` gibi bir klasör `is:` ifadesiyle kendisi bir klasör adlandırmadığı sürece, bu parametre bir `query:` aramasına da uygulanır.
querystring
Posta kutusu arama sözdizimi. Düz sözcüklerin tümü geçmelidir ve her biri gevşek eşleşir: büyük/küçük harf, aksanlar ve ayırıcılar yok sayılır, daha uzun bir sözcüğün parçası da sayılır; bu yüzden hem `min` hem de `ben jamin` “Benjamin”i bulur. Tırnak içindeki bir ifade, büyük/küçük harf ve aksanlar dışında yazıldığı gibi eşleşir; bu yüzden `"ben jamin"` “Ben-Jamin”i bulmaz ve aranacak başka bir şey kaldığında dolgu sözcükleri düşürülür. Hiçbir şey tam olarak eşleşmediğinde onun yerine yakın yazımlar döndürülür; dolayısıyla `benjimin` “Benjamin”i bulur: düz bir sözcük ya da `from:`, `to:`, `cc:`, `subject:`, `body:`, `filename:` veya `label:` değeri, dört ile yedi harfliyse bir sözcüğün başından bir yazım hatasıyla (değişmiş, eksik, fazla ya da yer değiştirmiş bir harf), sekiz ya da daha fazla harfliyse iki hatayla ayrılabilir. Tırnak içindeki bir ifade, rakam içeren bir sözcük, daha kısa bir sözcük ve dışlanan bir sözcük ise yine yalnızca tam eşleşir ve sonraki sayfalar da aynı biçimde arar. `from:ada`, `label:Invoices`, `is:unread`, `has:pdf`, `before:2026/01/31` ve `older_than:1y` gibi operatörlerle daraltın ve bunları `OR`, parantezler ve başa konan bir `-` ile birleştirin. Aramanın kullanamadığı bir değer daraltma yapmak yerine yok sayılır. Sözcükler ile `from:`, `to:`, `cc:`, `subject:` ve `body:` operatörleri en son iletinin göndericisini, alıcılarını, konusunu ve gövdesinin işaretlemeden arındırılmış ilk 4.000 karakterini okur; `filename:` ve `has:` ise tüm yazışmadaki her eki okur, etiketler ve klasörler de tüm yazışmayı okur. Filtresiz listelemenin okuduğu indeksin aynısını daraltır. Mühürlü iletiler hiçbir gövde metni saklamaz; bu yüzden yalnızca göndericileri, alıcıları ve konuları eşleşebilir. Düz bir sözcük, hangi iletiyle gelmiş olursa olsun, yazışmadaki herhangi bir ekin adıyla da eşleşir.
labelIdsstring or array
Listelemeyi bu etiketleri taşıyan konuşma dizileriyle sınırlar. Uç nokta virgülle ayrılmış bir dize alır ve istemci bir diziyi sizin için bu dizeye birleştirir. Kaç etiket belirttiğinize dair bir sınır yoktur.
limitint
Döndürülecek konuşma dizisi sayısı; 1 ile 100 arası. Belirtilmezse işleyici 25 kullanır. Varsayılan şemada değil işleyicide tanımlıdır; bu yüzden eksik bir değer ile açıkça verilmiş 25 aynı şekilde davranır.
cursorstring
Önceki sayfanın `nextCursor` değeri, olduğu gibi geri geçirilir. Diğer her listenin kullandığı adla API'nin `pageToken` değeridir ve opaktır; bu yüzden asla oluşturmayın ya da düzenlemeyin.

Yanıt: OpenEmail\Result\Page

itemsarray
Bu sayfadaki her konuşma dizisi için API'nin `data` zarfından çıkarılmış bir dizi. Her biri yalnızca bir `object` işaretçisi ve bir `id` içerir. Listeleme konu, önizleme metni, katılımcılar ya da etiketler taşımaz; daha fazlası için istediğiniz konuşma dizileri üzerinde `threads->get` çağırmanız gerekir.
items[].idstring
Konuşma dizisinin kimliği; `$item['id']` olarak okunur ve `threads->get`, `threads->update` ve diğerlerine değiştirilmeden verilir. Satır ister filtrelenmiş bir listelemeden ister bir `query:` aramasından gelsin, aynı kimliktir.
hasMorebool
Başka bir sayfa olup olmadığı; API bunu belirtiyorsa API'den alınır, belirtmiyorsa `nextCursor` değerinden türetilir.
nextCursorstring or null
Sonraki sayfa için `cursor:` olarak geri gönderilecek API'nin `nextPageToken` değeri; başka sayfa yoksa null. Boş bir token null'a normalleştirilir; bu yüzden tek ihtiyacınız olan bir null denetimidir.