Twilioのアリスに電話でメールを読みあげてもらう方法

メールを読みあげる人

料理やストレッチなど手が離せないことをしている時、受信したメールの中身が気になってしまうことはありませんか?
SendGridParse WebhookTwilio音声通話APIを組みあわせて、電話経由でメールを読みあげてもらうサンプルコードをご紹介します。

準備

  • SendGridのアカウント
    • お持ちでない方は新規会員登録をしましょう。
    • 今回はParse Webhookによって、受信メールの内容をWebアプリケーションにPOSTするために使います。
  • Webアプリケーション
    • HerokuなどのPaaSを利用すると簡単です。
    • SendGridからPOSTされた内容をTwilioに橋渡しします。
  • Twilioのアカウント
    • お持ちでない方はトライアルに登録しましょう。
    • 今回は音声通話APIによって、自動で電話をかけて文章を読みあげるために使います。
  • 電話
    • ハンズフリーの着信設定をしておくといいでしょう。

ステップ1

Twilioの電話番号を取得します。

Twilioの電話番号設定

ステップ2

次のPython 3のサンプルコードをデプロイします。FlaskというWebアプリケーションフレームワークを使っています。

import os
import urllib.parse
from flask import Flask, request
from twilio.rest import TwilioRestClient

app = Flask(__name__)

def voice_address(text_address):
  # 山括弧は読ませない
  return text_address. 
    replace('<',' '). 
    replace('>',' ')

@app.route ('/')
def index():
  return 'Hello!'

@app.route ('/incoming', methods =['POST'])
def forward_to_twilio():
  # POSTメソッドのパラメータを参照
  sender  = voice_address(request.form['from'])
  subject = request.form['subject']
  body    = request.form['text']

  # TwiMLの組み立て
  twiml = 
    '<Response><Say voice="alice" language="ja-jp">' + 
    'メールを受信しました。送信者は、' + sender + 
    '、です。件名は、' + subject + 
    '、です。本文は、' + body + 
    '、です。</Say></Response>'

  # Twimletsのecho機能を使ってTwiMLのURL生成
  # GETメソッドのパラメータには文字数制限があるためテスト用
  echo_url = "http://twimlets.com/echo?Twiml=" + 
    urllib.parse.quote(twiml)
  print(echo_url)

  try:
    # 環境変数を参照
    account_sid = os.environ['TWILIO_ACCOUNT_SID']
    auth_token  = os.environ['TWILIO_AUTH_TOKEN']
    from_number = os.environ['TWILIO_PHONE_NUMBER']
    to_number   = os.environ['YOUR_PHONE_NUMBER']

    # Twilioの認証
    client = TwilioRestClient(account_sid, auth_token)

    # Twilioに発信通話をリクエスト
    call = client.calls.create(
      from_ = from_number,
      to = to_number,
      url = echo_url)

    print(call.sid)
    return 'OK'
  except Exception as e:
    print(e)
    return 'NG'

if __name__=='__main__':
  app.run()

次の環境変数を前提としています。

TWILIO_ACCOUNT_SID TwilioのACCOUNT SID
TWILIO_AUTH_TOKEN TwilioのAUTH TOKEN
TWILIO_PHONE_NUMBER Twilioの国際電話番号
YOUR_PHONE_NUMBER お手持ちの電話の国際電話番号(日本は81始まり)

詳しい動作環境などは、GitHubの「sendgrid-twilio-python-example」をご覧ください。Herokuボタンも用意したので、すぐにデプロイできます。

ステップ3

SendGridのParse Webhookを「SETTINGS > Inbound Parse」にて設定します。Parse Webhookは、指定HOSTのメールアドレスへ送信されたメールをパースして、その内容を指定URLにPOSTする機能です。

  • HOST
    • 受信メールアドレスのドメインを指定します。
    • 今回は、SendGridが開発用に用意している「bymail.in」ドメインにサブドメインを付加したものを入力します。ここで付加するサブドメインは、一意なものであればなんでも構いませんが、ユーザ名の@より前の部分を利用して「sgxxxxxx.bymail.in」のようにすることを推奨しています。
  • URL
    • 受信したメールの内容をPOSTする先のWebアプリケーションのURL「(デプロイ先URL)/incoming」を指定します。
    • POST内容の詳細は、APIリファレンスをご覧ください。

Parse Webhookの設定

ステップ4

設定したHOSTのメールアドレス(例 test@sgxxxxxx.bymail.in)に、テストメールを送信してみてください。メールアドレスのローカルパートは何でも構いません。うまく設定できていれば、Twilioボイスエンジンのアリスから電話が掛かってきます。

あとは、必要な時に普段お使いのメールアドレスから自動転送するようにすればOKです。これで手を止めずに、メールの内容を音声で確認することができるようになりました!

おわりに

SendGridやTwilioに限らず、様々なクラウドサービスのAPIを組みあわせると、お手軽に面白いサービスを作ることができます。ぜひ色々と挑戦して、Mashup Awardsなどのコンテストにも参加してみてください。

参考記事