Photo by Austin Distel on Unsplash
スマホへのSMSの送信は以前は国内のサービスを使用する必要がありましたが、数年前からAWSのAmazon SNSでも対応しているようです。
AWSと別にサービスを契約せずに済み導入時の手間が省けるのはありがたいものです。
JavaでSMSを送信するサンプルコードは多いですがkotlinのサンプルコードは少ないので書き留めておきます。
エンジニアのUさんが調べてコードを書いてくれたのでこれをパクってブログ用に整形します。
まずはbuild.gradleにAWS SDKの依存関係を追加します。
dependencies { implementation "com.amazonaws:aws-java-sdk-bom:1.11.683" implementation "com.amazonaws:aws-java-sdk-sns:1.11.683" }
importは以下の2つが必要です。
import com.amazonaws.auth.* import com.amazonaws.services.*
AmazonSNSClientを初期化します。
追加で認証情報やリージョンを指定することもできます。
val snsClient = AmazonSNSClient.builder()
送信先電話番号とメッセージを指定してpublishで送信します。
val request = PublishRequest() request.phoneNumber = targetPhoneFix request.message = message snsClient.publish(request)
関数にするとこんな具合です。
kotlinのコードはJavaに比べると簡潔にかけるので見やすくて良いですね。
fun sendSms(region: String, accessKey: String, secretKey: String, targetPhone: String, message: String) { val targetPhoneFix = if (targetPhone.startsWith("0")) "81" + targetPhone.substring(1) else targetPhone val credentialsProvider = AWSStaticCredentialsProvider(BasicAWSCredentials(accessKey, secretKey)) val snsClient = AmazonSNSClient.builder() .withCredentials(credentialsProvider) .withRegion(region) .build() val request = PublishRequest() request.phoneNumber = targetPhoneFix request.message = message snsClient.publish(request) }
IAMアクセス権限
SMS送信にはIAMに以下の権限を付与する必要があります。
動作確認であれば、既存のAmazonSNSFullAccessポリシーを付与すれば送信できます
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "sns:Publish", "Resource": "*" } ] }
注意点
- 初期状態では送信数に制限があるので本格運用するならAWSにリクエストを送って制限を解除してもらう必要があります。このへんは毎度ながら面倒です。
- 国内のスマホの電話番号は通常090や080など0始まりですが、SMSを送信するには先頭の”0″を取り除いて先頭に81(国番号)を追加した番号を指定する必要があります。
参考
SMS メッセージの送信 – Amazon Simple Notification Service
東京都心在住のフルリモート勤務エンジニア。サーバサイドの開発担当で得意な言語はC#。