読者です 読者をやめる 読者になる 読者になる

FIELD NOTES: 書を持って街へ出よう

合同会社フィールドワークス プログラマ兼代表のブログ

Asteriskで作るクラウドFAXシステム

はじめに

弊社では,会社電話/FAXをオープンソースIP-PBXソフトウェアAsteriskで運用しています。

Asterisk 13からはFAXを送受信するための機能が標準搭載されているのですが, FAXイメージをTIFFファイルレベルでやり取りする機能までしか提供されておらず, そのままでは実務には使えません。

そこで,AsteriskのFAX機能を補強するためのPythonスクリプト集(faxmail)を作成し使用しています。

Asteriskとfaxmailを利用すれば,基本的にクラウドサーバの利用料+通話料だけでクラウド電話/クラウドFAXサーバシステムが維持できます。

IDCF Cloudのクラウドサーバーの料金が月額約400円(S1サーバー+ボリューム10GB)。 また,基本料金が無料のIP電話サービスを利用していますので, 月額合計500円程度で運用できています(電話の発信は非常に少ないので)。

f:id:fet:20170518101736p:plain

何ができるのか?

Eメールを介してFAXの送受信ができます。
スマートフォンを持っていれば,どこにいてもFAXを受けられますし,FAXを送信することもできます。

FAXの受信

FAXの外線番号に着信すると自動応答して,受信したFAXイメージを画像ファイル化します。 受信完了後,PDFを添付したメールを決められたアドレスへ送信します。

ファイル添付メールの送信には,faxmailに付属するメール送信コマンド(sendmail.py)が利用できます。

FAXの送信

添付画像(PDF, TIFF, JPEG, PNG)やメール本文(HTMLまたはプレーンテキスト)をイメージ化して,FAXで送信します。

送信結果やFAXイメージをメール送信者に送り返すように設定することもできます。

基本的な使い方

PDFを添付した空メールを以下のような形式のアドレスに対して送信します。

fax+<送信先電話番号>@<自ドメイン>

メールの件名はただのメモの扱いですが,必要であれば末尾にFAX送信コマンド(sendfax.py)に与えるオプションを追加指定し,送信画質や本文テキストの扱いなどを変更することができます。

<件名> { <追加オプション> }

Dry Runモード

Dry Runモードを指定すると,FAXの送信は行わず,FAXイメージの生成のみ行います。

<件名> { --dry-run }

メールクライアントにより,MIMEマルチパートメッセージの組み立て方に癖があるようです。 広範なテストは行っていませんので,生成されるFAXイメージを確認してから実際に送信を行ってください。

本文テキストの送信

デフォルトでは本文テキストは単に無視されますが,本文をFAXイメージ化して送信する事もできます。
件名の末尾にテキスト形式指定のオプション(--textまたは-t)を指定します。

<件名> { --text <テキスト形式> }

テキスト形式として指定できるのは,以下の3種類です。

htmlを使用する場合は,本文をHTML(リッチテキスト)形式で記述します。

plainまたはmarkdownを使用する場合は,本文を標準テキスト(プレーンテキスト)形式とします。 plainでは,本文を見たままのテキストとしてイメージ化します。 markdownでは,テキストをmarkdownとして解釈し内部的にHTML貸した上でイメージ化します。

Markdown+PDFのメール

sendfax.pyコマンドにメールメッセージが渡されると,メッセージから添付画像を抽出してFAXで送信可能なTIFF G3形式に変換し,Asteriskに対してFAXの送信の指示を行います。

送信イメージ

何が必要か?

クラウドサーバー

以前は弊社でも社内サーバでAsteriskを運用していたのですが,現在ではクラウドサーバーに移行しました。 主にネットワーク回線の品質向上を狙ったもので,回線品質が十分ならばオンプレミス構成でも問題ないと思います (弊社が契約しているネットワーク回線は速度にムラがあるようで,時々音質が低下したり,一瞬音声が途切れたりしていました)。

弊社では,IDCF Cloudを S1サーバー+ボリューム10GBの構成で運用しています。

IDCF Cloudのようにグローバルアドレスが割り当てられないタイプの仮想マシンでは,AsteriskをNAT背後に設置することになりますので,NAT対策が必要になります。 下記サイト等を参考にしてください。

IP電話サービス

Asteriskに収容可能なIP電話サービスはいくつかありますが,どれもFAXでの利用を公式にサポートしているわけでありません。 事前にテストを行ってください。

弊社で確認した中では brastel の結果が良かったのでこれを採用しています。

ドメイン

メール受信のために必要になります。

SIPクライアント

IP電話

事務所に固定電話機を設置する場合は,IP電話機が必要になります。

以下のサイトに,Asteriskで接続実績のあるIP電話機のリストが掲載されています。

新規に購入するのであれば,Grandstreamかパナソニックあたりが入手しやすいのではないかと思います。

中古で良ければ,オフィスで不要になったIP電話機がヤフオク等に格安で出品されていることがあります。

SIPクライアントソフトウェア

スマートフォンやPCをIP電話機として利用することができます。

弊社では,Acrobits Softphoneを使用しています。

どうすれば使えるのか?

具体的な手順を書いてもすぐに風化してしまうので,ポイントだけ示します。

Asteriskの設定

本稿では,Asterisk 13の利用を前提としています。 Ubuntu(debian系?)であれば,aptコマンドでインストールできます。 ただし,aptコマンドでは日本語音声ファイルをインストールできないようなので,必要であれば(Asteriskのソースなどから)別途入手してください。

Asteriskの基本的な設定方法については検索すれば色々出てくると思いますので,そちらを参考にしてください。

たたし,Asteriskのバージョンによって設定ファイルの記述方法が少しづつ違ってきますので,Asterisk 13用の設定であることをよく確認してから参照してください。 特に「asterisk FAX」で検索すると,iaxmodem + hylafax の構成例が大量にヒットすると思いますが,今回の方法では適用できません。

ここまでの設定で,以下のことができるものとします。

  • 内線電話間の通話
  • 外線着信,外線発信

メールサーバーの設定

Postfixをインストールするものとします。

Eメールの送信・受信ができる状態にしてください。

faxmailの設定

githubからソースを取得して,適当な場所に配置してください。

$ git clone https://github.com/kkajita/faxmail.git

スクリプトの実行に必要な,追加ライブラリ・外部コマンドのインストール方法やAsteriskの追加設定については,添付のREADMEを参照してください。