プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

第19回伊勢IT交流会 with GCPUG Mie を開催しました

2018年11月10日に、第19回伊勢IT交流会 with GCPUG Mie と題して、伊勢IT交流会を開催しました。 ご参加いただいた皆様ありがとうございました。 今回はいつもの伊勢IT交流会とは少し違い、 GCPUG Mie さんとの共催という形で行いました。

GCPUG はご存知の方も多いと思いますが、 Google Cloud Platform Users Group の略です。 その 三重県のユーザーグループである GCPUG Mie さんからお声がけいただき、共催となりました。

内容的には、大きく分けて前半が GCPUG のセッション、後半が伊勢IT交流会のセッションとし、 最後に(アルコール抜きでの)交流会を行う、というものでした。

GCPUG のセッション

最初に GCPUG Mie 代表の方から GCP および GCPUG についての説明がありました。

f:id:junichim:20181110234404j:plain

続いて Google の方から GCP のより詳しい説明と

f:id:junichim:20181110234432j:plain

実際にGCPを触ってみるというハンズオン。

f:id:junichim:20181110234502j:plain

続いて、クラウドエース株式会社の方から中小企業でのGCPの事例紹介。

f:id:junichim:20181110234548j:plain

このあと、講師の方々への質問コーナーや GCPUG Mie の運営募集などの話もありました。

伊勢IT交流会のセッション

休憩後はLTタイムです。

まずは masaaki_nakamura さんから 『Max1000』ということでFPGAの話をしていただきました。

f:id:junichim:20181110234942j:plain

続いて、私から『Twilio で FAX 試した』というタイトルで話しました。

www.slideshare.net

次は、emotion さんから WMI に関する話。

f:id:junichim:20181110235123j:plain

最後は moyashi さんから『リモートワークで働いてみた(みてる)』という話でした。

f:id:junichim:20181110235204j:plain

と思いきや、飛び入りで、このイベントのネットワークをご提供いただいているNSC運営事務局さんからネットワーク設営にまつわる話をいただきました。

f:id:junichim:20181110235354j:plain

交流会&懇親会

両セッションの終了後は、会場にてアルコール抜きで交流会です。

f:id:junichim:20181110235455j:plain

このあと、居酒屋で懇親会もやりました。

感想

今回は、 GCPUG Mie さんと共催ということで、かなり盛沢山の内容になりました。 また、参加者数も講師の方含めて24名となり、過去最大の参加者数でした。

講師としていらっしゃった皆様、イベント開催にご協力いただいた皆様、ご参加いただいた皆様、ありがとうございました。

次回は予定ではいつもの伊勢IT交流会になりはずです。時期的には来年の5~6月ごろを予定しておりますので、また遊びに来てください。

本日はお疲れ様でした。

Twilio 試した(3/3):FAX 受信と通知を試しました

Twilio 試用のその3になります。

Twilio 試した(1/3):電話(音声通話)機能を使ってみました - プログラマーのメモ書き

Twilio 試した(2/3):FAX 送信を試しました - プログラマーのメモ書き

Twilio 試した(3/3):FAX 受信と通知を試しました - プログラマーのメモ書き

さて、最後は FAX の受信と通知を試してみたいと思います。

FAX 受信

受信するだけなら、下記のように定義した TwiML を作成し、

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Receive mediaType="application/pdf" storeMedia="true">
  </Receive>
</Response>

電話番号の設定画面で、下記のようにFAX受信時に、上記のTwiMLを呼び出すように設定します。

f:id:junichim:20181109115719p:plain

受信テスト

上記の設定後、自宅の電話器からFAXをTwilioの電話番号あてに送ります。するとなんの変化もありません。 まあ、電話機側はFAX送信に失敗するとエラーを表示するので、送れてはいるんだと思います。

受け取ったFAXはどうやって確認するのだろうか?

と思っていたら、FAXに関しては、電話の録音などと違い、REST API 経由でしか確認ができないそうです(Twilio のサポートさんに教えていただきました)。

とりあえずブラウザで受信FAX一覧リストを取得するURLをたたきます。

jp.twilio.com

ユーザー名とアカウント名の入力が求められるので、AccountSid と AuthToken を入力します(コントロールパネルのダッシュボードで確認できます)。 詳しくはここに載ってます。

するとJSON形式の文字列がずらずらと取得されます。こんな感じのイメージです。

{
     "meta":{
         "page":0
        ,"page_size":50
        ,"first_page_url":"https://fax.twilio.com/v1/Faxes?PageSize=50&Page=0"
        ,"previous_page_url":null
        ,"url":"https://fax.twilio.com/v1/Faxes?PageSize=50&Page=0"
        ,"next_page_url":null
        ,"key":"faxes"
    }
    ,"faxes":[
        {
             "media_sid":"MExxxxxxxxxxxxxxxx"
            ,"status":"received"
            ,"direction":"inbound"
            ,"from":"+81xxxxxxxxxx"
            ,"date_updated":"2018-11-08T06:43:25Z"
            ,"price":"-0.6"
            ,"account_sid":"アカウントSID"
            ,"to":"+81xxxxxxxxxxx"
            ,"date_created":"2018-11-08T06:43:01Z"
            ,"url":"https://fax.twilio.com/v1/Faxes/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            ,"sid":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            ,"duration":23
            ,"num_pages":1
            ,"quality":"standard"
            ,"price_unit":"JPY"
            ,"api_version":"v1"
            ,"media_url":"https://media.twiliocdn.com/fax/xxxxxxxxxxxx"
            ,"links":{
                 "media":"https://fax.twilio.com/v1/Faxes/FXxxxxxxxxxxxxxxxxxxxxxxxxxxxx/Media"
            }
        }
        ,{
             "media_sid":"MEyyyyyyyyyyyyyyyyyyyyyyyy"
            ,"status":"received"
            ,"direction":"inbound"

この一覧には、送信、受信の両方の情報が載っています。受信したFAXは、status が received 、送信したFAXは、delivered になります。 確かに受信できているようです。

実際の受信データは media_url に記載されているリンクを表示すると、無事に pdfが表示され、送ったFAXであることがわかりました (今回の場合 TwiML で受信データ種類を pdf と指定しています。Tiffも選べるようです)。

FAX 受信と通知

あと、もう一息。

ここまで来たら、受信があったら、通知を出せばOKです。通知にもいろいろありますが、ここはまずメールに出します。 ついでに、通知だけでなく受け取ったFAXそのものも添付ファイルで送れるとなおうれしいです。

今回は、 TwiML でFAXを受け取り、actionで受け取り後に呼び出すURLを指定します。そのURLは、TwilioのFunctions(サーバーレスな関数実行機能。AWSのlambda みたいなもの)を定義して、そいつで処理します。

Functions

TwiML がFAX受信後に呼び出す関数を定義します。

Runtime の Functions を選択します。

f:id:junichim:20181109163435p:plain

大きなプラスボタンを押すとFunctionsの定義画面が表示されます。

f:id:junichim:20181109163558p:plain

とりあえず、 Blank を選択して、Create ボタンを押します。

f:id:junichim:20181109163723p:plain

こんな感じの定義画面が出てきます。

FUNCTION NAME に関数名を入力します。 ここでは、 faxReceive としました。

下部のCODEの部分にコード(node.js)を書いていきます。 今回作ったのはこんな感じです(長くなるので、Gist に置いときます)。

Twilio FAX 受信時にメールを送信するサンプル · GitHub

(参考)

下記の記事を参考に作りました。助かりました。ありがとうございます。

qiita.com

ちなみに、上記のURL先の参考にしたサイトと違うところは、今回作ったほうは Promise をかましているところです。 (参考サイトのは、メール送信のあと、 slack への通知も行っているので大丈夫なんだと思います。)

Functions の設定

上記はnode.jsのモジュール nodemailer を使っているので、それを利用可能にする必要があります。 これは、コンソールの Runtime から Functions へ進み、設定を選択すると

f:id:junichim:20181109174055p:plain

のように、画面下部に dependencies というところが出てきます。 ここで、プラスボタンを押して、ライブラリの名前とバージョン番号を入力すればOKです。

TwiML

TwiML は上記のものを少し変えて、Functions を呼び出すようにします。

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Receive mediaType="application/pdf" storeMedia="true"
      action="https://xxxxxxxxxxxxxxxxxx.twil.io/faxReceived">
  </Receive>
</Response>

faxReceived というのが作ったFunctionsの名前です。

試す

電話番号設定は上記のFAX受信のままであれば、変更する必要ありません。

これでFAXを送ってみます。 無事に送信後、メーラーでメールが受信できているかみると、

f:id:junichim:20181109183106p:plain

おぉ。無事に届いていますね。

注意点

Twilio 側の問題ではないのですが、今回使ったメールサーバーがさくらインターネットのものでした。それに関して送信できないのが2点ほどあったので、書いておきます。

エラーその1

Twilio でメール送信を設定しても、何度かエラーが出ます。Twilio のログを見ると

error: Error: Hostname/IP doesn't match certificate's altnames: "Host: SMTpサーバー. is not in the cert's altnames: DNS:*.sakura.ne.jp, DNS:*.180r.com, DNS:*.2-d.jp, DNS:*.achoo.jp, DNS:*.amaretto.jp, DNS:*.bona.jp, DNS:*.chew.jp, DNS:*.crap.jp, DNS:*.daynight.jp, DNS:*.deko8.jp, DNS:*.dojin.com, DNS:*.eek.jp, DNS:*.flop.jp, DNS:*.from.tv, DNS:*.fubuki.info, DNS:*.gokujou.biz, DNS:*.grats.jp, DNS:*.grrr.jp, DNS:*.halfmoon.jp, DNS:*.ivory.ne.jp, DNS:*.jeez.jp, DNS:*.jpn.org, DNS:*.kir...

メールサーバーのドメイン名とサーバー証明書のドメイン名が一致しないのが原因のようです。

回避するには、

tls: {
                rejectUnauthorized: false
            }

とすれば、とりあえずなんとかなります。でも望ましい状態ではないので、テスト用ですね。

(参考)

paulownia.hatenablog.com

エラーその2

上記の対策後もまだエラーが出ます。 Twilio のログをみるとこんな感じです。

error: Error: Mail command failed: 550 5.7.1 <username@domainname>... Command rejected

調べてみると、さくらインターネットのデフォルトの設定では、『国外IPアドレスフィルタ』というのが有効になっており、海外のサーバーからのSMTP送信をブロックします。

help.sakura.ad.jp

このため、最初はなかなかメールがこないという状況になってしまいました。 とりあえずテストの間だけ、この設定を無効にしたらちゃんと届きました。

メール周りはいろいろありますね。メールじゃなくてslackのほうがいいかもしれないなと思い始めてます。

まとめ

Twilio を試すというのをいろいろとやってみました。 留守電、FAX送受信とも問題なくできそうです。

FAXの料金表には、送受信ページ数に関する記載しかないですが、実際には通信量もかかってます。 通信費が、送信で1分5.4円(受信は1分0.6円)なので、FAX送信数が多いと当初の目論見は成立しないかもしれません。

まあ、FAXで送るのはそれほど多くないので大丈夫かな?とタカくくってます。

なんにしても、いろいろと便利なことができそうで楽しみです。

Twilio 試した(2/3):FAX 送信を試しました

Twilio 試用のその2になります。

Twilio 試した(1/3):電話(音声通話)機能を使ってみました - プログラマーのメモ書き

Twilio 試した(2/3):FAX 送信を試しました - プログラマーのメモ書き

Twilio 試した(3/3):FAX 受信と通知を試しました - プログラマーのメモ書き

さて、次は FAX の送信を試してみたいと思います。

と、そのまえに、FAX API を使ったデモが公開されているので、こちらを見てみると FAX のイメージがつかめるかもしれません。

github.com

FAX 送信

最初に電話番号を購入する際、必要な機能を指定することができました。日本国内用の多くの電話番号は、通話とFAXが使えます。

前の記事で書いたように Twilio の電話番号の設定は着信時にどうするか?という形で書くので、FAX送信の場合は特に設定は必要ありません。 実際、着信時は音声を処理するようにしていても、FAXを送信することができます。

で、FAXの送信ですが、簡単に試すには REST API を curl でたたけばOKです。

jp.twilio.com

では、実際にやってみたいと思います。 まずは準備として送信するFAX(pdf)を準備します。

pdf の準備

今のところ Twilio 側には送信するFAX(pdfファイル)をアップロードする機能はなく、API のパラメータとして、PDFファイルのURLを指定するようです。

なので、まずはpdfファイルをアップロードします。 テストの段階では、別に誰が見てもいいのですが、一応FAXの文面が公開されるのはいろいろとまずいだろうと思います。 ということで、アップロード先は簡単でいいので認証が必要かなと思います。

さて、どこにアップロードするのがいいかな?と考えたのですが、今手持ちの環境で簡単にアップロード先として使えそうなのが、さくらインターネットのレンタルサーバーでした。 このレンサバ、いまのところメールサーバーとしてしか使ってなくて、空いてるのでテストには最適かと思います。

さくらインターネットだと、Basic認証の設定も簡単にできるそうです。

help.sakura.ad.jp

ということで、適当なディレクトリを切って、Basic認証の設定をしておきます。

あとは送信するpdfをアップロードしておけば、準備完了です。

送信

pdfの準備ができたら、下記のように呼び出します。

mor@DESKTOP-H6IEJF9:~$ curl -X POST https://fax.twilio.com/v1/Faxes
 --data-urlencode "From=+81送信元電話番号(Twilioのトライアル用電話番号)"
 --data-urlencode "To=+81送信先電話番号"
 --data-urlencode "MediaUrl=https://ユーザー名:パスワード@xxxxxxxx.sakura.ne.jp/xxxxx/test01.pdf"
 -u AccountSID:AuthToken

この時、Account Sid と AuthToken が必要になります。これらは

f:id:junichim:20181109111454p:plain

コンソールのダッシュボードに記載されています。

実際に試してみると、curlのレスポンスはすぐに返ってきますが、

{
     "media_sid":null
    ,"status":"queued"
    ,"direction":"outbound"
    ,"from":"+815送信元電話番号(Twilioのトライアル用電話番号)"
    ,"date_updated":"2018-11-09T02:06:06Z"
    ,"price":null
    ,"account_sid":"アカウントSID"
    ,"to":"+81送信先電話番号"
    ,"date_created":"2018-11-09T02:06:06Z"
    ,"url":"https://fax.twilio.com/v1/Faxes/・・・"
    ,"sid":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    ,"duration":null
    ,"num_pages":null
    ,"quality":"fine"
    ,"price_unit":null
    ,"api_version":"v1"
    ,"media_url":null
    ,"links":{
         "media":"https://fax.twilio.com/v1/Faxes/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/Media"
    }
}

といった感じで、status が queued になっています。

しばらく待つと、この作業PCの後ろにある電話機(FAX機能付き)が動き出しました。無事に送れたようです。

とりあえずは試用としてはこれでOKですね。 実際に使うときは送信状態のステータス確認や、送信失敗時の通知などもやりたいところです。

補足

今回は さくらインターネットのレンサバを使い、pdfファイルのアップロード先を作りました。

とのとき、Basic認証のパスワードに記号をあれこれいれて作ったら、Twilio側からうまくアクセスできないことがありました。 これもおいおい確認したいところです。

とはいえ、とりあえずFAXの送信もできました。最後はFAX受信と通知を試そうと思います。