新規のお客様新規アカウントで DNS と CDN の無料プランをご利用いただけます。アカウント作成

SMTP と HTTP API

API キーを作成し、SMTP または HTTP API でメールを送信します。リクエストフィールド、レスポンス、エラーコード、例を掲載しています。

11 分で読めます 更新日 2026年10月20日

ストリームからの送信方法は 2 つあります。任意のアプリケーションやメールライブラリから SMTP で送信する方法と、HTTP API で送信する方法です。どちらも同じ API キー、クォータ、抑制リスト、イベントを使用します。始める前に、送信ドメインを検証し、API キーを作成してください。

API キー

  1. ストリームを開き、API キータブに移動します。
  2. キーを作成をクリックし、production などの 名前を入力して確定します。
  3. 表示されたキーをコピーし、保存しましたをクリックします。キーが表示されるのはこのときだけです。以降、一覧には ytm_aB3dE6gH… のような プレフィックスのみが表示されます。

キーはすべて ytm_ で始まります。1 つのストリームで有効なキーは最大 20 個です。一覧には各キーの最終使用日時が表示されます。キーを廃止するには 失効をクリックします。そのキーを使っているプログラムは直ちに動作しなくなります。キーは所属するストリームでのみ機能します。

警告

API キーはサーバー上で保管してください。ブラウザのコード、モバイルアプリ、公開リポジトリには含めないでください。キーを持っている人は誰でも、お客様のドメインとしてメールを送信できます。

SMTP

ストリームの 概要タブに SMTP の設定が表示されます。

設定値
ホストストリームに表示される SMTP ホスト。通常は smtp.tm.yeapcloud.net
ポートSTARTTLS の場合は 587、TLS の場合は 465
ユーザー名apikey(この語をそのまま入力)
パスワードこのストリームの API キー
カテゴリヘッダーX-Yeap-Category

コンソールに表示されるホストを使用してください。一部のストリームは、独自のホスト名を持つ別のサーバーグループ経由で送信します。

SMTP 送信の仕組みは次のとおりです。

  • From ヘッダーには、ストリームで検証済みのドメインのアドレスを使用する必要があります。
  • 各受信者(To、Cc、Bcc)には、それぞれ独自のメッセージ ID を持つ個別のコピーが送られ、1 通としてカウントされます。
  • カテゴリを設定するには、X-Yeap-Category: password-reset のようなヘッダーを追加します。このヘッダーは配信前に削除されます。使用できる文字は英字、数字、.、_、- で、最大 64 文字です。
  • メッセージのサイズは最大 25 MB で、1 回の SMTP トランザクションあたりの受信者数は最大 1,000 です。
  • すべてのメッセージには、X-TM-ID ヘッダー(送信ログとイベントに表示されるメッセージ ID)と、メールボックスプロバイダーのフィードバックループ用の Feedback-ID ヘッダーが付与されます。
  • マーケティングストリームでは、お客様が設定した List-Unsubscribe ヘッダーは、Yeap Cloud のワンクリック配信停止ヘッダーに置き換えられます。SMTP ではメッセージ本文は変更されないため、郵便住所と配信停止リンクはお客様ご自身でコンテンツに追加してください。抑制リストと配信停止をご覧ください。
  • 開封とクリックのトラッキングは HTTP API でのみ利用できます。

Python 標準ライブラリを使った例:

python
import smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg["From"] = "Example <noreply@example.com>"
msg["To"] = "user@example.org"
msg["Subject"] = "Reset your password"
msg["X-Yeap-Category"] = "password-reset"
msg.set_content("Click the link to reset your password: https://example.com/reset/abc")

with smtplib.SMTP("smtp.tm.yeapcloud.net", 587) as s:
    s.starttls()
    s.login("apikey", "ytm_your_api_key")
    s.send_message(msg)

SMTP 応答コード

サーバーがメッセージを拒否した場合、応答コードからその理由がわかります。4xx コードは一時的なもので、後で再試行してください。5xx コードは恒久的なもので、原因を修正してから再送信してください。

コードメッセージ原因と対処
535 5.7.8Authentication failed / API key revokedユーザー名またはキーが誤っているか、キーが失効しています。ユーザー名は apikey である必要があります。
454 4.7.0Temporary authentication failure / Too many authentication failuresサーバーの準備がまだできていないか、お客様の IP のログイン失敗回数が多すぎます。しばらく待ってから再試行してください。
451 4.7.1Stream is pausedストリームが自動的に一時停止されました。ストリームに表示される理由を確認し、サポートにお問い合わせください。
550 5.7.1Stream is banned / suspended / terminatedストリームが禁止された、サブスクリプションが停止された、またはストリームが解放されました。
550 5.7.1From domain … is not verified for this streamドメインを検証するか、ドメインがこのストリームと共用されているか、このストリームにバインドされているかを確認してください。
550 5.7.1Sandbox mode: recipient is not a verified addressストリームがサンドボックスにあります。受信者を検証するか、お客様自身のドメインに送信してください。
550 5.7.1Recipient is on a suppression list / All recipients are suppressedアドレスが抑制されています(バウンス、苦情、配信停止、または手動)。
452 4.7.1Hourly sending limit reached, try later1 時間あたりの上限(またはサンドボックスの 1 日あたりの上限)に達しました。次の時間帯に再試行してください。
550 5.7.1Monthly sending quota exhausted月間送信量を使い切り、超過も許可されていません(無料プランの場合、または超過分の支出上限に達した場合)。
452 4.5.3Too many recipients1 回のトランザクションの受信者が 1,000 を超えています。
553 5.1.3Invalid recipient address受信者アドレスの形式が正しくありません。
554 5.7.1Message rejected: virus detectedメッセージにウイルスが含まれていました。ストリームは直ちに禁止され、すべての API キーが失効します。
554 5.7.1Message rejected as spamコンテンツがスパムと判定されました。拒否が繰り返されるとストリームが一時停止されます。
451 4.3.0Content scanner unavailable, try again laterマーケティングメールはスキャン後にのみ受け付けられます。後で再試行してください。それ以外の 451 4.3.0 応答は一時的なサーバーエラーです。再試行してください。
554 5.6.0Malformed message headersメッセージヘッダーを修正してください。

HTTP API

項目値
ベース URLhttps://api.tm.yeapcloud.net/v1(https://api.yeap.cloud/api/tm/v1 でも利用可能)
認証Authorization: Bearer ytm_your_api_key
形式リクエストとレスポンスの本文は JSON、Content-Type: application/json
レート制限API キーあたり毎分 600 リクエスト

エラー時は、HTTP ステータスコードと次のような本文が返されます。

json
{"error": {"code": "invalid_request", "message": "subject is required (single line)"}}
HTTP ステータスerror.code意味
400invalid_json, invalid_request本文が JSON オブジェクトではない、またはバッチが空か大きすぎます
401unauthorizedAPI キーがない、形式が不正、失効済み、または不明です
403stream_paused, stream_banned, stream_suspendedストリームから送信できません
403from_domain_unverified, invalid_fromFrom ドメインがこのストリームで検証されていない、または From アドレスが無効です
403postal_address_required郵便住所が未設定のマーケティングストリームです。マーケティング設定タブで入力してください。
403virus添付ファイルにウイルスが含まれていました。ストリームは禁止されます。
404not_foundこのストリームにそのメッセージは存在しません
422invalid_requestフィールドが不足しているか無効です。message にどのフィールドかが示されます。
429rate_limited1 分間のリクエストが 600 を超えました。間隔をあけて再試行してください。
503no_node現在利用できる送信サーバーがありません。後で再試行してください。

メッセージの送信:POST /v1/send

フィールド型説明
fromstring必須。noreply@example.com や Example <noreply@example.com> などのアドレス 1 つ。ドメインはストリームで検証済みである必要があります。
tostring または array必須。アドレス 1 つ、カンマ区切りの文字列、または配列。配列の要素は {"email": "...", "name": "..."} 形式のオブジェクトでも構いません。
cc, bccstring または array任意。形式は to と同じです。Bcc のアドレスはヘッダーに表示されません。
reply_tostring または array任意。Reply-To アドレス。
subjectstring必須。1 行、最大 998 文字。
html, textstring少なくとも一方が必須です。最良の結果を得るには両方を送信してください。
headersobject任意の追加ヘッダー({"X-Campaign": "spring"} など)。標準ヘッダー(From、To、Subject、Reply-To、Message-ID、List-Unsubscribe など)はここでは設定できません。
attachmentsarray任意。要素は {"filename": "invoice.pdf", "content_base64": "...", "type": "application/pdf"}。最大 10 ファイル、合計 10 MB まで。
categorystring任意。英字、数字、.、_、-、最大 64 文字。
tags文字列の array任意。独自の絞り込み用のタグを最大 10 個、各タグ最大 64 文字。
track_opens, track_clicksboolean任意。このメッセージの開封トラッキング(トラッキングピクセル)とクリックトラッキング(リンクを t.tm.yeapcloud.net 経由に書き換え)のオン/オフを切り替えます。HTML のみ。省略した場合はストリームの既定値が適用されます。どちらも既定ではオフです。
variablesobject任意。subject、html、text 内の {{name}} プレースホルダーを置き換えます。html では値が HTML エスケープされます。不明なプレースホルダーはそのまま残ります。

1 回の呼び出しで指定できる受信者は、to、cc、bcc の合計で最大 50 です。各受信者には、独自のメッセージ ID を持つ個別のコピーが送られます。多数の相手に異なる内容を送信するには、バッチエンドポイントを使用してください。

例:

bash
curl -X POST https://api.tm.yeapcloud.net/v1/send \
  -H "Authorization: Bearer ytm_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "Example <noreply@example.com>",
    "to": ["alice@example.org"],
    "subject": "Your order {{order_id}} has shipped",
    "html": "<p>Hi {{name}}, your order is on its way.</p>",
    "text": "Hi {{name}}, your order is on its way.",
    "category": "shipping",
    "tags": ["order"],
    "variables": {"name": "Alice", "order_id": "A-1024"}
  }'

レスポンス:

json
{
  "message_ids": ["01JAQ3Z9V8K4M2N6P7R5S1T0XW"],
  "rejected": []
}

message_ids には受け付けられたコピーが一覧表示されます。rejected には送信されなかった受信者が、それぞれ rcpt と reason 付きで一覧表示されます。一部、あるいはすべての受信者が拒否されても呼び出し自体は成功する場合があるため、必ず rejected を確認してください。

reason意味
invalid_recipientアドレスが無効です
suppressed:<scope>:<reason>アドレスが抑制リストに含まれています(例:suppressed:global:hard_bounce)
sandbox_recipient_not_verifiedストリームがサンドボックスにあり、その受信者は許可されていません
rate_limited_hourly, rate_limited_sandbox_or_hourly1 時間あたりの上限(またはサンドボックスの 1 日あたりの上限)に達しました
monthly_quota_exceeded月間送信量を使い切り、超過も許可されていません
enqueue_failedメッセージをキューに入れられませんでした。クォータにはカウントされません。再試行してください。

requests を使った Python の例:

python
import requests

resp = requests.post(
    "https://api.tm.yeapcloud.net/v1/send",
    headers={"Authorization": "Bearer ytm_your_api_key"},
    json={
        "from": "Example <noreply@example.com>",
        "to": "alice@example.org",
        "subject": "Welcome",
        "html": "<p>Welcome aboard!</p>",
        "text": "Welcome aboard!",
        "category": "welcome",
    },
    timeout=30,
)
resp.raise_for_status()
result = resp.json()
print(result["message_ids"], result["rejected"])

一括送信:POST /v1/batch

1 回のリクエストで最大 500 件のメッセージを送信できます。各要素のフィールドは /v1/send と同じです。

json
{
  "messages": [
    {"from": "noreply@example.com", "to": "a@example.org", "subject": "Hi A", "text": "Hello A"},
    {"from": "noreply@example.com", "to": "b@example.org", "subject": "Hi B", "text": "Hello B"}
  ]
}

レスポンスには、メッセージごとの結果が同じ順序で 1 つずつ含まれます。

json
{
  "results": [
    {"index": 0, "message_ids": ["01JAQ..."], "rejected": []},
    {"index": 1, "error": {"code": "invalid_request", "message": "subject is required (single line)"}, "rejected": []}
  ]
}

メッセージの照会:GET /v1/messages

クエリパラメーター説明
statusステータスで絞り込みます:queued、delivered、deferred、bounced、complained、rejected、failed
to受信者アドレスで絞り込みます
sinceこの日時以降に作成されたメッセージのみ(2026-10-01T00:00:00Z など)
limit1 ページあたりの件数、1–100(既定は 50)
before次のページを取得するには、前のレスポンスの next_before の値を渡します

レスポンスは {"data": [...], "next_before": "..."} です。最後のページでは next_before が null になります。メッセージは 30 日間保持されます。

GET /v1/messages/{id} は、1 件のメッセージとそのイベントを返します。

json
{
  "id": "01JAQ3Z9V8K4M2N6P7R5S1T0XW",
  "stream_id": 12,
  "source": "api",
  "to": "alice@example.org",
  "from": "Example <noreply@example.com>",
  "subject": "Welcome",
  "category": "welcome",
  "tags": [],
  "status": "delivered",
  "smtp_code": 250,
  "smtp_response": "250 2.0.0 OK",
  "opened_at": null,
  "clicked_at": null,
  "unsubscribed_at": null,
  "created_at": "2026-10-20 10:15:02",
  "updated_at": "2026-10-20 10:15:04",
  "events": [
    {"type": "delivered", "at": "2026-10-20 10:15:04", "rcpt": "alice@example.org", "smtp_code": 250, "mx": "mx.example.org"}
  ]
}

抑制リスト:/v1/suppressions

これらのエンドポイントは、API キーが属するストリームの抑制リストを管理します。

リクエスト本文またはクエリレスポンス
GET /v1/suppressionsクエリ email(任意)、limit(1–500、既定は 100)、offset{"data": [{"id", "scope", "email", "reason", "category", "note", "created_at"}]}
POST /v1/suppressions{"email": "..."} または {"emails": [...]}(最大 1,000)、任意で category{"added": 2, "invalid": []}
DELETE /v1/suppressions{"email": "..."}、任意で category(本文またはクエリ){"removed": 1}

API で追加したアドレスの理由は manual になります。アカウント全体の抑制とグローバル抑制は API では変更できません。抑制リストと配信停止をご覧ください。

関連項目

このページは役に立ちましたか?