2016 年 4 月の記事一覧です(1 件)

[Python][Twilio]特定の件名のメールを受信したら電話をコールさせる

タイトルの通りですが、特定の件名のメールを受信したら電話をコールさせたくてimaplibとtwilio-pythonを使って実装しました。

用途的には子供の習い事などで利用するバスの到着通知メールをうっかり見逃さないようにすることなのですが、もしかしたらサーバの障害通知などにも利用できるかもしれません(やらないけど)。リポジトリを貼っておくのでご参考にどうぞです。



前準備として以下のものを用意

  • Twilioのアカウントを取得して(発信元になる)電話番号を取得、アカウント作成によって生成されたAPIトークンを使用
  • あらかじめ特定の件名のメールを受信したら専用のラベルを貼るようにしておく(GmailやGoogle Appsを使用することが前提です)


処理の流れ

  1. Google Appsのメールボックスにimaplibでログインする
  2. 専用のラベル(ボックス)にメールがあるかどうかチェック
  3. メールがない場合はなにもしない
  4. メールがあり、且つタイトルが特定の件名と一致した場合、日付をチェックして今日のメールだったらあらかじめ設定してある電話番号に電話をかける、ついでにそのメールからラベルをはがす

2~4の処理を無限ループで実行し、15秒程のスリープを挟んでいます。スクリプトのデーモン化にはUpstartを使用


Twilioの運用ポイント

Twilioでコールする場合、本来はコール後に電話を取ってもらい音声案内等の処理に繋げていくものですが、今回はコールすることが目的で電話を取る必要はない。

なのでtimeoutパラメータの数値を低く設定して数コールで切れるようにしています。

Twilio Docs: Make outgoing phone calls with Twilio's REST API

実際のコードだとこんな感じ

def makecall(sid, secret, target, from_, url, timeout=10):
    try:
        client = TwilioRestClient(sid, secret)
        call = client.calls.create(
                to=target,
                from_=from_,
                url=url,
                timeout=timeout
                )

        log.info(call.sid)

    except TwilioRestException as e:
        log.exception(e)

因みに、コールするだけの場合、Twilioは料金が発生しないので電話番号の維持費だけで運用することが可能です(のはず)

通話が成立しない場合料金はかかりますか? : Twilio for KDDI Web Communications


また、自宅の電話にはTwilioの番号を登録し、読み仮名に「バスガトウチャクシマス」などと登録しています。するとその番号から電話がかかってくると読み上げてくれるので、より注意を引くことが出来ます


今後の課題

今はもともと借りていた某OpenVZなVPSで動かしているので、AWS Lambdaで同じようなことが出来るか調べようと思っています


参考にさせていただいたサイト


PAGE TOP