Заявки за поддръжка, отговори на известия, документи, изпратени до бот: писмата до адрес на Вашия домейн пристигат на Вашия HTTPS адрес като една подписана JSON POST заявка с текста, HTML и всички прикачени файлове. Без пощенска кутия за проверяване и без IMAP.
email:write.$ nameocean email forwards on example.com
Това насочва MX записа на домейна към сървърите за пренасочване на поща на NameOcean. Ако домейнът вече има MX записи за пощенски кутии другаде, командата спира и ги показва: цялата поща за домейна би се пренасочила тук. Добавете --replace-mx само ако наистина искате това.
Изпращането на поща към URL се активира за всеки акаунт след кратка проверка, за да се предотвратят спам релета. На страницата на домейна в Табло → Пренасочване на имейли подайте заявка с кратко описание за какво ще го използвате. Дотогава API отговаря с 403 not_approved.
$ nameocean email inbound add example.com support https://app.example.com/hooks/mail
$ 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.
Проверете подписа върху необработеното тяло на заявката, след това прочетете JSON. Малък приемник с Flask:
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
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 показват на кое от Вашите писма е отговорено.
nameocean email forwards log example.com (или GET /email/forwarding/example.com/messages) и ги освободете: те се изпращат още веднъж със същия id.