酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

SkypeAPIを使ってSMSを送信する

本記事では、Skype APIを使ってSMSを送信する方法をご紹介します。

まえがき

サーバープログラムが不穏な(不正な)挙動を示した場合に、すぐに検知して運用担当者にメールを通知する監視バッチを作成しました。

監視バッチでやってることを簡単に書くと以下の通りです。

  • サーバーからJSONを取得する
  • JSONを検証ツールに掛けて不正な値であるかどうかのチェック
  • 不正な値が検出されるとメールを送信する

ひとまずはこれで上手く回っていたのですが、運用を開始してしばらく経つと問題も見えてきました。大きな問題のひとつとしては「メールが見ない」ことです。

サーバープログラムが何らかの原因でクラッシュして「早急に」復旧しなければいけない場合や、(サーバー上の)自動プログラムがトラブってしまい、運用担当者が「早急に」サーバーの設定を書き換えリブートしないといけないケースがどうしても出てきてしまいます。

より迅速にトラブルに対応するために、メールよりも気付きやすいSMSで通知させることにしました。ただ、SMSを送信するには契約的ものなどいくつか障害がありそうでした。Twitterでボヤいていたところ、SkypeAPIを使ってSMSを送れば良いんじゃない?とアドバイスを頂きました。

本記事では、Skype APIを使ってSMSを送信できるのか検証してみました。

プログラムからSMSを送信する

Desktop API (Accessories)にアクセスして、Skype4COMをダウンロードします。

[参照の追加]より、Skype4COM.dllを追加します。

/// <summary>
/// SMSを送信する
/// </summary>
/// <param name="number"></param>
/// <param name="body"></param>
void SendSMSMessage(string number, string body)
{
    try
    {
        var skype = new SKYPE4COMLib.Skype();
        // タイムアウト時間を2分にする (単位:ミリ秒)
        skype.Timeout = 120 * 1000; 

        var smsType = SKYPE4COMLib.TSmsMessageType.smsMessageTypeOutgoing;
        var message = skype.CreateSms(smsType, number);
        message.Body = body;
        message.Send();
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex);
    }
}

上記のコード(SendSMSMessageメソッド)を使うには、以下のサンプルコードのように国コード+電話番号とメッセージを指定します。

private void button1_Click(object sender, EventArgs e)
{
    var sendNumber = "+81-80-xxxx-yyyy";
    var msgBody = "test message";

    SendSMSMessage(sendNumber, msgBody);
}

日本の携帯電話に送信する場合には、国コードは+81になります。

上記のソースコードのみでSkype経由のSMS送信は可能ですが、念のためgistにソースコードを全文掲載しておきます。

まとめ

SMSを送信する以前の問題として、サーバーがトラブることと運用担当者がそれに気付いて修正することが前提になっている現状をなんとか打開しなければいけない。

参考