見出し画像

【第549回】 Marketing Cloud Next : Direct Email Send API による即時送信

今回の記事では Marketing Cloud Next Growth & Advanced Editions に新たに登場した Direct Email Send API を使用して、外部アプリケーションからトランザクションメールを即時送信する方法を検証します。

※ Direct Email Send API は、プロモーションメールにも対応しています。

Direct Email Send API とは、ウェルカムメール、注文確認、パスワードリセット、アカウント通知など、アプリケーション上の操作に応じて即時送信するメールを想定した API です。

--- メソッド 
POST 

--- エンドポイント
https://api.salesforce.com/automation/actions360/messaging/email/v1?sendDefinitionId=[Send Definition ID]

--- ヘッダー 
Content-Type: application/json
Authorization: Bearer [アクセストークン]

--- ボディ
{
  "to": "n.watanabe@nac-care.com",
  "individualId": "003A8000000Dmp1IAD",
  "attributes": {
    "$content": {
      "LastName": "Takahashi",
      "FirstName": "Miyu",
      "OrderNumber": "ORD-0001",
      "OrderDate": "2026-02-05",
      "ItemName": "Sample Item",
      "ItemQuantity": "1",
      "ItemPrice": "2000",
      "PaymentMethod": "Credit Card",
      "TotalAmount": "2200"
    }
  }
}

オンデマンドフローを経由せず、事前に作成した Send Definition(送信定義)を API リクエストで指定することで、High Scale Flow(HSF)メッセージングサービスを通じてメールが送信されます。

本記事では、External Client App の作成、OAuth 認証、メールコンテンツとSend Definition の準備、プレビュー、実際の送信までを順番に検証します。

手順概要

  1. External Client App を設定する

  2. Talend API Tester をインストールする

  3. OAuth アクセストークンを取得する

  4. トランザクションメールを作成する

  5. Content Variables を設定する

  6. Send Definition を作成する

  7. Direct Email Send API のリクエストを作成する

  8. プレビュー API でメールを確認する

  9. Direct Email Send API を実行してメールを送信する


設定手順

1. External Client App を設定する

Direct Email Send API を呼び出すには、sfap_api スコープを含む OAuth アクセストークンが必要です。

Salesforce の公式ドキュメントでは、次の 2 種類の OAuth フローが案内されています。

  • Authorization Code Flow

  • Client Credentials Flow

Authorization Code Flow は、ユーザーがブラウザ上で Salesforce へログインし、そのユーザーの権限で API を実行する場合に適しています。

一方、Client Credentials Flow は、ユーザーによるログイン操作を必要としないサーバー間連携に適しています。Direct Email Send API は、外部アプリケーションで発生した注文完了やパスワードリセットなどのイベントを起点として、自動的にメールを送信することが主な利用目的です。

そのため、本記事では Client Credentials Flow を使用します。

専用の External Client App を作成する

既存の External Client App に sfap_api スコープを追加する方法も考えられますが、今回はDirect Email Send API 専用の External Client App を新規作成します。

1. 設定から「外部クライアントアプリケーションマネージャー」に移動して、「新規外部クライアントアプリケーション」をクリックします。

2. 「基本情報」の必須項目を入力していきます。

  • 外部クライアントアプリケーション名
    例:Direct Email Send API

    利用用途が分かる名前を入力します。入力すると API 参照名 は自動で設定されます。どちらも内部管理用のため、分かりやすい名前であれば問題ありません。

  • 取引先責任者メール
    利用可能なメールアドレスを入力します。このメールアドレスに通常のAPI 利用で通知が送信されることはありません。アプリケーションの管理者情報(連絡先)として登録するためのものです。

  • 配信状態
    今回は現在の Salesforce 組織内だけで利用するため、「ローカル」 のままで問題ありません。

3. 続いて、API(OAuth 設定の有効化)を開いて OAuth を有効化 します。

4. コールバック URL は入力が必須ですが、実際は使用されませんので、適当な「http://localhost:8082/api/sf/auth/callback」などを入力します。

Tips:Client Credentials Flow では、Authorization Code Flow のようなブラウザリダイレクトは発生しないため、今回の API 実行で Callback URL が使用されることはありません。

OAuth 範囲(スコープ)は、以下の 3 つを選択してください。

  • ① API を使用してユーザーデータを管理 (api)
    Manage user data via APIs (api)

  • ② いつでも要求を実行 (refresh_token, offline_access)
    Perform requests at any time (refresh_token, offline_access)

  • ③ Salesforce API Platform へのアクセス (sfap_api)
    Access the Salesforce API Platform (sfap_api)

Tips:Direct Email Send API で特に重要なのが、③ の sfap_api スコープです。通常の Salesforce REST API で使用する api スコープだけでは、Direct Email Send APIを呼び出せません。

5. 続いて、少し下にスクロールして、以下の 2 つを有効化して「作成」ボタンをクリックします。

  • クライアントログイン情報フロー(Client Credentials Flow)の有効化

  • Issue JSON Web Token (JWT)-based access tokens for named users

Direct Email Send API で使用するアクセストークンは、JSON Web Token(JWT)形式である必要があります。JWT 形式のトークンは、ピリオドで区切られた 3 つの部分で構成されます。

xxxxxxxxxxxxxxxxx.yyyyyyyyyyyyyyy.zzzzzzzzzzzzzzz

6. 続いて、「ポリシー」タブで「編集」ボタンをクリックします。

7. OAuth ポリシーを開いて、「クライアントログイン情報フローを有効化」にチェックを入れて、「(ユーザー名)として実行」に、 Integration User の「ユーザー名」を入力します。Integration User には以下を割り当てます。

  • Marketing Cloud 管理者 権限セットを割り当てます。

  • Marketing Cloud ワークスペース寄稿者権限 を割り当てます。

  • カスタム権限セットを作成し、Access ActivitiesAllow Sending of List Emailsシステム権限 を付与します。

  • 共有設定List EmailDefault Internal AccessPublic Read Only に変更します。

8. また、「IP Relaxation」を次の設定に変更して保存します。

  • Relax IP restrictions

この設定により、信頼済み IP 範囲に登録されていないローカル環境からもAPI を実行できます。

ただし、本番環境では IP 制限を無条件に緩和するのではなく、API を実行するサーバーの固定 IP アドレスを信頼済み IP 範囲へ登録するなど、適切なアクセス制御を行うことが推奨されます。

9. 最後に、「設定」タブに移動して、OAuth 設定を開きます。

10. 「コンシューマー鍵と秘密」のボタンをクリックします。

11. 「モバイル認証」か「パスコード認証」になりますので、認証します。この認証は現在ログインしているシステム管理者のものです。

12. 「コンシューマー鍵」と「コンシューマーの秘密」が表示されます。これは後ほど使うので、コピーしてメモしておくか、このページを開いたままにします。

Tips:Client Secret は自動的に定期ローテーションされることはありません。管理者が明示的に再生成(ローテーション)しない限り、同じ Client Secret を継続して利用できます。


2. Talend API Tester のインストール

今回の API リクエストには、Talend API Tester を使用します。

Google Chrome のウェブストアから Chrome 拡張機能「Talend API Tester」をインストールします。

1. Chrome ウェブストアで「Talend API Tester」を検索します。

2. 「Talend API Tester - Free Edition」をインストールします。

3. インストールが完了したら、Talend API Tester を開きます。


3. OAuth アクセストークンを取得する

それでは、いよいよ「アクセストークン」を取得してみましょう。取得にあたっては、次の 3 つを準備しておく必要があります。

・ 私のドメイン
・ コンシューマー鍵
・ コンシューマーの秘密

1. まず、リクエストタブで新規のリクエストを開き、メソッドを「POST」に設定します。

2. 次に、エンドポイント URL を入力します。

https://[My Domain Name].my.salesforce.com/services/oauth2/token

3. 次に、ヘッダーの設定を行います。以下の内容を入力してください。

Content-Type:application/x-www-form-urlencoded

4. 次に、ボディのセクションの右にある Text のタブを Form に変更します。

5. Add form parameter を 3 回クリックして、3 つのパラメーターが入力できるようにします。

6. name 欄には、以下の 3 つを入力します。

  • grant_type

  • client_id

  • client_secret

7. grant_type には、固定の文字列で「client_credentials」を入力します。

8. 残りの client_id と client_secret は、先ほど取得済みなので、開いているページからコピーして貼り付けます。

9. すべての入力が完了したら、「送信」ボタンをクリックします。

10. 送信後、リクエストが成功(200)していれば、アクセストークンが取得できます。

この設定が、以下になっていることを確認してください。

  • token_format:jwt

  • scope:sfap_api, api

11. 最後に、今回設定したリクエストを後で再利用できるように、名前を付けて保存しておきましょう。


4. トランザクションメールを作成する

続いて、「コンテンツ」タブに移動して、以下のメールテンプレートを「パラグラフ」コンポーネントに貼り付けます。

今回の実装では、REST API からContent Variable を直接受け取る形になります。以下のテンプレートには事前に Content Variable が差し込まれてあります。

{{$content.LastName}} {{$content.FirstName}} 様

このたびはご注文いただき、誠にありがとうございます。
以下の内容でご注文を承りました。

----------------------------------
■ ご注文番号
{{$content.OrderNumber}}

■ ご注文日時
%%=FormatDate(($content.OrderDate), "yyyy年MM月dd日 HH時mm分")=%%

■ ご注文商品
商品名:{{$content.ItemName}}
数量 :{{$content.ItemQuantity}}
価格 :%%=FormatNumber($content.ItemPrice,"N0")=%% 円

■ お支払い方法
{{$content.PaymentMethod}}

■ 合計金額
%%=FormatNumber($content.TotalAmount,"N0")=%% 円
----------------------------------

商品は発送準備が整い次第、改めてご連絡いたします。

ご不明な点がございましたら、本メールへの返信、
またはサポート窓口までお問い合わせください。

今後ともどうぞよろしくお願いいたします。

今回、Summer '26 で新しく登場した「Content Variable」の機能を利用しますので、データソースから以下の変数を追加してください。この値は大文字・小文字を含めて、後に API で設定するものと完全一致する必要があります。

  • LastName(Text 型)

  • FirstName(Text 型)

  • OrderNumber(Text 型)

  • OrderDate(DateTime 型)

  • ItemName(Text 型)

  • ItemQuantity(Text 型)

  • ItemPrice(Number 型)

  • PaymentMethod(Text 型)

  • TotalAmount(Number 型)

コンテンツ変数が設定できたらメールを保存して、公開します。

※ 公開前に「トランザクションメール」に変更してください。

公開済みメールの ManagedContentId(20Y 始まり)を取得してください。

  • 例:20YTK0000170ASm2AM


5. Send Definition を作成する

続いて、送信定義を作成します。

注意:FromAddressが 認識されない一時的な事象について

私が検証した時点では、REST API から Send Definition となる ListEmail レコードを作成する際、FromAddress が正しく認識されない事象が発生しました。

そこで使用した送信元アドレスは、事前に Marketing Cloud Next の「認証済みドメイン(Authenticated Domains)」へ登録しており、次の状態になっていました。

  • ドメインステータス:Active

  • From Address:Active

  • Capability:Outbound

しかし、REST API のリクエストボディに登録済みの FromAddress を指定すると、次のエラーが返されました。

[
  {
    "message": "There were custom validation error(s) encountered while saving the affected record(s). The first validation error encountered was \"invalid email address: FromAddress\".",
    "errorCode": "INVALID_INPUT",
    "fields": [
      "FromAddress"
    ]
  }
]

同じ送信元アドレスは Salesforce の画面から作成した ListEmail レコードには正常に保存できたため、メールアドレスの形式やドメイン認証ではなく、API 経由で FromAddress を検証する処理に一時的な問題が発生していた可能性があります。

一時的な回避策

今回は、オンデマンドフローを一度実行して、ListEmail レコードを無理やり作成し、そのレコード ID を sendDefinitionId として使用することで、プレビューとメール送信を確認しました。

※ ListEmail のステータスが Draft であっても送信可能です。

この事象は一時的な不具合である可能性があるため、同じエラーが発生しない場合は、通常どおり REST API から Send Definition を作成してください。

従来は Talend API Tester から次を実行します。

--- メソッド 
POST 

--- エンドポイント
https://[私のドメイン名].my.salesforce.com/services/data/v67.0/sobjects/ListEmail

--- ヘッダー 
Content-Type:application/json 
Authorization:Bearer [アクセストークン] 

--- ボディ
{
  "Name": "direct-email-send-api@1.0.0",
  "FromName": "NAC Co.,Ltd",
  "FromAddress": "info@mail.nac-care.com",
  "ManagedContentId": "20YTK0000170ASm2AM",
  "MessagePurpose": "Transactional",
  "IsOpenTrackingEnabled": true,
  "IsClickTrackingEnabled": true,
  "Status": "Draft"
}

これが正常に作成されると、次のようなレスポンスが返ります。この id が sendDefinitionId です。

{
  "id": "0XBSG000000NY5p4AG",
  "success": true,
  "errors": []
}

6. Direct Email Send API リクエストの作成

今回は、以下のリクエストを使用します。

--- メソッド 
POST 

--- エンドポイント
https://api.salesforce.com/automation/actions360/messaging/email/v1?sendDefinitionId=[Send Definition ID]

--- ヘッダー 
Content-Type: application/json
Authorization: Bearer [アクセストークン]

--- ボディ
{
  "to": "n.watanabe@nac-care.com",
  "individualId": "003A8000000Dmp1IAD",
  "attributes": {
    "$content": {
      "LastName": "Takahashi",
      "FirstName": "Miyu",
      "OrderNumber": "ORD-0001",
      "OrderDate": "2026-02-05",
      "ItemName": "Sample Item",
      "ItemQuantity": "1",
      "ItemPrice": "2000",
      "PaymentMethod": "Credit Card",
      "TotalAmount": "2200"
    }
  }
}
  • sendDefinitionId には、先ほど作成した Send Definition(ListEmail レコード)の ID を指定します。

  • to(メールアドレス)は必須項目です。実際に CRM に登録されているものである必要はありません。

  • 受信者を小文字始まりの individualId で指定します。Email Engagement での識別子として利用します。こちらも CRM に登録されているものである必要はありません。どのような値でも送信可能です。

  • パーソナライズデータは attributes に格納します。大文字・小文字も含めて Content Variable と完全一致させて下さい。

  • こちらの API は、ホスト、パス、OAuth スコープ、API バージョンの違いから、標準の Salesforce REST API とは別の API として提供されています。そのため、標準の Salesforce REST API に適用される API コール数などの利用制限とは別に管理されています。


7. プレビュー API でメールを確認する

ここで、実際にメールを送信する前に、プレビュー API を使用してレンダリング結果を確認します。

エンドポイントだけを次のように変更し、ヘッダーとボディには、上と同じ内容を指定します。

--- エンドポイント
https://api.salesforce.com/automation/actions360/messaging/email/v1/preview?sendDefinitionId=[Send Definition ID]

次の内容を確認します。

  • 姓名が正しく表示されている

  • 注文日が「2026年07月31日 12時25分」と表示されている

  • 商品価格が「2,000 円」と表示されている

  • 合計金額が「2,200 円」と表示されている

  • メール本文が空になっていない

  • 指定したindividualIdが受信者として解決される

{
"response":{
"subject": "Direct Email Send API",
"body": "<!doctype html>\n<html lang=\"\" dir=\"ltr\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width,initial-scale=1 user-scalable=yes\">\n    <meta name=\"format-detection\" content=\"telephone=no, date=no, address=no, email=no, url=no\">\n    <meta name=\"x-apple-disable-message-reformatting\">\n    <meta name=\"color-scheme\" content=\"light dark\">\n    <meta name=\"supported-color-schemes\" content=\"light dark\">\n    <title>Email</title>\n    <!--[if mso]>\n      <noscript>\n        <xml>\n          <o:OfficeDocumentSettings>\n            <o:PixelsPerInch>96</o:PixelsPerInch>\n          </o:OfficeDocumentSettings>\n        </xml>\n      </noscript>\n    <![endif]-->\n    \n    <style type=\"text/css\">\n      a {\n        text-decoration: none;\n      }\n      h1 {\n        font-size: 2em;\n      }\n      h2 {\n        font-size: 1.5em;\n      }\n      h3 {\n        font-size: 1.17em;\n      }\n      h4,\n      p {\n        font-size: 1em;\n      }\n      h5 {\n        font-size: 0.83em;\n      }\n      h6 {\n        font-size: 0.67em;\n      }\n      table,\n      td {\n        border-collapse: collapse;\n        mso-table-lspace: 0pt;\n        mso-table-rspace: 0pt;\n      }\n      @media (prefers-color-scheme: dark) {\n        .darkTarget {\n            color: #FFFFFF !important;\n            background-color: #121212 !important;\n        }\n        .dark-highlight {\n            color: #121212 !important;\n        }\n      }\n      @media only screen and (max-width: 600px) {\n        .responsive-container,\n        .email-body {\n          width: 100% !important;\n        }\n        \n        .responsive-container .sfdc-cms-column,\n        .responsive-container > .sfdc-cms-repeater-column {\n          width: 100% !important;\n          display: block !important;\n        }\n      }\n    </style>\n  </head>\n  <body class=\"body\" style=\"\n      -webkit-text-size-adjust: 100%;\n      text-size-adjust: 100%;\n      margin: 0;\n      padding: 0;\n    \">\n    <div style=\"display: none\"></div>\n    \n    <div style=\"font-size: 0; line-height: 0; max-height: 0; max-width: 0\">\n      <img src=\"data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==\" width=\"1\" height=\"1\" alt=\"\">\n    </div>\n    \n    <div role=\"article\" aria-roledescription=\"email\" aria-label=\"Direct Email Send API\" lang=\"\" dir=\"ltr\" style=\"font-size: medium; font-size: max(16px, 1rem); width: 100%\">\n      <table class=\"darkTarget\" style=\"background-size:cover;background-position:center center;background-repeat:no-repeat;background-color:#f3f3f3; min-width: 100%\" role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\">\n        <tbody><tr>\n          <td>\n            <table class=\"email-body \" style=\"background-color:#ffffff; max-width: 100%\" role=\"presentation\" width=\"600\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\">\n              <tbody><tr>\n                <td style=\"\n                  padding:0px 0px 0px 0px;\n                  min-width: 100%;\n                  \">\n                  \n<!--[if mso]>\n  <table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" role=\"presentation\" style=\"max-width:100%;\">\n    <tr>\n      <td style=\"padding:0px 0px 0px 0px;\">\n        <table cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" width=\"100%\" style=\"min-width: 100%;\">\n          <tr>\n            <td class=\"darkTarget\" style=\"padding:8px 8px 8px 8px;border-color:#747474;background-color:#ffffff;color:#000000;background-size:cover;background-position:center center;background-repeat:no-repeat;\n                \">\n              <table data-sfdc-cms-section=\"true\"class=\"responsive-container\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" role=\"presentation\" style=\"min-width: 100%;\">\n                <tr>\n<![endif]-->\n<!--[if !mso]><!-->\n  <div data-sfdc-cms-section-outer-wrapper=\"true\" style=\"padding:0px 0px 0px 0px;\n        \">\n    <div data-sfdc-cms-section-inner-wrapper=\"true\" class=\"darkTarget\" style=\"padding:8px 8px 8px 8px;border-color:#747474;background-color:#ffffff;color:#000000;background-size:cover;background-position:center center;background-repeat:no-repeat;\n          \">\n      <div data-sfdc-cms-section=\"true\" style=\"display:table; width:100%;\" class=\"responsive-container\">\n<!--<![endif]-->\n        \n<!--[if mso]>\n  <td data-sfdc-cms-column=\"true\" class=\"sfdc-cms-column\" align=\"center\" valign=\"top\" width=\"100.0%\">\n    <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" role=\"presentation\" width=\"100%\" style=\"max-width:100%;\">\n      <tr>\n        <td style=\"padding:0px 0px 0px 0px;\n        \">\n          <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" role=\"presentation\" width=\"100%\"  style=\"min-width: 100%;\">\n            <tr>\n              <td class=\"darkTarget\" style=\"padding:8px 8px 8px 8px;border-color:#747474;background-color:#ffffff;color:#000000;background-size:cover;background-position:center center;background-repeat:no-repeat;\n                  \">\n<![endif]-->\n<!--[if !mso]><!-->\n<div data-sfdc-cms-column=\"true\" class=\"sfdc-cms-column\" style=\"display:table-cell; width:100.0%; vertical-align:top;\">\n  <div data-sfdc-cms-column-outer-style-wrapper=\"true\" style=\"padding:0px 0px 0px 0px;\">\n    <div class=\"darkTarget\" data-sfdc-cms-column-inner-style-wrapper=\"true\" style=\"padding:8px 8px 8px 8px;border-color:#747474;background-color:#ffffff;color:#000000;background-size:cover;background-position:center center;background-repeat:no-repeat;\n                  \">\n      <!--<![endif]-->\n      \n<table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" role=\"presentation\" style=\"min-width: 100%;\">      <tbody><tr><td style=\"padding:0px 0px 0px 0px;\"><table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" role=\"presentation\" class=\"darkTarget\" style=\"min-width: 100%;border-color:#747474;background-color:#ffffff;color:#000000;font-family:'Arial','Helvetica','sans-serif';font-size:16px;\"><tbody><tr><td style=\"padding:0px 0px 0px 0px;\"> \n<table cellspacing=\"0\" width=\"100%\" cellpadding=\"0\" border=\"0\" style=\"margin:0;padding:0;min-width:100%;\" role=\"presentation\">\n    <tbody><tr>\n      <td class=\"darkTarget\" style=\"overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;text-align:left;color:#000000;font-family:'Arial','Helvetica','sans-serif';font-size:16px;line-height:1.5;font-weight:400;letter-spacing:normal;\">\n            \n                Takahashi Miyu 様<br><br>このたびはご注文いただき、誠にありがとうございます。<br>以下の内容でご注文を承りました。<br><br>----------------------------------<br>■ ご注文番号<br>ORD-0001<br><br>■ ご注文日時<br>2026年07月31日 12時25分<br><br>■ ご注文商品<br>商品名:Sample Item<br>数量 :1<br>価格 :2,000 円<br><br>■ お支払い方法<br>Credit Card<br><br>■ 合計金額<br>2,200 円<br>----------------------------------<br><br>商品は発送準備が整い次第、改めてご連絡いたします。<br><br>ご不明な点がございましたら、本メールへの返信、<br>またはサポート窓口までお問い合わせください。<br><br>今後ともどうぞよろしくお願いいたします。\n            \n            </td>\n    </tr>\n</tbody></table>\n</td></tr></tbody></table></td></tr></tbody></table> \n\n\n      <!--[if !mso]><!-->\n    </div>\n  </div>\n</div>\n<!--<![endif]-->\n<!--[if mso]>\n            </td>\n          </tr>\n        </table>\n      </td>\n    </tr>\n  </table>\n</td>\t\n<![endif]-->\n\n\n<!--[if !mso]><!-->\n      </div>\n    </div>\n  </div>    \n<!--<![endif]-->\n<!--[if mso]>\n                </tr>\n\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</table>\t\t\t\t\t\t\n\t\t\t</td>\t\t\n\t\t</tr>\n\t</table>\n<![endif]-->\n\n\n                </td>\n              </tr>\n            </tbody></table>\n          </td>\n        </tr>\n      </tbody></table>\n    </div>\n  </body>\n</html>\n",
"preheader": "",
"text": " Takahashi Miyu 様\n\nこのたびはご注文いただき、誠にありがとうございます。\n以下の内容でご注文を承りました。\n\n----------------------------------\n■ ご注文番号\nORD-0001\n\n■ ご注文日時\n2026年07月31日 12時25分\n\n■ ご注文商品\n商品名:Sample Item\n数量 :1\n価格 :2,000 円\n\n■ お支払い方法\nCredit Card\n\n■ 合計金額\n2,200 円\n----------------------------------\n\n商品は発送準備が整い次第、改めてご連絡いたします。\n\nご不明な点がございましたら、本メールへの返信、\nまたはサポート窓口までお問い合わせください。\n\n今後ともどうぞよろしくお願いいたします。 \n\n\n\n\n"
}
}

このプレビューに問題がなければ、エンドポイントを /messaging/email/v1 へ戻して、本送信を実行します。


8. Direct Email Send API を実行する

上で記載したリクエストを送信すると、指定したメールアドレスへメールが配信されました。

メールを確認すると、API リクエストの $content に指定した氏名、注文番号、注文日時、商品情報および金額が、正しく本文へ反映されていることを確認できました。成功です。


いかがでしたでしょうか。

今回は、Direct Email Send API を使用して、外部システムからトランザクショナルメールを直接送信する方法をご紹介しました。

今回の検証では、公式ドキュメントだけでは判断しにくい点や、環境によって一時的に正しく動作しない点も確認されました。

Direct Email Send API 自体のリクエスト構造は比較的シンプルですが、認証、メールコンテンツ、送信元アドレス、Send Definition など、事前設定が正しく連携している必要があります。

そのためエラーも発生しやすいので、最初から本送信を実行するのではなく、まずプレビュー API で件名、本文、Content Variables の値を確認してから、本送信へ進むことをオススメします。

この記事が Direct Email Send API を利用する際の参考になれば幸いです。

今回は以上です。


次の記事はこちら

前回の記事はこちら

私の note のトップページはこちら