本文へ移動
ログイン

メール API 開発者ガイド

API キーは HMAC-SHA256 を使用。メソッド・パス・クエリ・本文を署名し、再試行時のみ request_id を再利用して nonce は更新してください。

API キーを設定

キーはサーバー側で保存し、ブラウザのコードに含めないでください。

export DOTMAIL_API_KEY='YOUR_PERSONAL_API_KEY'
export DOTMAIL_SITE='example.test'
# Optional: local development
# export DOTMAIL_BASE_URL='http://localhost:8000'

サンプルを実行するターミナルで環境変数を設定してください。DOTMAIL_BASE_URL の既定値は https://dotmail.cc です。DOTMAIL_SITE はご利用のサイトに変更してください。

連携サンプル

各サンプルは受信箱を 1 つ割り当て、5 秒間隔で最大 60 秒確認し、最初の新着メールの本文を取得して、最後に割り当てを解除します。

Python 3 · 標準ライブラリのみ。追加パッケージは不要です。

python3 dotmail.py

dotmail.py

# Python 3 · run on your server, keep the key private.
import hashlib
import hmac
import json
import os
import secrets
import time
import urllib.request
from urllib.parse import quote, urlencode

BASE = os.getenv("DOTMAIL_BASE_URL", "https://dotmail.cc").rstrip("/")
KEY = os.environ["DOTMAIL_API_KEY"]


def call(method, path, payload=None, query=""):
    body = json.dumps(payload, separators=(",", ":")).encode() if payload is not None else b""
    stamp, nonce = str(int(time.time())), secrets.token_hex(16)
    canonical = "\n".join([method, path, query, stamp, nonce, hashlib.sha256(body).hexdigest()])
    signature = hmac.new(KEY.encode(), canonical.encode(), hashlib.sha256).hexdigest()
    req = urllib.request.Request(BASE + path + ("?" + query if query else ""),
        data=body if payload is not None else None, method=method, headers={
        "X-Api-Key": KEY, "X-Timestamp": stamp, "X-Nonce": nonce,
        "X-Signature": signature, "Content-Type": "application/json"})
    with urllib.request.urlopen(req, timeout=30) as response:
        result = json.load(response)
        if result.get("code") != 200:
            raise RuntimeError(str(result))
        return result["data"]


def main():
    # Reuse this ID if allocation needs retrying; do not create a new charge.
    request_id = os.getenv("DOTMAIL_REQUEST_ID") or secrets.token_hex(16)
    print("request_id:", request_id)
    inbox = call("POST", "/api/v1/external/emails/allocate", {
        "site": os.getenv("DOTMAIL_SITE", "example.test"), "request_id": request_id})
    path = "/api/v1/external/emails/" + quote(inbox["email"], safe="") + "/messages"
    query = urlencode({"allocation_id": inbox["allocation_id"]})
    try:
        print(inbox["email"], inbox["allocation_id"])
        for _ in range(12):
            messages = call("GET", path, query=query)
            if messages["items"]:
                message_id = messages["items"][0]["id"]
                detail = call("GET", path + "/" + str(message_id), query=query)
                print(json.dumps(detail, ensure_ascii=False))
                break
            time.sleep(5)
        else:
            print("No new mail within 60 seconds.")
    finally:
        # Early release is free; it does not refund the allocation charge.
        try:
            call("POST", "/api/v1/external/emails/release", {
                "email": inbox["email"], "allocation_id": inbox["allocation_id"]})
        except Exception as error:
            print("Release failed; retry with the same allocation_id:", error)


if __name__ == "__main__":
    main()

HMAC-SHA256 署名

以下の 6 項目を改行で連結し、API キーで署名します。エンコード済みのパス、クエリ、UTF-8 本文は実際に送信するバイト列と一致させてください。クエリがない場合と GET の本文は空です。小文字の 16 進署名を X-Signature に設定し、X-Api-Key、X-Timestamp、X-Nonce も送信します。

METHOD
RAW_PATH
RAW_QUERY
UNIX_SECONDS
NONCE
SHA256_HEX(BODY_BYTES)

割り当て成功時に現在の API 料金が引かれ、10 分間専有します。メール取得と解除は無料で、早期解除の返金はありません。出力された request_id を保存し、割り当てがタイムアウトした場合は DOTMAIL_REQUEST_ID に同じ値を設定して、同じサイト・本文で再試行してください。新しい ID は新規割り当てになります。取得・解除には allocation_id が必要です。空の items は同期の待機中を示す場合があります。このサンプルは 1 通を取得します。ページ送りには next_cursor を使用できます。

次の受信箱は、ここから。

自分用の受信箱を取得するか、アプリに API を組み込みましょう。