Destek talepleri, bildirimlere verilen yanıtlar, bir bota e-postayla gönderilen belgeler: alan adınızdaki bir adrese gelen e-posta, metni, HTML'i ve tüm ekleriyle birlikte HTTPS uç noktanıza tek bir imzalı JSON POST isteği olarak ulaşır. Sürekli kontrol etmeniz gereken bir posta kutusu yok, IMAP yok.
email:write yetkisine sahip bir API anahtarı.$ nameocean email forwards on example.com
Bu işlem, alan adının MX kaydını NameOcean'ın e-posta yönlendiricilerine yönlendirir. Alan adının başka bir yerdeki posta kutuları için zaten MX kayıtları varsa komut durur ve bu kayıtları listeler, çünkü alan adına gelen tüm e-postalar buraya taşınır. --replace-mx seçeneğini yalnızca bunu gerçekten istiyorsanız ekleyin.
Spam aktarıcılarını engellemek için e-postaların bir URL'ye gönderilmesi, kısa bir incelemenin ardından hesap bazında etkinleştirilir. Alan adının Kontrol Paneli → E-posta Yönlendirme altındaki sayfasından, ne için kullanacağınızı belirten kısa bir açıklamayla talepte bulunun. Onaylanana kadar API 403 not_approved yanıtını döndürür.
$ 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"}'
Yanıt, imzalama anahtarını (whsec_…) içerir; bunu uygulamanızın ayarlarında saklayın. localpart değeri * olduğunda, alan adının kendine ait takma adı olmayan tüm adresleri iletilir. Bir alan adında bu webhook'lardan en fazla üç tane olabilir.
İmzayı ham gövde üzerinden doğrulayın, ardından JSON'u okuyun. Küçük bir Flask alıcısı:
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
}
Bir e-posta yeniden gönderildiğinde id aynı kalır; yinelenenleri atlamak için bunu kullanın. in_reply_to ve references, kendi e-postalarınızdan hangisine yanıt verildiğini gösterir.
nameocean email forwards log example.com (veya GET /email/forwarding/example.com/messages) ile bulun ve serbest bırakın: e-posta aynı id ile bir kez daha gönderilir.