Gelen Mesaj Kutusu

1.6k görüntülenme Markdown

İletişim formu gelen kutusunu okuyan, taşıyan ve yanıtlayan dokuz uç.

Genel Bakış

İletişim formundan gelen mesajlar bir gelen kutusu gibi çalışır: okunmamışlar, okunanlar, yanıtlananlar, istenmeyenler ve çöp. Dokuz uç bu kutuyu okur, mesajları klasörler arasında taşır ve iki gerçek işlem yapar.

Klasör saklanan bir alan değildir; kaydın durumu ile okunma işaretinden hesaplanır. Bu yüzden bir mesajı okunanlara taşımak durumunu değiştirmez, yalnız işareti çevirir.

İki uç kurulumun dışına çıkar: yanıtlamak ziyaretçiye gerçek bir e-posta gönderir, dönüştürmek ise gerçek bir destek talebi açar. İkisi de geri alınamaz.

Referans

Mesajları Listeleme

get/api/v1/admin/website/messages
Website/GetMessages admin

İletişim formundan gelen mesajları klasöre göre döndürür.

Sorgu 4
folderstringHangi klasör: unread, read, replied, spam, trash. Öntanımlı olarak okunmamışlar.
searchstringMesajlarda arar.
pageintKaçıncı sayfa.
limitintSayfa başına kayıt. En çok yüz.
Dönen alanlar data[] — 16 + meta — 5
idintMesajın numarası.
full_namestringGönderenin adı.
emailstringGönderenin e-postası.
phonestringGönderenin telefonu.
messagestringMesajın metni.
ipstringMesajın geldiği adres.
langstringFormun doldurulduğu dil.
statusstringKaydın ham durumu. Normal, yanıtlandı, istenmeyen ya da çöp.
folderstringHesaplanan klasör: unread, read, replied, spam, trash. Durum ile okunma işaretinden türer.
unreadintOkunma işareti. Ters mantık: sıfır okunmamış, bir okunmuş demektir.
admin_messagestringGönderilen yanıtın metni.
replied_byintYanıtı yazan yönetici.
replied_atstring | nullYanıtın gönderildiği an.
converted_to_ticket_idintDönüştürüldüğü destek talebi. Sıfır, henüz dönüştürülmedi demektir.
read_byobjectMesajı kimin ne zaman okuduğu.
created_atstring | nullGönderilme anı.
totalintKlasördeki toplam mesaj. Meta altında döner.
pageintBulunulan sayfa.
limitintSayfa boyutu.
folder stringListelenen klasör.
next_pageintSonraki sayfa. Sıfır, son sayfadasınız demektir.
Hatalar 2
invalid_folder422Klasör tanınmıyor.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/website/messages?folder=unread' \
  -H "Authorization: Bearer $API_KEY"
const url = new URL('https://panel.ornek.com/api/v1/admin/website/messages');
url.searchParams.set('folder', 'unread');

const res  = await fetch(url, {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/messages?' . http_build_query(['folder' => 'unread']));
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Okunma isareti TERSTIR: sifir okunmamis demektir, bir okunmus.
$msgs   = Api::Website()->GetMessages([], ['folder' => 'unread'])['data'];
$isRead = $msgs[0]['unread'] === 1;

Mesaj Detayı

get/api/v1/admin/website/messages/{id}
Website/GetMessage admin

Tek bir mesajı döndürür.

Dönen alanlar data — 16
idintMesajın numarası.
full_namestringGönderenin adı.
emailstringGönderenin e-postası.
phonestringGönderenin telefonu.
messagestringMesajın metni.
ipstringMesajın geldiği adres.
langstringFormun doldurulduğu dil.
statusstringKaydın ham durumu. Normal, yanıtlandı, istenmeyen ya da çöp.
folderstringHesaplanan klasör: unread, read, replied, spam, trash. Durum ile okunma işaretinden türer.
unreadintOkunma işareti. Ters mantık: sıfır okunmamış, bir okunmuş demektir.
admin_messagestringGönderilen yanıtın metni.
replied_byintYanıtı yazan yönetici.
replied_atstring | nullYanıtın gönderildiği an.
converted_to_ticket_idintDönüştürüldüğü destek talebi. Sıfır, henüz dönüştürülmedi demektir.
read_byobjectMesajı kimin ne zaman okuduğu.
created_atstring | nullGönderilme anı.
Hatalar 2
message_not_found404Mesaj bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/website/messages/20' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch(`https://panel.ornek.com/api/v1/admin/website/messages/${id}`, {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/messages/' . $id);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Okumak mesaji OKUNDU YAPMAZ; isaret ayri bir cagriyla konur.
$msg = Api::Website()->GetMessage(['id' => $id])['data'];

Mesajları Toplu Taşıma

post/api/v1/admin/website/messages/bulk-move
Website/BulkMoveMessages admin göndereni engelleyebilir

Birden çok mesajı tek çağrıda başka bir klasöre taşır.

Gövde 4
idsarrayreqTaşınacak mesaj numaraları.
folderstringreqHedef klasör: unread, read, replied, spam, trash.
block_emailsboolGönderenin e-postasını ve telefonunu yasaklılar listesine ekler. Yalnız istenmeyen klasöründe işler.
report_spamboolGönderenin adresini engeller. Yalnız istenmeyen klasöründe işler.
Dönen alanlar data — 2
movedintTaşınan mesaj sayısı.
folderstringTaşındıkları klasör.
Hatalar 3
ids_required422Hiç mesaj verilmedi.
invalid_folder422Klasör tanınmıyor.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/admin/website/messages/bulk-move' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"ids":[20,21],"folder":"trash"}'
const res = await fetch('https://panel.ornek.com/api/v1/admin/website/messages/bulk-move', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ ids: [20, 21], folder: 'trash' }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/messages/bulk-move');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['ids' => [20, 21], 'folder' => 'trash']),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Iki secenek MESAJIN OTESINE gecer: gonderen yasaklanir ve adresi engellenir.
Api::Website()->BulkMoveMessages([
    'ids'          => $ids,
    'folder'       => 'spam',
    'block_emails' => true,
    'report_spam'  => true,
]);

Klasörü Boşaltma

post/api/v1/admin/website/messages/empty-folder
Website/EmptyMessageFolder admin kalıcı silme

İstenmeyen ya da çöp klasörünü tümüyle boşaltır.

Gövde 1
folderstringreqBoşaltılacak klasör. Yalnız istenmeyen ve çöp klasörleri boşaltılabilir.
Dönen alanlar data — 1
emptiedstringBoşaltılan klasör.
Hatalar 2
invalid_folder422Bu klasör boşaltılamaz.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/admin/website/messages/empty-folder' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"folder":"trash"}'
const res = await fetch('https://panel.ornek.com/api/v1/admin/website/messages/empty-folder', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ folder: 'trash' }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/messages/empty-folder');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['folder' => 'trash']),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Kac kayit gittigini SOYLEMEZ ve geri alinamaz; once klasoru listeleyip sayin.
$before = Api::Website()->GetMessages([], ['folder' => 'trash'])['meta']['total'];
Api::Website()->EmptyMessageFolder(['folder' => 'trash']);

Tek Mesajı Taşıma

put/api/v1/admin/website/messages/{id}/folder
Website/SetMessageFolder admin

Tek bir mesajı başka bir klasöre taşır.

Gövde 3
folderstringreqHedef klasör: unread, read, replied, spam, trash.
block_emailsboolGöndereni yasaklılar listesine ekler.
report_spamboolGönderenin adresini engeller.
Dönen alanlar data — 16
dataobjectGüncel mesaj. Detay ucuyla aynı şekildedir.
Hatalar 3
message_not_found404Mesaj bulunamadı.
invalid_folder422Klasör tanınmıyor.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X PUT 'https://panel.ornek.com/api/v1/admin/website/messages/20/folder' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"folder":"read"}'
const res = await fetch(`https://panel.ornek.com/api/v1/admin/website/messages/${id}/folder`, {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ folder: 'read' }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/messages/' . $id . '/folder');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['folder' => 'read']),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Okundu/okunmadi klasoru DURUMU degistirmez, yalniz okunma isaretini cevirir.
Api::Website()->SetMessageFolder(['id' => $id, 'folder' => 'read']);

Okundu İşaretleme

post/api/v1/admin/website/messages/{id}/read
Website/ReadMessage admin

Mesajı okundu yapar ve okuyanı kaydeder.

Gövde —
——Gövde gerekmez, boş gönderin. Mesajı adresteki kimlik belirler.
Dönen alanlar data — 16
dataobjectGüncel mesaj. Okuyan yönetici okuyanlar haritasına girer.
Hatalar 2
message_not_found404Mesaj bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/admin/website/messages/20/read' \
  -H "Authorization: Bearer $API_KEY"
const res = await fetch(`https://panel.ornek.com/api/v1/admin/website/messages/${id}/read`, {
  method: 'POST',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/messages/' . $id . '/read');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Okuyanlar haritasi HER yoneticiyi ayri tutar; isaret ise tum panel icin tektir.
Api::Website()->ReadMessage(['id' => $id]);

Mesajı Yanıtlama

post/api/v1/admin/website/messages/{id}/reply
Website/ReplyMessage admin gerçek e-posta gider

Ziyaretçiye e-posta yanıtı gönderir ve mesajı yanıtlandı yapar.

Gövde 3
messagestringreqGönderilecek yanıt metni.
save_as_templateintYanıtı ileride kullanmak üzere saklar.
template_namestringSaklanacak yanıtın adı. Saklamayı istediğinizde gerekir.
Dönen alanlar data — 16
dataobjectGüncel mesaj. Durumu yanıtlandı olur.
Hatalar 5
message_not_found404Mesaj bulunamadı.
message_required422Yanıt metni boş.
template_name_required422Saklama istendi ama ad verilmedi.
reply_failed422E-posta gönderilemedi.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/admin/website/messages/20/reply' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"message":"Ilginiz icin tesekkurler, en kisa surede donecegiz."}'
const res = await fetch(`https://panel.ornek.com/api/v1/admin/website/messages/${id}/reply`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    message: "Thanks for reaching out - we'll get back to you shortly.",
  }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/messages/' . $id . '/reply');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'message' => 'Thanks for reaching out.',
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Bu cagri ZIYARETCIYE POSTA GONDERIR ve geri alinamaz; metni once dogrulayin.
Api::Website()->ReplyMessage([
    'id'      => $id,
    'message' => $text,
]);

Destek Talebine Dönüştürme

post/api/v1/admin/website/messages/{id}/convert-to-ticket
Website/ConvertMessageToTicket admin gerçek talep açar

Mesajdan bir destek talebi açar ve ikisini birbirine bağlar.

Gövde 4
departmentintreqTalebin gideceği departman.
priorityintTalebin önceliği.
staffintTalebe atanacak yönetici.
notesstringTalebe düşülecek dahili not.
Dönen alanlar data — 2
ticket_idintAçılan destek talebinin numarası.
message_idintKaynak mesajın numarası.
Hatalar 5
message_not_found404Mesaj bulunamadı.
department_required422Departman verilmedi.
blocked_by_gate422Bir kanca dönüştürmeyi reddetti.
ticket_failed500Talep açılamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/admin/website/messages/20/convert-to-ticket' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"department":1,"priority":2}'
const res = await fetch(`https://panel.ornek.com/api/v1/admin/website/messages/${id}/convert-to-ticket`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ department: 1, priority: 2 }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/messages/' . $id . '/convert-to-ticket');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['department' => 1, 'priority' => 2]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Mesaj hangi talebe dondugunu TASIR; ikinci kez donusturmeden once ona bakin.
$msg = Api::Website()->GetMessage(['id' => $id])['data'];
if ($msg['converted_to_ticket_id'] === 0)
    Api::Website()->ConvertMessageToTicket(['id' => $id, 'department' => 1]);

Mesajı Silme

delete/api/v1/admin/website/messages/{id}
Website/DeleteMessage admin

Tek bir mesajı kalıcı olarak kaldırır.

Dönen alanlar data — 2
deletedboolSilme çalıştı mı.
idintSilinen mesajın numarası.
Hatalar 2
message_not_found404Mesaj bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/website/messages/20' \
  -H "Authorization: Bearer $API_KEY"
const res = await fetch(`https://panel.ornek.com/api/v1/admin/website/messages/${id}`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/messages/' . $id);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Silmek yerine COPE tasiyin: kayit durur, kutu temiz kalir, gerekirse geri alinir.
Api::Website()->SetMessageFolder(['id' => $id, 'folder' => 'trash']);

Tuzaklar

Okunma işareti ters çalışır

Okunma alanında sıfır okunmamış, bir okunmuş demektir. Adı okunmamışı çağrıştırdığı için buradaki mantık çoğu kez ters okunur ve gelen kutusu sayacı yanlış çıkar. Bir mesajın okunup okunmadığını sınarken bire karşı sınayın, doğruluk değerine güvenmeyin.

Klasör saklanmaz, hesaplanır

Kayıtta duran şey durum ve okunma işaretidir; klasör bu ikisinden türetilir. Bir mesajı okunanlara taşımak durumu değiştirmez, işareti çevirir; istenmeyene ya da çöpe taşımak ise durumu değiştirir. Kendi tarafınızda klasöre göre süzme yaparken hesaplanan alanı kullanın, ham durumu değil.

İstenmeyene taşımak göndereni engelleyebilir

Taşıma çağrılarının iki seçeneği mesajın çok ötesine geçer: biri gönderenin e-postasını ve telefonunu yasaklılar listesine ekler, diğeri adresini engeller. İkisi de kurulum genelinde etkilidir ve o kişinin bir daha form doldurmasını engeller. Toplu temizlik yaparken bu seçenekleri kapalı bırakın.

Yanıt gerçekten gönderilir

Yanıt ucu bir taslak kaydetmez; ziyaretçiye gerçek bir e-posta gönderir ve gönderilen posta geri alınamaz. Aynı şekilde dönüştürme ucu gerçek bir destek talebi açar. Bir betikte bu iki çağrıyı denerken kendi adresinize giden bir test kaydı kullanın.

Klasör boşaltmak kalıcıdır ve sayı vermez

Boşaltma çağrısı yalnız istenmeyen ve çöp klasörlerinde çalışır, ama orada her şeyi kalıcı olarak siler ve kaç kaydın gittiğini söylemez. Yanıt yalnız hangi klasörün boşaltıldığını verir. Kayıt tutmanız gerekiyorsa boşaltmadan önce klasörü listeleyin.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.