Dasturchilar → Qo‘llanmalar

Ilovangizda email qabul qiling

Qoʻllab-quvvatlash murojaatlari, bildirishnomalarga javoblar, botga yuborilgan hujjatlar: domeningizdagi manzilga kelgan xat HTTPS endpointingizga matn, HTML va barcha ilovalar bilan bitta imzolangan JSON POST sifatida yetib keladi. Pochta qutisini tekshirib turish ham, IMAP ham kerak emas.

Sizga nima kerak

  • NameOcean da roʻyxatdan oʻtkazilgan domen: bunday domenlar uchun yoʻnaltirish va xatni webhook ga yuborish bepul.
  • Ochiq manzildagi, 20 soniya ichida javob beradigan HTTPS endpoint.
  • nameocean CLI yoki email:write ruxsatiga ega API kaliti.

1. Domen uchun yoʻnaltirishni yoqing

nameocean
$ nameocean email forwards on example.com

Bu buyruq domenning MX yozuvini NameOcean pochta yoʻnaltiruvchilariga qaratadi. Agar domenda boshqa joydagi pochta qutilari uchun MX yozuvlari allaqachon boʻlsa, buyruq toʻxtaydi va ularni koʻrsatadi: domenga keladigan barcha xatlar bu yerga oʻtadi. --replace-mx ni faqat aynan shuni xohlasangiz qoʻshing.

2. Xatni webhook ga yuborish imkoniyatini soʻrang

Spam relaylarining oldini olish uchun xatlarni URL ga yuborish har bir hisob uchun qisqa tekshiruvdan soʻng ochiladi. Domen sahifasida, Boshqaruv paneli → Email yoʻnaltirish boʻlimida undan nima uchun foydalanishingizni bir qatorda yozib, soʻrov yuboring. Ungacha API 403 not_approved javobini qaytaradi.

3. Manzilni endpointingizga yoʻnaltiring

nameocean
$ nameocean email inbound add example.com support https://app.example.com/hooks/mail
curl
$ curl -X POST https://nameocean.net/api/v1/email/forwarding/example.com/webhooks \
    -H "Authorization: Bearer $NAMEOCEAN_API_KEY" -H "Content-Type: application/json" \
    -d '{"localpart": "support", "url": "https://app.example.com/hooks/mail"}'

Javobda imzo maxfiy kaliti (whsec_…) boʻladi; uni ilovangiz sozlamalarida saqlang. localpart * domenning oʻz aliasi boʻlmagan barcha manzillarini yuboradi. Bitta domenda bunday webhooklardan uchtagacha boʻlishi mumkin.

4. Uni qabul qiling

Imzoni xom body boʻyicha tekshiring, soʻng JSON ni oʻqing. Kichik Flask qabul qiluvchi:

app.py
import base64, hashlib, hmac, json, os, time

from flask import Flask, abort, request

app = Flask(__name__)
SECRET = os.environ["NAMEOCEAN_WEBHOOK_SECRET"]  # whsec_...


def verified(header, body, tolerance=300):
    fields = dict(part.split("=", 1) for part in header.split(",") if "=" in part)
    ts = int(fields.get("t", "0"))
    if abs(time.time() - ts) > tolerance:
        return False
    expected = hmac.new(SECRET.encode(), f"{ts}.".encode() + body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, fields.get("v1", ""))


@app.post("/hooks/mail")
def mail():
    body = request.get_data()
    if not verified(request.headers.get("X-NameOcean-Signature", ""), body):
        abort(401)
    mail = json.loads(body)
    print(mail["envelope"]["from"], "→", mail["envelope"]["to"], mail["subject"])
    for a in mail["attachments"]:
        data = base64.b64decode(a["content_base64"])
        print("  attachment", a["filename"], a["content_type"], len(data), "bytes")
    return "", 204  # any 2xx: delivered

Nima keladi

POST https://app.example.com/hooks/mail
X-NameOcean-Event: email.received
X-NameOcean-Delivery: 6f1c2a4e-8b3d-4f5a-9c7e-1d2b3a4c5e6f
X-NameOcean-Signature: t=1794300000,v1=5f2b…

{
  "id": "6f1c2a4e-8b3d-4f5a-9c7e-1d2b3a4c5e6f",
  "event": "email.received",
  "received_at": "2026-11-11T09:30:12+00:00",
  "envelope": {"from": "alice@example.org", "to": "support@example.com"},
  "from": "Alice <alice@example.org>",
  "to": "support@example.com",
  "cc": null,
  "reply_to": null,
  "subject": "Order 1042",
  "date": "Wed, 11 Nov 2026 09:30:05 +0000",
  "message_id": "<…@example.org>",
  "in_reply_to": null,
  "references": null,
  "text": "Hi…",
  "html": "<p>Hi…</p>",
  "headers": [["From", "Alice <alice@example.org>"], …],
  "attachments": [{"filename": "invoice.pdf", "content_type": "application/pdf", "content_id": null,
                   "size": 48211, "content_base64": "JVBERi0…"}],
  "spam_score": 0.4,
  "size": 66120
}

Xat qayta yuborilganda id oʻzgarmaydi, shuning uchun takroriy xatlarni oʻtkazib yuborish uchun undan foydalaning. in_reply_to va references sizning qaysi xatingizga javob berilganini koʻrsatadi.

Endpointingiz ishlamay qolganda

  • 2xx javobi yetkazildi degani. 408, 429, 5xx, vaqt tugashi (20 soniya) yoki ulanish yoʻqligida 6 soat davomida qayta urinib koʻriladi.
  • Boshqa har qanday 4xx yakuniy hisoblanadi: xat oʻz-oʻzidan qayta yuborilmaydi.
  • Yuborib boʻlmagan xatlar 30 kun saqlanadi. Ularni nameocean email forwards log example.com (yoki GET /email/forwarding/example.com/messages) orqali toping va qayta chiqaring: xat xuddi shu id bilan yana bir marta yuboriladi.
  • Har bir domen uchun kuniga 500 tagacha xat webhooklarga yuboriladi; undan ortig'i ham xuddi shunday ushlab turiladi.