linux による FAX サーバの構築と Windows クライアントからの利用方法

linux サーバ上に FAX サーバを構築し,サーバで受信した FAX を Windows PC で閲覧する方法,ならびに Windows PC で作成したドキュメントを FAX サーバから送信する方法,について解説しています.
FAX 送信にあたっては,linux 側のシェルオペレーションによることなく行なえるよう,Windows 用の GUI クライアントアプリも用意しました.

必要なパッケージのインストール
必要となるファイル ( 群 ) と,その説明

ファイル ( 群 )説明含まれるパッケージ
mgetty+sendfaxFAXサーバの本体mgetty-sendfax
g32pbmG3 FAX ファイルを PBM ファイルに変換するユーティリティmgetty-sendfax
pnmtopsP?M ファイルを postscript ファイルに変換するユーティリティnetpbm-progs
convertG3 FAX ファイルと TIFF ファイルの相互変換ユーティリティImageMagick
cu端末エミュレータ ( モデムのチェック用 )uucp

mgetty+sendfax は,送受信ともに直接には G3 FAX ファイルしか取り扱えません.
受信時は,g32pbm と pnmtops で G3 FAX → PBM → postscript でプリンタ出力するとともに,convert で G3 FAX → TIFF で Windows PC からも閲覧可能にします.
送信時は,Windows PC で TIFF ファイルを用意し,convert で TIFF → G3 FAX で FAX 送信します.

なお,ここで使用した convert は,恐ろしく多様な画像ファイルフォーマットに対応した,スグレモノ相互変換ソフトです.
よくは調べてないのですが,ひょっとしたら convert だけあれば g32pbm も pnmtops も必要ないのかも知れません.

モデムとデバイスファイルの準備・確認
デバイスファイルの確認
モデムを com1 に接続した場合,通常は /dev/ttyS0
# ls -l /dev/ttyS0 ↓
crw-rw---- 1 uucp uucp 4, 64 9月 21 10:08 /dev/ttyS0

モデムの接続確認 & 機種チェック
# cu -l /dev/ttyS0 ↓
Connected.
at ↓
OK
at+fmfr? ↓
ROCKWELL ( ROCKWELL モデムで ・・・ )
OK
at+fmdl? ↓
AC/V34 ( CCITT V.34 に準拠していれば ・・・ )
OK
at+frev? ↓
V1.510-V34_DS_JS ( 多少のバージョン違いは問題ありません )
OK
~. ( ディルダでターミナルモードエスケープ,ドットでディスコネクト&cu 終了. [enter] キーは必要ありません )
Disconnected.

FAX 受信関係の設定
/etc/mgetty+sendfax/mgetty.config の編集
以下を修正
fax-id はユニークな文字列であれば何でも良いが,慣例上 FAX 番号を使うことが多いようです
# set the local fax station id
#fax-id 49 115 xxxxxxxx
fax-id +81-12-345-6789

以下を追加
# MICRO CORE MC288XLII, connected to ttyS0:
# Rockwell modem, needs "switchbd 19200" to receive faxes
#
port ttyS0
fax-only yes
speed 38400
switchbd 19200
ringback no    ( ※1 )

※1 ここで,

  ringback yes
  ringback-time nn  ( nn は数値 )

とすれば,一回目の 「 被呼 」 を無視し,その後 nn 秒以内にかかってきた2度目の 「 被呼 」 に応答する,という動作となる
これは1つの電話回線を音声電話と FAX とで共用する場合に,FAX からの呼び出しを通常の電話呼び出しと区別するための機能である
FAX の送り手は,最初の呼び出しを一旦切り,nn 秒以内にリトライすることで,相手 ( 当方のサーバ ) の FAX につないでもらえるというしくみ ・・・
のはずなのだが,わきたのところではこれがどうもうまくいかない. 仕方ないので回線を FAX 専用としています.

/etc/mgetty+sendfax/new_fax の新規作成&編集
FAX 受信が完了して /var/spool/fax/incoming に G3 FAX ファイルが作成されると,そのフルパス名を引数として呼び出されるスクリプトです. この例では ・・・
  1. まず,引数として与えられた G3 FAX ファイルを g32pbm & pnmtops 経由で lpr にパイプすることで印刷し,
  2. 次に,同じ G3 FAX ファイルを convert でマルチページ TIFF ファイルに変換して 「 受信済ディレクトリ 」 ( ここでは /shared/fax.receive/ ) に格納し,
  3. 最後に,引数として与えられた G3 FAX ファイルを消去
・・・ しています. これ以外の例としては /usr/share/doc/mgetty-<version>/samples/new_fax.all/ にサンプルがあります
#!/bin/sh
shift 3

G32PBM="/usr/bin/g32pbm"
PNMTOPS="/usr/bin/pnmtops"
CONVERT="/usr/bin/convert"

TIFFDIR="/shared/fax.received"

TIFFGROUP="users"
TIFFMODE="644"

files=

for i in $@
do
  # print
  $G32PBM $i | $PNMTOPS | lpr

  files="$files fax:`basename $i`"
done

# convert to Multi-Paged TIFF
BASENAME=`basename $1 .01`
TIFFPATH=$TIFFDIR/$BASENAME.tif

cd `dirname $1`

if [ "${BASENAME##fn*}" != $BASENAME ] ; then
  $CONVERT -monochrome -size 1728x2339 -geometry 1728x2339! $files $TIFFPATH
else
  $CONVERT -monochrome -size 1728x2339 $files $TIFFPATH
fi

chgrp $TIFFGROUP $TIFFPATH
chmod $TIFFMODE $TIFFPATH

# delete
rm -f $*

exit 0

念のために,シェルから new_fax スクリプトファイルに実行パーミッションを与える
# chmod a+x /etc/mgetty+sendfax/new_fax ↓

FAX 送信関係の設定
/usr/bin/faxrm の編集
faxq-helper の正しいパスを設定. もともと正しいパスが設定されていた場合には,不要
#FAX_HELPER=/usr/local/lib/mgetty+sendfax/faxq-helper
FAX_HELPER=/usr/lib/mgetty+sendfax/faxq-helper

/usr/bin/faxq の編集
前述,/usr/bin/faxrm と同様に

/etc/mgetty+sendfax/sendfax.config の編集
送信先 FAX 機に通知する,こちら ( 送信元 ) の電話番号を設定
# which fax number to transmit to the receiving station
#fax-id 49 115 xxxxxxxx
fax-id +81-12-345-6789

/etc/mgetty+sendfax/faxheader の編集 ( 無ければ新規作成 )
送信 FAX のヘッダに印刷される文字列を設定

   FAX FROM: Our Company's Name +81-12-345-6789  TO: @T@  PAGE: @P@ OF @M@

/var/spool/fax/outgoing のパーミッション設定
一般ユーザに,FAX送信スプールディレクトリへの書き込み/移動を許可する
# chmod o+rx /var/spool/fax/outgoing ↓
二重の誤り
「 一般ユーザに ・・・ 書き込み/移動を許可 」 なら,o+rx ではなく o+wx だろうがっ!
そのうえ,スプールディレクトリにこのパーミッションを与える必要すらなかった ・・・ orz
という訳で,この項目は削除

/etc/mgetty+sendfax/fax.allow の編集 ( 無ければ新規作成 )
FAX送信を許可するユーザを,1 user/1行 の形式にて追加
root
guest
faxsender
etc...

/etc/mgetty+sendfax/faxaliases および ~/.faxnrs の編集 ( 無ければ新規作成 )
FAX 送信先電話番号のエイリアスを定義
/etc/mgetty+sendfax/faxaliases はグローバルエイリアス,~/.faxnrs は上記ユーザ毎のプライベートエイリアス,です

  AliasName <WhiteSpaces> FaxNumber [ < WhiteSpaces > Description ]

の形式で,1 alias/1行 で記述します
FAX 番号の 「 別名 」 を使用しないのならば,このファイルは必要ありません. わきたは後に述べる ManageFAX ( Windows 版 FAX クライアントソフト ) で FAX を操作しているので,エイリアスは使用していません
office 03-4444-5555
annex 03-6666-7777 MyAnnexOffice
doctor 042-888-9999 MyHomeDoc
etc...

/etc/inittab の編集
mgetty ( FAX 受信 ) と faxrunqd ( FAX 送信 ) とを,常時起動に設定
# Run mgetty for fax modem connected at /dev/ttyS0
FR:235:respawn:/sbin/mgetty -a -n 1 ttyS0
FS:235:respawn:/usr/sbin/faxrunqd -l ttyS0

シェルから /etc/inittab の変更をシステムに反映させる
# telinit q ↓

使用方法
ここでは,下記の構成を前提として,この FAX サーバの使用方法を説明します

Windows から見たときのサーバ名 :fx_srvr
このサーバ上で FAX 送信するユーザ名 :faxsender
サーバ上の /shared 以下が,samba により共有名 「 shared 」 で公開されている
ManageFAX を使用する Windows ホストと Windows ユーザに対して,rsh が開かれている ( 下記 「 FAX 送信 − その2 」 の場合のみ )

ディレクトリ構成
名称linux でのディレクトリパスWindows から見たフォルダパス説明
受信済ディレクトリ/shared/fax.received/\\fx_srvr\shared\fax.received\受信済みの FAX イメージ ( マルチページ TIFF ファイル ) 格納用ディレクトリ
送信済ディレクトリ/shared/fax.sent/\\fx_srvr\shared\fax.sent\送信済みの FAX イメージ ( マルチページ TIFF ファイル ) 格納用ディレクトリ
送信用ディレクトリ/shared/fax.sent/to.send/\\fx_srvr\shared\fax.sent\to.send\これから送信する FAX イメージ ( マルチページ TIFF ファイル ) が置かれるディレクトリ
送信用一時ディレクトリ/shared/fax.sent/to.send/tmp.g3/\\fx_srvr\shared\fax.sent\to.send\tmp.g3\送信用テンポラリ ( G3 FAX ファイルが一時的に置かれる ) ディレクトリ

FAX 受信
mgetty がモデムを常時監視している
FAX 着信を検出するとデータ受信を開始し,G3 FAX ファイルのまま /var/spool/fax/incoming/ ディレクトリにセーブ. その後,/etc/mgetty+sendfax/new_fax スクリプトを起動する
/etc/mgetty+sendfax/new_fax は G3 FAX ファイルをプリンタ出力するとともに,マルチページ TIFF ファイルに変換して 「 受信済ディレクトリ 」 に格納する
従って,FAX 受信において行うべき操作は,特になし

FAX 送信 − その1 ( 正統派 linuxer スタイル )
正統派 linuxer は,シェルコマンドラインから送信すべし

まず,Windows 側でマルチページ TIFF 形式による FAX イメージを作成する ( Windows での マルチページ TIFF FAX イメージの作成方法については,後述
これを 「送信用ディレクトリ 」 に置き,convert で G3 FAX ファイル化して 「 送信用一時ディレクトリ 」 に保存 ( 別ディレクトリに保存する必要はないが,「 FAX 送信 − その2 」 で述べる ManageFAX の動作をマニュアルで行なうとこうなる )
G3 FAX ファイルを faxspool で FAX 送信キューに放り込むと,しかるべきのちに,常時起動されている faxrunqd がこれを検知して faxrunq で送信してくれる
faxspool 実行後,「 送信用ディレクトリ 」 のマルチページ TIFF FAX イメージを 「 送信済ディレクトリ 」 に移動. さらに 「 送信用一時ディレクトリ 」 の G3 FAX ファイルを消去して,おしまい
< samba を利用した Windows 側での操作により,マルチページ TIFF FAX イメージ ( FAXFILE.tif ) が 「 送信用ディレクトリ 」 にすでに置かれているものとする >

< ユーザ名 「 faxsender 」 で login >

$ convert -monochrome tif:/shared/fax.sent/to.send/FAXFILE.tif /shared/fax.sent/to.send/tmp.g3/FAXFILE-%03d.g3 ↓
< 例えば3ページの FAX イメージであれば,FAXFILE-000.g3 〜 FAXFILE-002.g3 の3ファイルが,「 送信用一時ディレクトリ 」 の下に作られる >

$ faxspool 03-4444-5555 /shared/fax.sent/to.send/tmp.g3/FAXFILE-???.g3 ↓
$ mv /shared/fax.sent/to.send/FAXFILE.tif /shared/fax.sent/. ↓
$ rm /shared/fax.sent/to.send/tmp.g3/FAXFILE-???.g3 ↓

FAX 送信 − その2 ( へなちょこ Windows ユーザ スタイル )
まぁ,お前ら へなちょこ Windows ユーザは GUI でもいじってなさいってこった

と言われちゃいそうな諸兄に朗報!
上記 「 FAX 送信 − その1 」 の手順を,Windows 側でいっさいがっさい実行してくれる GUI アプリ 「 ManageFAX 」 を作っちゃいました ( msvc++ による )

ManageFAX のダウンロードはこちら ( 2005/12/28 Ver.1.20 アップ出来 → 更新履歴

メインダイアログのタイトルバーの左端にある小アイコンをクリックすると,ポップアップメニューが現れる. このメニューのなかの [ 設定 ] をクリック ( 下図参照 )

ManageFAX は,FAX 送信に関わるファイルのディレクトリ間コピー/移動/消去は ローカルの Windows サイドで行ないますが,FAX 送信コマンドの実行はリモートの linux 上で行なわせます ( 当たり前 ).
この 「 リモートでの実行 」 には rsh を使用していますので,FAX サーバを置く linux サーバでは 必ず rsh が実行できるようにしておいて下さい.

具体的には ・・・
  • rshd の常時起動
  • サーバ上で FAX 送信を行なわせるユーザ ( ここでは 「 faxsender 」 ) のホームディレクトリ直下に .rhosts を作成
  • セキュリティの確認 ( ルータ経由でインターネットに接続しているのなら,ルータの 514 番ポートが閉じてあるか確認 )
などの作業です.

ポップアップメニュー

以下,前述の構成を前提に説明します ( 下図参照 )

[ フォルダ情報 ] セクションは,前述のディレクトリ構成に従って設定.
「 送信用ディレクトリ 」 から 「 送信済ディレクトリ 」 へのファイル移動は Windows サイドで行なっているので,[ 送信済みフォルダ ] については linux 上でのパスは必要なし
ManageFAX は FAX 受信に関わる動作は行わないが,過去に受信済みの FAX イメージファイルを参照するために当該フォルダを開く機能だけは備えているので,[ 受信済みフォルダ ] の Windows から見たときのパス設定が必要

[ サーバ情報 ] セクション ・・・
サーバアドレスには,FAX サーバ ( fx_srvr ) の IP アドレスを設定
実行ユーザは,サーバ上で FAX 送信を行なうユーザ名を設定 ( ここでは,前述の 「 構成 」 に従い 「 faxsender 」 としてある )
上記ユーザのログイン環境で4つの 「 リモートコマンド 」 に path がとおっていれば,[ リモートコマンド ] セクションにはコマンドファイル名をそのまま設定すれば良い. path がとおっていない場合には,linux 上での絶対パスを設定

設定ダイアログ

マルチページ TIFF 形式による FAX イメージを作成するところまでは,「 FAX 送信 − その1 」 と同じ
以下,下図を参照しながら ・・・

ManageFAX を起動して,[ 送信ファイル ] エディットボックスにこの FAX イメージファイルのパス名を入力するなり,その横の [ 参照 ] ボタンで指定するなり,FAX イメージファイルを ManageFAX のメインダイアログに DnD するなり,あるいは FAX イメージファイルの拡張子を ManageFAX に関連付けしてあれば FAX イメージファイルをダブルクリックするなり ・・・

あとは [ 宛先 ] を指定して [ 送信 ] ボタンをクリックするだけ. 宛先の指定は,[ 名称 ] コンボボックスから選んでも,[ 番号 ] エディットボックスで直接入力してもOK

直前の送信を取り消すなら [ クイック取消 ],現在の FAX 送信キューを表示して任意の送信を取り消すなら取消ウィンドウを [ 開く ]

電話帳への宛先追加は [ 名称 ] コンボボックスと [ 番号 ] エディットボックスに直接文字列入力してから,この宛先を [ 更新 ]. 宛先の番号変更は [ 名称 ] コンボボックスで目的の宛先を選んで [ 番号 ] エディットボックスの内容を修正し [ 更新 ]. この状態で [ 削除 ] ボタンをクリックすれば,その宛先が電話帳から削除される

過去に受け取った FAX/過去に送った FAX を見たければ,それぞれの FAX フォルダを [ 開く ] にて

メインダイアログ

Windows 上でのマルチページ TIFF 形式 FAX イメージファイルの作成方法
linux 上で convert を使って TIFF ファイルから G3 FAX ファイルを生成するためには,元となる TIFF ファイルはタダの TIFF ファイルではダメ.
2値画像じゃなきゃいけないし,解像度&イメージサイズも FAX 互換でなきゃならない.
加えて,複数ページにわたる FAX を扱い易くするためには,マルチページ TIFF であることも望まれる.
そんな注文の多い TIFF ファイル,いったいどうやって作るの?

これがねぇ,実に簡単にできるんですよ!

自分の Windows PC の [ コントロールパネル ] − [ プリンタ ] に,FAX プリンタはありますか? あれば良し,なければ何とかして FAX プリンタを追加してください.
Win2K や XP などの PnP をサポートしてる OS と ポート&デバイスの組み合わせであれば,FAX モデムをつないで電源を入れ OS を立ち上げれば,自動認識して FAX プリンタが追加されます. 手頃な FAX モデムが手元にない場合や,PnP による自動認識がうまくいかない場合には [ コントロールパネル ] で FAX プリンタの追加,あるいはモデムの追加で generic FAX modem を追加すれば,やはり FAX プリンタを追加できるはずです.

FAX プリンタさえ追加できれば,通常の 「 印刷 」 をサポートしている Windows アプリであれば,マルチページ TIFF 形式 FAX イメージファイルが出力できるんです
例えば,MS Word ドキュメントを FAX イメージ化したければ,MS Word で当該ドキュメントを開き [ ファイル ] − [ 印刷 ] へ. ここで出力先プリンタとして 「 FAX 」 を選び,[ ファイルへ出力 ] をチェックして,印刷.
こうして生成される印刷イメージファイルは,マルチページ TIFF 形式の FAX イメージファイルになってるんです.

あとは,このファイルをそのまま FAX 送信するも良し,イメージングなど TIFF を扱えるアプリで文字を入れるなどモディファイしてから FAX 送信するも良し.

ただし,モディファイした場合,アプリによっては上書き保存しても元のファイルの形式を変えてしまうことがあります(イメージングなどが,その例).
モディファイした結果は,もう一度 「 FAX プリンタ 」 への印刷で 「 ファイルへの出力 」 にてイメージファイル化するようにしましょう.

戻る