Разработчици → Ръководства

Получаване на имейли в приложението

Заявки за поддръжка, отговори на известия, документи, изпратени до бот: писмата до адрес на Вашия домейн пристигат на Вашия HTTPS адрес като една подписана JSON POST заявка с текста, HTML и всички прикачени файлове. Без пощенска кутия за проверяване и без IMAP.

Какво Ви е необходимо

  • Домейн, регистриран в NameOcean: пренасочването и имейл към webhook са безплатни за тях.
  • HTTPS адрес, публично достъпен, който отговаря до 20 секунди.
  • CLI инструментът nameocean или API ключ с email:write.

1. Включете пренасочването за домейна

nameocean
$ nameocean email forwards on example.com

Това насочва MX записа на домейна към сървърите за пренасочване на поща на NameOcean. Ако домейнът вече има MX записи за пощенски кутии другаде, командата спира и ги показва: цялата поща за домейна би се пренасочила тук. Добавете --replace-mx само ако наистина искате това.

2. Заявете имейл към webhook

Изпращането на поща към URL се активира за всеки акаунт след кратка проверка, за да се предотвратят спам релета. На страницата на домейна в Табло → Пренасочване на имейли подайте заявка с кратко описание за какво ще го използвате. Дотогава API отговаря с 403 not_approved.

3. Насочете адрес към Вашия endpoint

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"}'

Отговорът съдържа тайния ключ за подписване (whsec_…); съхранявайте го в настройките на приложението си. localpart * изпраща всеки адрес на домейна, който няма собствен псевдоним. Един домейн може да има до три такива webhook.

4. Получете го

Проверете подписа върху необработеното тяло на заявката, след това прочетете JSON. Малък приемник с Flask:

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

Какво пристига

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
}

id остава същият, когато писмото се изпрати повторно, така че го използвайте за пропускане на дубликати. in_reply_to и references показват на кое от Вашите писма е отговорено.

Когато Вашият endpoint не работи

  • Отговор 2xx означава доставено. При 408, 429, 5xx, изтичане на времето (20 секунди) или липса на връзка се правят повторни опити в продължение на 6 часа.
  • Всеки друг 4xx е окончателен: писмото не се изпраща повторно автоматично.
  • Писмата, които не са могли да бъдат изпратени, се пазят 30 дни. Намерете ги с nameocean email forwards log example.com (или GET /email/forwarding/example.com/messages) и ги освободете: те се изпращат още веднъж със същия id.
  • До 500 писма на ден на домейн се изпращат към webhook; писмата над този лимит се задържат по същия начин.