すべてのプロダクト
Search
ドキュメントセンター

Short Message Service:SMS Webhook

最終更新日:Mar 01, 2026

Simple Message Queue (旧称:MNS) を使用して、配信レポートを受信します。

前提条件

  • Alibaba Cloud アカウントと AccessKey ペアが作成されていること。詳細については、「AccessKey ペアの作成」をご参照ください。

  • MNS キューが、dybaseapi.ap-southeast-1.aliyuncs.com および 1493622401794734.mns.ap-southeast-1.aliyuncs.com のドメイン名にアクセスできること。

重要

配信レポートのべき等性は保証されません。配信レポートを受信した後、データの正確性と一貫性を確保するために適切な措置を講じることを推奨します。

リクエストパラメーター

パラメーター

タイプ

説明

To

String

8521234****

配信レポートを受信する携帯電話番号。

Status

String

1

メッセージのステータス。有効な値は次のとおりです。

  • 1: メッセージが送信されました。

  • 2: メッセージの送信に失敗しました。

  • 6: メッセージの有効期限が切れました。

MessageId

String

123456789****

配信レポートの ID。

SmsSize

String

1

メッセージ数。

長文メッセージは複数のメッセージに分割されます。

SendDate

String

Thu, 25 Nov 2021 10:27:00 +0800

メッセージがキャリアに送信された時刻。

ReceiveDate

String

Thu, 25 Nov 2021 10:27:33 +0800

キャリアから配達領収書を受領した時間。

ErrorCode

String

success

エラーコード。

ErrorDescription

String

success

エラーメッセージ。

{
    "To" : "8521234****",
    "SendDate" : "Thu, 25 Nov 2021 10:27:00 +0800",
    "ReceiveDate" : "Thu, 25 Nov 2021 10:27:33 +0800",
    "Status" : "1",
    "SmsSize":"1",
    "ErrorCode" : "success",
    "ErrorDescription" : "success",
    "MessageId" : "123456789****"
  }

デモのダウンロード

詳細については、「Simple Message Queue コンシューマーデモ」をご参照ください。ご希望のプログラミング言語のデモと SDK をダウンロードしてください。以下の手順では、Java を例として使用します。

説明
  • デモをダウンロードした後、一部の JAR ファイルは lib ディレクトリにあります。それらを右クリックし、[ライブラリとして追加] を選択して、ライブラリとして追加する必要があります。以下の画像をご参照ください。

  • pom.xml ファイルで Maven 依存関係を見つけて、Alibaba Cloud SDK for Java をインストールできます。

lib

パラメーター設定

サンプルコードを使用する前に、以下のパラメーターを設定する必要があります。

AccessKey ペアの設定

説明

コードに AccessKey ペアをハードコーディングすることによるセキュリティリスクを回避するため、環境変数を使用することを推奨します。詳細については、「Linux、macOS、および Windows で環境変数を設定する」をご参照ください。

このガイドでは、環境変数名 ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET を使用します。以下のコードは、環境変数から AccessKey ペアを取得する方法を示しています。

String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");

メッセージタイプの設定

messageType を必要なメッセージタイプ (SMS 配信レポートの場合は SmsReport など) に置き換えます。サポートされているメッセージタイプについては、「配信レポートの設定」をご参照ください。

String messageType="<MESSAGE_TYPE>";

キュー名の設定

queueName をご利用のメッセージキュー名に置き換えます。この名前は、SMS コンソールで、システム設定 > 共通設定 > インターフェイス API に移動して確認できます。

String queueName="<QUEUE_NAME>";

image

サンプルコード

受信する配信レポートのコンテンツは、dealMessage メソッドによって処理されます。このメソッド内に、これらのメッセージを処理するためのビジネスロジックを記述できます。

// ドキュメントで指定されたフォーマットに従って、メッセージ本文を解析します
String arg = (String) contentMap.get("arg");
// ここにビジネスロジックを記述します

arg は、コールバックメッセージ本文からのパラメーターを表します。その値には、ToStatusMessageIdSmsSizeSendDateReceiveDateErrorCodeErrorDescription が含まれます。

package com.alicom.mns.sample;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


import com.alicom.mns.tools.DefaultAlicomMessagePuller;
import com.alicom.mns.tools.MessageListener;
import com.aliyun.mns.model.Message;
import com.google.gson.Gson;

/**
 * This is for receiving messages from Alibaba Cloud Communications services only and cannot be used for other services
 */
public class ReceiveDemo {

    private static Log logger=LogFactory.getLog(ReceiveDemo.class);

    static class MyMessageListener implements MessageListener{
        private Gson gson=new Gson();

        @Override
        public boolean dealMessage(Message message) {

            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            // メッセージからのキー値
            System.out.println("message receiver time from mns:" + format.format(new Date()));
            System.out.println("message handle: " + message.getReceiptHandle());
            System.out.println("message body: " + message.getMessageBodyAsString());
            System.out.println("message id: " + message.getMessageId());
            System.out.println("message dequeue count:" + message.getDequeueCount());
            System.out.println("Thread:" + Thread.currentThread().getName());
            try{
                Map<String,Object> contentMap=gson.fromJson(message.getMessageBodyAsString(), HashMap.class);

                // ドキュメントに記載されている特定の形式に従ってメッセージ本文を解析します。
                String arg = (String) contentMap.get("arg");

                // ここにビジネスロジックを追加します。

            }catch(com.google.gson.JsonSyntaxException e){
                logger.error("error_json_format:"+message.getMessageBodyAsString(),e);
                // 理論的には、形式エラーは発生しません。不正な形式のメッセージが発生した場合は、再配信されて繰り返しエラーが発生するのを防ぐために、そのメッセージを削除してください。
                return true;
            } catch (Throwable e) {
                // ご自身のコードによって例外が発生した場合は、false を返してください。これにより、メッセージが削除されるのを防ぎ、リトライポリシーに従って再配信されるようになります。
                return false;
            }

            // メッセージが正常に処理された場合は、true を返します。SDK は MNS 削除メソッドを呼び出して、キューからメッセージを削除します。
            return true;
        }

    }

    public static void main(String[] args) throws Exception, ParseException {

        DefaultAlicomMessagePuller puller=new DefaultAlicomMessagePuller();

        // 非同期スレッドプール、タスクキューのサイズ、およびデータがない場合のスレッドのスリープ時間を設定します。
        puller.setConsumeMinThreadSize(6);
        puller.setConsumeMaxThreadSize(16);
        puller.setThreadQueueSize(200);
        puller.setPullMsgThreadSize(1);
        // サーバーサイドデバッグのためにこれを有効にします。パフォーマンスに影響するため、通常操作時には無効にする必要があります。
        puller.openDebugLog(false);

        // ローカル環境変数から AccessKey ID と AccessKey Secret を取得します。
        String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
        String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");

        /*
        *  messageType と queueName を必要なメッセージタイプと対応するキュー名に置き換えます。
        *  サポートされているコールバックメッセージタイプ:
        *  1: SmsReport: SMS 配信レポート
        *  2: SmsUp: モバイル発信メッセージ       
        *  3: GlobeSmsReport: 国際 SMS 配信レポート
        */
        String messageType="<MESSAGE_TYPE>"; // これをメッセージタイプに置き換えます。SmsReport がサポートされています。
        String queueName="<QUEUE_NAME>"; // コンソールで機能を有効にした後、対応する queueName をページで確認できます。例: Alicom-Queue-******-SmsReport。
        puller.startReceiveMsg(accessKeyId,accessKeySecret,messageType,queueName,new MyMessageListener());
    }
}

デモ実行後の出力:

image