Şablonlar, kurallar ve webhook'lar
Her `templates`, `rules` ve `webhooks` komutu: slug ile gönderdiğiniz kayıtlı gövdeler, gelen postayı düzenleyen kurallar ve kendi sunucunuz için imzalı olaylar.
Üç ad alanı
Bu üç ad alanı, bir posta kutusunun kimse izlemeden çalışmasını sağlar. templates birçok kez gönderdiğiniz gövdeleri saklar, rules postayı geldikçe düzenler, webhooks ise kendi sunucunuza ne olduğunu bildirir. Her komut, kebab-case adıyla bir SDK yöntemidir; bu yüzden webhooks.rotateSecret, openemail webhooks rotate-secret olur ve bağımsız değişkenleri ve bayrakları diğer her kaynak komutu gibi okur.
| Ad alanı | Ayrıca | Okumalar için gereken | Değişiklikler için gereken |
|---|---|---|---|
| templates | template | templates:read | templates:write, send için ayrıca emails:send |
| rules | rule | rules:read, test dahil | rules:write |
| webhooks | webhook | webhooks:read | webhooks:write, test ve replay-delivery dahil |
Bu sayfa her komutu ve onu bir betikte kullanmadan önce bilmeye değer olanları listeler. Her bağımsız değişken ve bayrak için türü, gerektirdiği kapsamlar, uç noktası ve ne döndürdüğüyle birlikte openemail <namespace> <verb> --help çalıştırın. Aynı sayfayı JSON olarak almak için --json ekleyin.
openemail templates --helpopenemail rules create --helpopenemail webhooks replay-delivery --help --jsonŞablonlar
Bir kez saklanıp birçok kez gönderilen gövdeler; sürümler, önizlemeler ve tipli prop'larla. <id-or-slug> alan her komut tpl_ id'sini ya da slug'ı kabul eder. Şablon yeniden adlandırıldığında slug asla değişmez, bu yüzden betiklerde slug'ı sabitleyin.
| Komut | Ne yapar |
|---|---|
| openemail templates list | Şablonları en son güncellenen önce olacak şekilde listeleyin. --status taslak, etkin ya da arşivlenmiş olanları tutar, --search adlar, slug'lar ve konularda eşleşme arar, --sort sırayı seçer |
| openemail templates get <id-or-slug> | Bir şablonu head sürümüyle, gövdesi dahil eksiksiz okuyun |
| openemail templates create --name <value> | Bir şablon ve ilk sürümünü oluşturun. --publish vermediğiniz sürece taslak kalır; --starter onu bir başlangıç tasarımından doldurur |
| openemail templates update <id-or-slug> | Adı, slug'ı, açıklamayı ya da durumu veya taslak gövdeyi düzenleyin. Gönderimler siz yayımlayana kadar yayımlanmış sürümü kullanır |
| openemail templates duplicate <id-or-slug> | head sürümünü taslak olarak başlayan yeni bir şablona kopyalayın |
| openemail templates replace-content <id-or-slug> | Gövdeyi bir başlangıç tasarımınınkiyle (--starter) ya da başka bir şablonunkiyle (--from-template-id) değiştirin. Onay ister |
| openemail templates delete <id-or-slug> | Bir şablonu ve tüm sürümlerini silin. Onay ister |
| openemail templates list-versions <id-or-slug> | Sürümleri en yeniden eskiye, gövdeleri olmadan listeleyin |
| openemail templates get-version <id-or-slug> <version> | Taslağa dokunmadan tek bir sürümü gövdesiyle okuyun |
| openemail templates publish <id-or-slug> | Gönderimler ona çözümlensin diye taslağı yayımlayın. Zaten yayında olan bir head'i yayımlamak hiçbir şeyi değiştirmez |
| openemail templates restore-version <id-or-slug> <version> | Daha eski bir sürümün gövdesini taslak olarak geri getirin. Onay ister |
| openemail templates delete-version <id-or-slug> <version> | Tek bir sürümü silin. Yayındaki sürüm, head ve tek sürüm reddedilir. Onay ister |
| openemail templates list-starters | Yerleşik başlangıç tasarımlarını listeleyin |
| openemail templates get-starter <slug> | Tek bir başlangıç tasarımını blok ağacı ve işlenmiş bir önizlemeyle eksiksiz okuyun |
| openemail templates list-fonts | Bir şablonun yükleyebileceği web yazı tiplerini listeleyin |
| openemail templates render | Hiçbir yerde saklanmayan bir gövdeyi --html ya da --document üzerinden işleyin |
| openemail templates preview <id-or-slug> | Kayıtlı bir şablonu, taslaklar dahil, göndermeden --props ve --slots ile işleyin |
| openemail templates get-analytics <id-or-slug> | Bir zaman aralığındaki gönderimler, açılmalar ve tıklamalar; güne, kaynağa ve sürüme göre |
| openemail templates list-sends <id-or-slug> | Şablonun gönderdiği tek tek mesajlar, en yeniden eskiye, sayfa sayfa |
| openemail templates send <id-or-slug> --from <value> --to <a,b> | Yayımlanmış sürümden ya da --template-version ile sabitlenenden işlenmiş bir e-posta gönderin |
Bir şablonun, yayımlanmamış düzenlemeleri olduğu sürece taslak olan bir head sürümü ve --template-version olmadan yapılan bir gönderimin kullandığı yayımlanmış bir sürümü vardır. --publish olmadan create, update ile bir gövde düzenlemesi, replace-content ve restore-version hepsi taslağa yazar, bu yüzden alıcılar publish yapılana kadar yeni bir şey görmez.
- Arşivlenmiş bir şablon
template_archivedile göndermeyi reddeder.publishonu yeniden etkin yapar. - Bir çalışma alanında arşivlenmişler dahil en fazla 200 şablon olabilir, bu yüzden yer açmanın tek yolu silmektir.
- Zamanlanmış ya da kuyruktaki bir toplu gönderim şablonu hâlâ adlandırdığı sürece
delete,template_in_useile reddedilir.
Kurallar
Gelen posta üzerinde, rules list komutunun gösterdiği sırayla değerlendirilen koşullar ve eylemler. Bir kural yalnızca kendisi etkinken gelen postaya uygulanır. Hiçbir komut bir kuralı posta kutusunda zaten bulunan postaya uygulamaz; neyi yakalayacağını rules test ile görürsünüz. Kural id'leri rul_ ile başlar.
| Komut | Ne yapar |
|---|---|
| openemail rules list | Kuralları çalıştıkları sırayla listeleyin. --enabled ya da --no-enabled tek bir türü tutar |
| openemail rules get <id> | matchCount ve lastMatchedAt ile tek bir kuralı okuyun |
| openemail rules create --name <value> --conditions <json|@file|-> --actions <json|@file|-> | Sıranın sonunda bir kural oluşturun. --no-enabled vermediğiniz sürece etkindir |
| openemail rules update <id> | Bir kuralı değiştirin. --conditions ve --actions listenin tamamının yerini alır, --position yalnızca bu kuralı taşır |
| openemail rules delete <id> | Bir kuralı silin. Daha önce yaptıkları list-runs içinde kalır. Onay ister |
| openemail rules reorder <rule-ids...> | Her kuralı tam olarak bir kez adlandırarak tüm kuralların sırasını tek seferde belirleyin |
| openemail rules test <id> | Bir kuralı posta kutusunda zaten bulunan posta üzerinde deneme olarak çalıştırın. Hiçbir şeyi değiştirmez ve devre dışı bir kuralda da çalışır |
| openemail rules list-runs | Kuralların gelen postaya gerçekte ne yaptığı, en yeniden eskiye. --rule-id ve --thread-id daraltır |
--conditions, --match all ya da --match any ile birleştirilen { field, op, value } nesnelerinden oluşan bir listedir; value her zaman bir dizedir ve negate: true tek bir koşulu tersine çevirir. --actions, sırayla uygulanan { type, value } nesnelerinden oluşan bir listedir. Bir kural 1 ile 20 arası koşul ve 1 ile 10 arası eylem alır; bir posta kutusunda en fazla 100 kural olabilir.
- Koşul alanları:
from,from_domain,envelope_from,to,cc,bcc,recipient,reply_to,delivered_to,subject,body,header,list_id,attachment_name,attachment_type,has_attachment,attachment_size,message_size,spam,hourveweekday. - İşleçler:
matches,contains,equals,starts_with,ends_with,gtvelt.gtveltyalnızca sayı alanlarında çalışır;has_attachmentvespamyalnızcatrueya dafalseileequalsalır. - Eylem türleri:
label,remove_label,archive,mark_read,star,spam,trash,forward,reply,block_sendervereject.labelveremove_label,USER_RECEIPTSgibi bir etiket id'si;forwardbir adres;replyise bir şablon id'si ya da slug'ı alır. from_domainalt alan adlarıyla da eşleşir;hourveweekdayUTC olarak okunur ve Pazar için0kullanılır.rejecteylemi olan bir kuralınenvelope_fromalanını da sınaması gerekir, aksi hâldereject_needs_envelopeile reddedilir.
Webhook'lar
Kendi sunucunuzda imzalı posta kutusu olaylarını alan uç noktalar; imzalama gizli anahtarları, teslim günlükleri ve her değişikliğin denetim günlüğüyle. Uç nokta id'leri whe_, teslim id'leri whd_ ile başlar.
| Komut | Ne yapar |
|---|---|
| openemail webhooks list | Çalışma alanındaki uç noktaları en yeniden eskiye, sağlık durumlarıyla listeleyin |
| openemail webhooks get <id> | Tek bir uç noktayı okuyun. İmzalama gizli anahtarı asla bir okumanın parçası değildir |
| openemail webhooks create --url <value> | Bir HTTPS uç noktası kaydedin. İmzalama gizli anahtarını yazdırır; o anahtarı gördüğünüz tek zaman budur |
| openemail webhooks update <id> | URL'yi, olayları, izin listelerini ya da etkin olup olmadığını değiştirin. Her liste kayıtlı olanın yerini alır |
| openemail webhooks delete <id> | Bir uç noktayı ve teslim günlüğünü silin. Onay ister |
| openemail webhooks rotate-secret <id> | Yeni bir imzalama gizli anahtarı oluşturun. Eskisi hemen çalışmayı bırakır. Onay ister |
| openemail webhooks test <id> | İmzalı, yapay bir email.sent olayı gönderin ve teslimin nasıl gittiğini bildirin |
| openemail webhooks list-deliveries <id> | Tek bir uç noktanın teslim denemeleri, en yeniden eskiye. --status, --since ve --until daraltır |
| openemail webhooks get-delivery <id> <delivery-id> | Tek bir denemenin tamamı: gönderilen gövde, sunucunuzun yanıtı, olayın her denemesi ve yeniden göndermenin kabul edilip edilmeyeceği |
| openemail webhooks replay-delivery <id> <delivery-id> | Kayıtlı tek bir olayı uç noktaya şimdi yeniden gönderin |
| openemail webhooks list-workspace-deliveries | Tüm uç noktalardaki ya da --endpoint-ids ile adlandırılanlardaki teslim denemeleri |
| openemail webhooks list-activity <id> | Tek bir uç noktanın denetim günlüğü: onu kimin oluşturduğu, değiştirdiği, test ettiği, yeniden gönderdiği ya da kaldırdığı |
| openemail webhooks list-workspace-activity | Kaldırılanlar dahil her uç noktanın denetim günlüğü |
--event-types vermezseniz bir uç nokta varsayılan kümeyi, yani email.replied dışındaki email.* olaylarını alır. email.replied, domain.* olayları ve suppression.* olayları ona yalnızca siz adlandırdığınızda ulaşır. --address-allowlist ve --domain-allowlist, bir API anahtarını daralttıkları gibi bir uç noktayı da bazı adreslere ya da alan adlarına daraltır.
- Destek ekibi sınırını yükseltmediyse bir çalışma alanında 10 uç nokta olabilir.
- Art arda 100 teslimde başarısız olan bir uç nokta sunucu tarafından kapatılır;
webhooks update <id> --enabledonu geri getirir. - Bir tarayıcı oturumuyla bir teslimi
get-deliveryile yalnızca çalışma alanı sahibi okuyabilir. Diğer herkesowner_onlyve4çıkış kodu alır.
Bir şablonu kontrol edin, sonra yayımlayın
templates preview, aynı değerlerle yapılacak bir gönderimin üreteceğini, taslaklar dahil, birebir işler ve yalnızca templates:read gerektirir; bu yüzden salt okunur bir anahtar bile onu çalıştırabilir. send komutunun reddedeceği eksik bir zorunlu prop'u uyarı olarak bildirir, bu yüzden herhangi bir uyarıda derlemeyi başarısız sayın. publish her dağıtımda güvenlidir, çünkü zaten yayında olan bir head'i yayımlamak hiçbir şeyi değiştirmez.
draft=$(openemail templates get order-shipped --json | jq .latestVersion)openemail templates preview order-shipped --template-version "$draft" \ --props '{"orderId":"AC-4192","customer":"Ada"}' --json | jq -e '.warnings == []'openemail templates publish order-shippedBir şablondan gönderin
Sürümü sabitleyin, böylece yarın yayımlanan bir yeniden yazım bu kodun gönderdiğini değiştirmez; gönderime yol açan şeyden türetilmiş bir eş güçlülük anahtarı verin, böylece kaybolan bir yanıttan sonraki yeniden deneme ikinci bir mesaj göndermek yerine ilkini yeniden oynatır. --dry-run yöntemi, URL'yi, kimlik bilginiz gizlenmiş başlıkları ve gövdeyi yazdırır, hiçbir şey göndermez ve 0 koduyla çıkar. Göndermek için --dry-run olmadan yeniden çalıştırın.
openemail templates send order-shipped \ --from 'Acme <[email protected]>' \ --to [email protected] \ --template-version 5 \ --props '{"orderId":"AC-4192","customer":"Ada"}' \ --idempotency-key order-shipped:AC-4192 \ --dry-runBir kuralı çalışmadan önce test edin
Kuralı kapalı olarak oluşturun, son posta üzerinde deneme olarak çalıştırın ve istediğinizi yakaladığında açın. Bir tarayıcı oturumuyla rules create ve rules update bir betiğin yazamayacağı bir doğrulama kodu ister, bu yüzden önce openemail verify çalıştırın. Sonraki 60 dakika boyunca o profil bunları sormadan çalıştırır.
[ { "field": "from_domain", "op": "equals", "value": "stripe.com" }, { "field": "has_attachment", "op": "equals", "value": "true" }][ { "type": "label", "value": "USER_RECEIPTS" }, { "type": "archive" }]openemail verifyrule=$(openemail rules create --name 'Stripe receipts' \ --conditions @conditions.json --actions @actions.json --no-enabled --json | jq -r .id)openemail rules test "$rule" --days 30 --limit 100openemail rules update "$rule" --enabledrules test çıktısında eşleşmelerden önce uyarıları okuyun. field_unevaluable, bir koşulun saklanan postanın artık taşımadığı bir şeyi okuduğu ve testin bunu değerlendiremediği anlamına gelir; forward_unverified ise bir yönlendirme hedefinin burada barındırılmadığı anlamına gelir. wouldApply kuralın bildirdiklerini listeler: onaylamamış bir adrese yönlendirme, gerçek posta geldiğinde yine başarısız olur.
Bir kuralı en başa alın ve bir mesajın neden taşındığını görün
rules reorder posta kutusundaki her kuralı tam olarak bir kez alır. Dışarıda bırakılan ya da iki kez adlandırılan bir kural reddedilir ve hiçbir şey yer değiştirmez. rules list id'leri çalıştıkları sırayla döndürür, bu yüzden ilk olmasını istediğinizi diğerlerinin önüne koyun.
first=rul_4f1c9a2b7d3e8f6a0b5c1d2eopenemail rules reorder "$first" $(openemail rules list --all --ndjson \ | jq -r --arg first "$first" 'select(.id != $first) | .id')openemail rules list-runs --thread-id CAHk7pQ2x9LmZ4 --json | jq '.items[] | {ruleName, actions, failures}'list-runs gerçekte ne olduğunun kaydıdır. Her satır, bir kuralın bir mesajla eşleşmesidir; etkili olan eylemler ve failures içinde posta kutusunun geri çevirdikleri, örneğin o gün zaten yanıtlanmış bir gönderene yanıt, yer alır. Her satır kuralın o anki adını saklar, bu yüzden --rule-id o zamandan beri sildiğiniz bir kural için de çalışır.
Bir webhook kaydedin ve çalıştığını kanıtlayın
webhooks create imzalama gizli anahtarını bir kez gösterir ve sonraki hiçbir komut onu yeniden göstermez. --json ile anahtar stdout'taki JSON içindedir, onu saklama hatırlatması ise stderr'e gider; böylece çıktı yine ayrıştırılabilir. webhooks test, uç nokta hangi olaylara abone olursa olsun imzalı, yapay bir email.sent olayı gönderir ve hiç posta gönderilmez.
openemail verifyopenemail webhooks create --url https://hooks.acme.com/openemail \ --event-types email.received,email.bounced,email.complained \ --description 'Support desk sync' --json > endpoint.jsonjq -r .secret endpoint.jsonopenemail webhooks test "$(jq -r .id endpoint.json)" --json | jq .deliveryrm endpoint.jsonDosyayı silmeden önce gizli anahtarı gizli anahtar deponuza koyun. test sunucunuz başarısız olsa bile 0 koduyla çıkar, bu yüzden delivery.status değerini okuyun: 2xx yanıt için delivered, yönlendirmeler asla izlenmediğinden bir yönlendirme dahil başka her şey için failed. null değerli bir responseCode hiç yanıt gelmediği anlamına gelir.
Başarısız teslimleri bulun ve birini yeniden gönderin
Sizin tarafınızdaki bir kesintiden sonra tüm uç noktalarda neyin başarısız olduğunu listeleyin, yeniden göndermenin kabul edileceğini kontrol edin ve olayı yeniden gönderin. Yeniden gönderim aynı olay id'sini taşır, bu yüzden daha önce işlediği id'leri atan bir alıcı onu zaten bildiği olay olarak ele alır.
openemail webhooks list-workspace-deliveries --status failed --since 2026-09-26T00:00:00Z --all --ndjson \ | jq -r '[.endpointId, .id, .eventType, (.responseCode // "no answer")] | @tsv'openemail webhooks get-delivery whe_3f9c2a7b1e4d8f60a5c7b92d whd_8c1e4a7f2b9d3e6a0c5f1b28 --json | jq .replayRefusalopenemail webhooks replay-delivery whe_3f9c2a7b1e4d8f60a5c7b92d whd_8c1e4a7f2b9d3e6a0c5f1b28--sinceve--untilbir ISO 8601 anı alır.nextAttemptAtalanında bir zaman bulunan başarısız bir satır için hâlâ otomatik bir yeniden deneme sırada demektir.replayRefusal, yeniden gönderim gidebileceksenullolur; aksi hâlde neden reddedileceğini adlandırır, örneğin uç nokta kapalıykenwebhook_disabled.- Yeniden gönderimler her seferinde tek bir olay için yapılır. Hiçbir komut başarısız teslimlerin tamamını yeniden göndermez.
Doğrulama kodları
Bir tarayıcı oturumuyla bu komutlardan dördü, web uygulamasında olduğu gibi, bir şeyi değiştirmeden önce doğrulama kodu ister: rules create, rules update, webhooks create ve webhooks update. Bir API anahtarından asla istenmez. Bu sayfadaki diğer her komut, silmeler ve webhooks rotate-secret dahil, kodsuz çalışır.
- Terminalde CLI size e-postayla altı haneli bir kod gönderir ya da iki adımlı oturum açma açıksa kimlik doğrulayıcı uygulamanızdan bir kod ister, ardından komutu bir kez çalıştırır.
- Gözetimsiz çalışırken, yani
--jsonya da--no-inputile, CI'da ya da terminal olmadan, kodu kimse yazamaz; bu yüzden komut4çıkış koduyla durur ve hiçbir şeyi değiştirmez. Önceopenemail verifyçalıştırın, profil 60 dakika boyunca kod gerektirmez. --yesbir silmeyi onaylar ama asla bir kodu atlamaz.
Onaylar ve deneme çalıştırmaları
Buradaki yedi komut bir şeyi kaldırır ya da üzerine yazar, bu yüzden önce onay ister: templates delete, templates delete-version, templates replace-content, templates restore-version, rules delete, webhooks delete ve webhooks rotate-secret. Gözetimsiz çalışırken her biri, --yes vermediğiniz sürece 2 çıkış koduyla durur.
$ openemail webhooks delete whe_3f9c2a7b1e4d8f60a5c7b92d --no-input✗ Refusing to run unattended. Pass --yes to confirm.$ openemail webhooks delete whe_3f9c2a7b1e4d8f60a5c7b92d --yes--dry-run bir şeyi değiştirecek ilk isteği yazdırır ve göndermeden ya da onay istemeden 0 koduyla çıkar. --json ile tek bir { dryRun, request } belgesi yazdırır. rules test, templates render ve templates preview hiçbir şeyi değiştirmez, ancak POST istekleridir, bu yüzden bir deneme çalıştırması onları çalıştırmak yerine yazdırır.
Sayfalama
templates list,templates list-versions,rules list,rules list-runsve herwebhooks list…komutu her seferinde tek bir sayfa okur;--limiten fazla 100 istemedikçe 25 satır. Terminal, sonraki sayfa için verilecek--cursordeğerini gösterir.--allher sayfayı okur,--max <n>o kadar satırdan sonra durur,--ndjsonher satıra bir JSON nesnesi yazdırır.--jsonile bir liste,--alldahil, tek bir{ items, hasMore, nextCursor }belgesi yazdırır.- Bir imleci geldiği filtreler ve sıralamayla geri verin. Başka her şey
invalid_cursorolarak,7çıkış koduyla reddedilir. templates list-sendsise sayfaları numarayla,--pageve--page-sizeile böler,totalbildirir ve--alldesteklemez. Posta gönderilirken sayfa numaraları kayar, bu yüzden derin sayfalara gitmek yerine zaman aralığını--daysya da--minutesile daraltın.templates list-startersvetemplates list-fontskataloğun tamamını tek seferde döndürür;rules reorderise her kuralı yeni sırasıyla düz bir liste olarak döndürür.- Bir posta kutusunda en fazla 100 kural olabilir, bu yüzden
rules list --limit 100her zaman tüm kuralları tek sayfada döndürür.
İkinci kez bakmaya değer bayraklar
--template-version, gövdedekiversionalanıdır;--versionCLI sürümünü yazdırdığı için yeniden adlandırılmıştır.get-version,restore-versionvedelete-versionkomutlarının<version>bağımsız değişkeni birtplv_id'si değil, bir sürüm numarasıdır.--conditions,--actions,--document,--slots,--propsve diğer JSON bayrakları JSON'u satır içi,@pathile bir dosyadan ya da-ile stdin'den alır.--datagövdenin tamamını aynı şekilde alır ve ayrıca verdiğiniz her bayrak kendi anahtarını geçersiz kılar.--htmlbir dosyayı değil biçimlendirmenin kendisini alır, bu yüzden--html @page.html@page.htmlmetnini gönderir.--html "$(cat page.html)"verin ya dahtmlalanını--databayrağına verdiğiniz dosyaya koyun.rules update --conditionsve--actionslistenin tamamının yerini alır;webhooks update --event-types,--address-allowlistve--domain-allowlistde öyle. Geçerli değeri okuyun, değiştirin ve tamamını gönderin.- Boş bir
--event-typesbir kullanım hatasıdır. Bir uç noktayı varsayılan kümeye döndürmek için--data '{"eventTypes":[]}'gönderin, teslimlerini durdurmak için--no-enabledverin. templates update,replace-contentverestore-versionüzerindeki--expected-version, okuduğunuz head sürümünü alır. Başka biri o zamandan beri head'i ilerlettiyse komut6çıkış kodu veversion_conflictile durur ve hiçbir şey yazmaz.rules update <id> --no-enabledbir kuralı kapatır ve sıradaki yerini korur; bir kuralı silmeden duraklatmanın yolu budur.