azure-communication-sms-java について
Azure Communication ServicesでSMSを送るJava向けスキルです。単一・複数宛先への送信、同期・非同期クライアント、配信レポートの扱いを説明します。
主な機能
- 01単一または複数宛先へのSMS送信
- 02同期・非同期クライアントの利用
- 03Event Grid配信レポートの有効化
- 04タグと結果による送信追跡
活用シーン
- 01確認コードやアラートの送信
- 02複数宛先への一括通知
- 03宛先ごとの送信結果の確認
- 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
ベストプラクティス
- 電話番号の形式 - E.164 形式を使用します:
+[country code][number] - 配信レポート - 重要なメッセージ(OTP、アラート)では有効にします
- タグ付け - タグを使用して、メッセージをビジネスコンテキストと関連付けます
- エラー処理 - 宛先ごとに
isSuccessful()を確認します - レート制限 - 429 応答に対して、バックオフを伴う再試行を実装します
- 一括送信 - 複数の宛先にはバッチ送信を使用します(より効率的です)
トリガーフレーズ
- "send SMS Java", "text message Java"
- "SMS notification", "OTP SMS", "bulk SMS"
- "delivery report SMS", "Azure Communication Services SMS"
使用する場合
このスキルは、概要に記載されたワークフローまたはアクションを実行する場合に適用できます。
制限事項
- タスクが上記の説明の範囲に明確に一致する場合にのみ、このスキルを使用してください。
- 出力を、環境固有の検証、テスト、または専門家によるレビューの代わりとして扱わないでください。
- 必要な入力、権限、安全上の境界、または成功基準が不足している場合は、作業を中止して確認してください。
SMS の送信は実際の宛先に連絡し、料金が発生する可能性があります。送信前に、送信者、宛先リスト、内容、同意/配信停止の設定、予算を確認してください。例にはテスト用の電話番号を使用してください。上記の OTP は説明用にすぎません。サーバー側で有効期限付きの安全な使い捨てコードを生成してください。宛先ごとの受け付けは配信を意味しません。検証済みの Event Grid レポートを関連付けて重複を排除し、送信結果が不明な場合は再試行する前に照合してください。非同期処理の完了を待ち、電話番号、本文、トークン、応答ヘッダー全体をログに記録しないでください。
コメント
Markdown 対応