mcpField
A
azure-communication-sms-java

azure-communication-sms-java

github.com/sickn33その他48.7k65 回インストール今日更新
リポジトリ

azure-communication-sms-java について

Azure Communication ServicesでSMSを送るJava向けスキルです。単一・複数宛先への送信、同期・非同期クライアント、配信レポートの扱いを説明します。

主な機能

  1. 01単一または複数宛先へのSMS送信
  2. 02同期・非同期クライアントの利用
  3. 03Event Grid配信レポートの有効化
  4. 04タグと結果による送信追跡

活用シーン

  1. 01確認コードやアラートの送信
  2. 02複数宛先への一括通知
  3. 03宛先ごとの送信結果の確認
  4. 04メッセージと配信レポートの関連付け

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/sickn33/agentic-awesome-skills --skill azure-communication-sms-java

インストール後、Claude Code で/azure-communication-sms-javaを入力して読み込まれたか確認します。

詳細

Azure Communication SMS(Java)

配信レポート付きで、1 人または複数の宛先に SMS メッセージを送信します。

インストール

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-communication-sms</artifactId>
    <version>1.2.0</version>
</dependency>

クライアントの作成

import com.azure.communication.sms.SmsClient;
import com.azure.communication.sms.SmsClientBuilder;
import com.azure.identity.DefaultAzureCredentialBuilder;

// With DefaultAzureCredential (recommended)
SmsClient smsClient = new SmsClientBuilder()
    .endpoint("https://<resource>.communication.azure.com")
    .credential(new DefaultAzureCredentialBuilder().build())
    .buildClient();

// With connection string
SmsClient smsClient = new SmsClientBuilder()
    .connectionString("<connection-string>")
    .buildClient();

// With AzureKeyCredential
import com.azure.core.credential.AzureKeyCredential;

SmsClient smsClient = new SmsClientBuilder()
    .endpoint("https://<resource>.communication.azure.com")
    .credential(new AzureKeyCredential("<access-key>"))
    .buildClient();

// Async client
SmsAsyncClient smsAsyncClient = new SmsClientBuilder()
    .connectionString("<connection-string>")
    .buildAsyncClient();

1 人の宛先に SMS を送信

import com.azure.communication.sms.models.SmsSendResult;

// Simple send
SmsSendResult result = smsClient.send(
    "+14255550100",      // From (your ACS phone number)
    "+14255551234",      // To
    "Your verification code is 123456");

System.out.println("Message ID: " + result.getMessageId());
System.out.println("To: " + result.getTo());
System.out.println("Success: " + result.isSuccessful());

if (!result.isSuccessful()) {
    System.out.println("Error: " + result.getErrorMessage());
    System.out.println("Status: " + result.getHttpStatusCode());
}

複数の宛先に SMS を送信

import com.azure.communication.sms.models.SmsSendOptions;
import java.util.Arrays;
import java.util.List;

List<String> recipients = Arrays.asList(
    "+14255551111",
    "+14255552222",
    "+14255553333"
);

// With options
SmsSendOptions options = new SmsSendOptions()
    .setDeliveryReportEnabled(true)
    .setTag("marketing-campaign-001");

Iterable<SmsSendResult> results = smsClient.sendWithResponse(
    "+14255550100",      // From
    recipients,          // To list
    "Flash sale! 50% off today only.",
    options,
    Context.NONE
).getValue();

for (SmsSendResult result : results) {
    if (result.isSuccessful()) {
        System.out.println("Sent to " + result.getTo() + ": " + result.getMessageId());
    } else {
        System.out.println("Failed to " + result.getTo() + ": " + result.getErrorMessage());
    }
}

送信オプション

SmsSendOptions options = new SmsSendOptions();

// Enable delivery reports (sent via Event Grid)
options.setDeliveryReportEnabled(true);

// Add custom tag for tracking
options.setTag("order-confirmation-12345");

応答の処理

import com.azure.core.http.rest.Response;

Response<Iterable<SmsSendResult>> response = smsClient.sendWithResponse(
    "+14255550100",
    Arrays.asList("+14255551234"),
    "Hello!",
    new SmsSendOptions().setDeliveryReportEnabled(true),
    Context.NONE
);

// Check HTTP response
System.out.println("Status code: " + response.getStatusCode());
System.out.println("Headers: " + response.getHeaders());

// Process results
for (SmsSendResult result : response.getValue()) {
    System.out.println("Message ID: " + result.getMessageId());
    System.out.println("Successful: " + result.isSuccessful());
    
    if (!result.isSuccessful()) {
        System.out.println("HTTP Status: " + result.getHttpStatusCode());
        System.out.println("Error: " + result.getErrorMessage());
    }
}

非同期操作

import reactor.core.publisher.Mono;

SmsAsyncClient asyncClient = new SmsClientBuilder()
    .connectionString("<connection-string>")
    .buildAsyncClient();

// Send single message
asyncClient.send("+14255550100", "+14255551234", "Async message!")
    .subscribe(
        result -> System.out.println("Sent: " + result.getMessageId()),
        error -> System.out.println("Error: " + error.getMessage())
    );

// Send to multiple with options
SmsSendOptions options = new SmsSendOptions()
    .setDeliveryReportEnabled(true);

asyncClient.sendWithResponse(
    "+14255550100",
    Arrays.asList("+14255551111", "+14255552222"),
    "Bulk async message",
    options)
    .subscribe(response -> {
        for (SmsSendResult result : response.getValue()) {
            System.out.println("Result: " + result.getTo() + " - " + result.isSuccessful());
        }
    });

エラー処理

import com.azure.core.exception.HttpResponseException;

try {
    SmsSendResult result = smsClient.send(
        "+14255550100",
        "+14255551234",
        "Test message"
    );
    
    // Individual message errors don't throw exceptions
    if (!result.isSuccessful()) {
        handleMessageError(result);
    }
    
} catch (HttpResponseException e) {
    // Request-level failures (auth, network, etc.)
    System.out.println("Request failed: " + e.getMessage());
    System.out.println("Status: " + e.getResponse().getStatusCode());
} catch (RuntimeException e) {
    System.out.println("Unexpected error: " + e.getMessage());
}

private void handleMessageError(SmsSendResult result) {
    int status = result.getHttpStatusCode();
    String error = result.getErrorMessage();
    
    if (status == 400) {
        System.out.println("Invalid phone number: " + result.getTo());
    } else if (status == 429) {
        System.out.println("Rate limited - retry later");
    } else {
        System.out.println("Error " + status + ": " + error);
    }
}

配信レポート

配信レポートは Azure Event Grid 経由で送信されます。ACS リソース用に Event Grid サブスクリプションを構成してください。

// Event Grid webhook handler (in your endpoint)
public void handleDeliveryReport(String eventJson) {
    // Parse Event Grid event
    // Event type: Microsoft.Communication.SMSDeliveryReportReceived
    
    // Event data contains:
    // - messageId: correlates to SmsSendResult.getMessageId()
    // - from: sender number
    // - to: recipient number
    // - deliveryStatus: "Delivered", "Failed", etc.
    // - deliveryStatusDetails: detailed status
    // - receivedTimestamp: when status was received
    // - tag: your custom tag from SmsSendOptions
}

SmsSendResult のプロパティ

プロパティ型説明
getMessageId()String一意のメッセージ識別子
getTo()String宛先の電話番号
isSuccessful()boolean送信が成功したかどうか
getHttpStatusCode()intこの宛先に対する HTTP ステータス
getErrorMessage()String失敗時のエラー詳細
getRepeatabilityResult()RepeatabilityResult冪等性の結果

環境変数

AZURE_COMMUNICATION_ENDPOINT=https://<resource>.communication.azure.com
AZURE_COMMUNICATION_CONNECTION_STRING=endpoint=https://...;accesskey=...
SMS_FROM_NUMBER=+14255550100

ベストプラクティス

  1. 電話番号の形式 - E.164 形式を使用します:+[country code][number]
  2. 配信レポート - 重要なメッセージ(OTP、アラート)では有効にします
  3. タグ付け - タグを使用して、メッセージをビジネスコンテキストと関連付けます
  4. エラー処理 - 宛先ごとに isSuccessful() を確認します
  5. レート制限 - 429 応答に対して、バックオフを伴う再試行を実装します
  6. 一括送信 - 複数の宛先にはバッチ送信を使用します(より効率的です)

トリガーフレーズ

  • "send SMS Java", "text message Java"
  • "SMS notification", "OTP SMS", "bulk SMS"
  • "delivery report SMS", "Azure Communication Services SMS"

使用する場合

このスキルは、概要に記載されたワークフローまたはアクションを実行する場合に適用できます。

制限事項

  • タスクが上記の説明の範囲に明確に一致する場合にのみ、このスキルを使用してください。
  • 出力を、環境固有の検証、テスト、または専門家によるレビューの代わりとして扱わないでください。
  • 必要な入力、権限、安全上の境界、または成功基準が不足している場合は、作業を中止して確認してください。

SMS の送信は実際の宛先に連絡し、料金が発生する可能性があります。送信前に、送信者、宛先リスト、内容、同意/配信停止の設定、予算を確認してください。例にはテスト用の電話番号を使用してください。上記の OTP は説明用にすぎません。サーバー側で有効期限付きの安全な使い捨てコードを生成してください。宛先ごとの受け付けは配信を意味しません。検証済みの Event Grid レポートを関連付けて重複を排除し、送信結果が不明な場合は再試行する前に照合してください。非同期処理の完了を待ち、電話番号、本文、トークン、応答ヘッダー全体をログに記録しないでください。

コメント