FAXサーバーを作る anchor.png

家で骨董品のようなSHARPの電話/FAX機(UX-T35CL)を使っているが,何年か前にスキャナー部分が壊れてしまってFAXの送信が出来なくなっている ;(

FAXの送信はめったにしないけどたまに必要な時があるので,どうしようかと思っていた。

SHARPの電話/FAX機が置いてあるそばにRaspberry Pi Zero Wがあるんで,いまさらではあるがFAX Modemを使ってFAXを送受信出来る環境を作成し,ネットワーク上のPCからFAXを送信したり,FAXを受信したらプリンターから印刷するようにしてみた。

Page Top

FAX ModemとRaspberry Piと電話回線 anchor.png

US Roboticsの古いSPORTSTERやMegahertzもまだ持ってるけど,これらをRaspberry Pi Zero Wで使うにはちょっと大変なんで,以前使っていたRATOCのREX-USB56がどこかにあるはずなのでそれを見つけて使ってみることにした。

REX-USB56.png

Raspberry Pi Zero W学習リモコンや部屋の温度/湿度の測定なんかで使っていたんだけど,IFTTTの無料で使えるサービスが劣化してしまってからは部屋の温度/湿度の測定ぐらいにしか使っていなかった。

OSはRaspbian Stretchを使っているんだけど,しばらく更新をしてこなかったので更新作業から始めた。そしたらなかなかすんなり更新が出来ず,更新エラーを修正していたらなんとBusterになってしまった :p それでも古いけど*1・・・

Raspberry Pi Zero WのUSBコネクタはUSB 2.0 MicroUSBなんで,OTGケーブル(MicroUSB/USB A)経由でREX-USB56を接続した。自動的にハードウェアを認識して,デバイスドライバーのロードとデバイスファイルが作成された。

# lsusb
Bus 001 Device 003: ID 0572:1321 Conexant Systems (Rockwell), Inc.
 :
# dmesg | grep cdc_acm
[   21.644279] cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device
 :
# lsmod  | grep cdc_acm
cdc_acm                19834  2

# ls -la /dev/ttyACM*
crw------- 1 uucp dialout 166, 0  1月  3 09:15 /dev/ttyACM0

NTT西日本からレンタルしているRT-500KIの電話機2とREX-USB56を接続した。
電話機1には壊れているSHARPの電話/FAX機がそのままつながっていて,電話機として引き続き使っている。

NTT西日本のフレッツ光での固定電話はひかり電話なのだが,FAXを外部から着信する時に指定着信番号を追加すると電話機2で直接着信することが出来るのでFAX専用としては便利に使える。
RT-500KIの電話機2に指定着信番号に2を設定して,電話番号*2で着信できるようにした。

rt500ki.png

また,ひかり電話はアナログ電話と違いIP電話なのでパケットが途切れる場合がある。途切れた場合音声電話であれば特に問題にはならないが,FAXデータの送受信時にパケットが途切れるとFAXデータの伝送が途切れてしまいエラーとなってしまう。RT-500KIの設定の音質優先モードを「優先や最優先」に設定することで多少は改善出来るかもしれない。
現在はとりあえず「なし」で運用している。

Page Top

FAXサーバーソフトウェアのインストール anchor.png

FAXサーバーを実現するのにオープンソースで開発されていて無料で使用できるHylaFAX Community Editionをインストールする。

FAXサーバーを使うと,ネットワーク上の他のマシンからFAXを送信したり,外部からFAXを受信して他のマシンで確認したり,プリンターで印刷したり出来るようになる。
印刷しなければエコにつながるかも。

以下のようにパッケージ管理ツールでHylaFAXをインストール出来た。

# apt install hylafax-server

インストール後にfaxsetupが起動され,設定を色々と尋ねられて答えることで設定を行う。
必要だろうと思われるところだけ設定して,後はデフォルトのままにした。

  • Country Code: 81
    81で日本にする。
  • Area Code: 72
    住んでいる所の市外局番の初めの0を除いて設定する。
  • Long distance dialing prefix: 0
    国内プレフィックス番号の0にする。
  • International dialing prefix: 010
    国際電話プレフィックス番号を設定する。NTT西日本だと010。
  • Serial port that modem is connected to: ttyACM0
    FAX Modemとの通信デバイスを設定する。上記で確認したttyACM0にした。
  • Phone number of fax modem: +81.72.657.XXXX
    国番号からのFAXの番号を設定する。
  • Local identification string: 072657XXXX*2
    FAXの1行目のヘッダーで相手に知らせるFAX番号として設定する。FAX番号に*2(指定着信番号)をつけた番号にした。
  • Rings to wait before answering: 1
    早すぎるとかかってきた電話番号をうまく取得出来ないかも? でもとりあえず1にした。

これらの設定でModem関連はconfig.ttyACM0のようなファイルに保存されるので,後で変更もできる。

インストール後,TagLineFormat(FAXの1行目のヘッダーでどのように表示するかを設定する)を以下のように変更した。デフォルトだと日付部分が%cになっていて,OSのロケールが日本語だと文字化けするから。

TagLineFormat:          "From %%l|%Y-%m-%d %T|Page %%P of %%T"

ここに使われるフォントは,18pointのLucida Typewriterフォント(lutRS18.pcf)が使われている。

TagLineFont:             etc/lutRS18.pcf

用紙のサイズを/etc/hylafax/pagesizesファイルでデフォルトをA4に設定する。

default                 A4      9921    14031   9255    13207   472     345

Hylafaxサーバーにログインするためのユーザーアカウントを作成する。
管理者ユーザーの場合,

# faxadduser -a 管理者パスワード -p ユーザーパスワード ユーザー名

通常ユーザーの場合,

# faxadduser -p ユーザーパスワード ユーザー名

とすればユーザーアカウントを作成できる。
ユーザーの削除は,

# faxdeluser ユーザー名

とするようだ。

クライアントアプリから作成したユーザーアカウントで接続できる。

HylaFAXのサービスを再起動する。ステータスでエラーが無いか確認しておく。

# systemctl restart hylafax
# systemctl status hylafax -l
Page Top

FAXの送信テスト anchor.png

HylaFAXのsendfaxコマンドで送信できる。

# sendfax -n -m -d 送信先電話番号 送信するファイル(txtやpdfなんか)

送信先電話番号のところにFAXが届けば送信機能は問題ない。

Page Top

FAXの受信テスト anchor.png

外部からFAXを家の「電話番号*2」としたFAX電話番号に送ってみる。

Modemが無音で着信して,FAXが受信できれば問題ない。FAXデータは/var/spool/hylafax/recvqディレクトリにTIF画像(FAXでは標準フォーマットらしい)で保存されるので確認しておく。

Page Top

受信したFAXデータをメールで送る anchor.png

受信したFAXデータを指定した宛先へメールで送信してみる。
この場合,Raspbianでメールが外部に送信出来る環境が構築出来ている必要がある。

/etc/hylafax/FaxDispatchファイルを,以下の内容で作成する。

FILETYPE=pdf;
SENDTO=送信先メールアドレス;
FROMADDR=送信元メールアドレス;

これで,FAXを受信するとTIF画像をPDF文書に変換した後,指定した宛先へメールで送る。
複数の宛先にしたい場合は,SENDTO=XXXXXXを縦に必要数設定すればいいみたい。

/var/spool/hylafax/recvqディレクトリのTIF画像はそのまま残る。定期的に削除したほうが良いかも。
FILETYPEで指定できるのは,ps,tif,pdf。

/etc/hylafax/FaxDispatchファイルには,通常のHylaFaxの保存先とは違うカスタム処理を定義する事が可能。

Page Top

受信したFAXデータを家のプリンターで印刷する anchor.png

Raspbianで印刷出来るプリンター(最近EPSONのEW-M754Tを買った)があれば,/etc/hylafax/FaxDispatchに,

if [ -f $FILE ]; then
    tiff2ps -a -w 9 -h 11 $FILE | lp -o fitplot -o media=a4 -d EPSON_EW_M754T_Series
fi

のように追加すると,FAX受信後自動的に指定したプリンターで印刷される。
EPSON EW-M754Tは電源がOFFになっていても印刷データを受信すると自動的にONになって印刷されるのでなかなか便利(しばらくすると電源OFFになる) :)

Page Top

失敗時の通知 anchor.png

FAX送信時に何らかの原因で失敗した時は,デフォルトでジョブ番号が記載されている通知がメールされる。

通知に送信しようとしたFAX画像を含めるには,/etc/hylafax/FaxNotifyに設定する必要がある。

TOADDR=faxyyyy@xxxxx.xxx
NOTIFY_FAXMASTER=errors
RETURNFILETYPE=PDF;

実際の処理は,/var/spool/hylafax/bin/notifyで行われる。

Page Top

クライアントアプリ anchor.png

普段使っているPCのアプリからFAXを送信する時に使うHylaFAXのクライアントアプリも,いろいろリリースされている

以下は,Windowsマシンで仮想プリンターを利用してFAX送信ができるクライアントアプリ。
現在Winprint HylaFAX Reloadedを使っている。

基本的には,クライアントアプリはローカルネットワーク上(自宅orVPN接続)での環境で使用する。

Page Top

Winprint HylaFAX Reloaded anchor.png

Windowsマシンで仮想プリンターを使ってアプリから印刷をすると,FAXサーバーから送信出来るようにするHylaFAXクライアント。GPLで無料で使用できる。
受信したFAXの管理を行う機能はない。

インストールはWinprint HylaFAX ReloadedのFilesからインストーラーをダウンロード(version 0.4.11)して,ファイルをダブルクリックでインストール出来る。
自前で日本語化するfile言語ファイルを作成したので,解凍してlocaleディレクトリにコピーする。

アプリを起動しConfigureボタンをクリックしてLanguageで日本語に設定してOKを押すと,日本語表示になる。
再度設定ボタンを押して,メインタブでHylafaxが動作しているサーバーのIP Addressと上記で作成したログイン用のユーザー/パスワードを設定すると,HylaFAXサーバーに接続出来る。
ページサイズをA4に,解像度をファインに設定しておく。

Windowsアプリから印刷するプリンターにHylaFAXを選択して印刷をしてみる。
送信先のFAX番号が入力出来るダイアログが表示されるので送信先のFAX番号を入力して送信ボタンを押すと,HylaFAXのFAXサーバーからFAXが送信が出来た。

faxx.png

電話帳にはaddressbook.csvというファイル名のcsvファイル(UTF-8)が使用できる。

ABC会社,XXX-YYY-ZZZZ
Page Top

YajHFC anchor.png

YajHFCはJavaで書かれているWindows,Linux,MacOS Xなんかで動作するHylaFAXクライアントで,無料で使用できる。
Windowsでは仮想プリンターからFAX先を指定して送信が出来る。受信したFAX(recvqに保存されている)もクリックして表示できる。また送信キューの管理も出来る。

YajHFCのDownloadsからダウンロードでき,Windows用のインストーラーも用意されている。

電話帳にLDAPが使用できるのがGood。

Page Top

PDFを添付したメールからFAX送信 anchor.png

上記のHylaFAXクライアントはローカルネットワーク上(自宅orVPN接続)で使用するので,インターネット上の端末等からはFAXサーバーに接続してFAX送信は出来ない。

そこで,FAX送信したいPDFファイルを電子メールに添付して,件名に相手の送信先FAX番号を入れてメールすると,HylaFAXからメールに添付されたPDFファイルをFAX送信するようにしてみた。

これが出来ると,Internet経由のメールやAndroid端末とかでもFAXが送れるようになるので便利になる。
便利ではあるが勝手に使用されないような最小限の対策も行う必要がある。

Page Top

メールサーバーでFAX送信用のアカウントを作る anchor.png

インターネットからメールが受信できるメールサーバーに,FAX送信メール専用のメールアカウントを作成する。

自前で運用しているメールサーバーがあるので,そこにfaxxxxxというアカウントを作成した。
このメールアドレス宛にFAX送信メールを送ると,このメールサーバーに届くようにする。

Page Top

メールサーバーのメールを取得する anchor.png

HylaFAXサーバーが動作しているRaspberry Pi Zero Wで,上記のメールサーバーのfaxxxxx宛のメールを読み出すために,fetchmailを使用する。

fetchmailのインストールはパッケージ管理ツールで行える。

# apt install fetchmail mpack nkf

faxxxxxアカウントを作成し,作業ディレクトリを用意する。

$ mkdir -p ~/sendfax/tmp

fetchmailの設定ファイル~/.fetchmailrcを,以下のような内容で作成する。

set postmaster yuji                     # error mailの送信先
set no bouncemail                       # error mailを送信者に返さない
set no spambounce                       # spam mailを送信者に返さない
poll xxxxx.xxx                          # 接続mailサーバー
  protocol pop3                         # POP3
  port 995                              # 接続port
  user 'faxxxxx'                        # mailユーザー名
  pass 'yyyyyyyy'                       # mailパスワード
  ssl                                   # POP over SSL/TSLで接続
  mda '/home/faxxxxx/sendfax.sh'

内容は,メールサーバー(例ではPOP3s)に合わせて作成する。

パーミションの設定をしておく。

$ chmod 600 ~/.fetchmailrc

通常fetchmailはメールサーバーからメールを取ってきてローカルマシンのメールボックスに転送目的で使用するが,今回はメールを取ってきてsendfax.shに渡すようにしている。

Page Top

メールから添付ファイルを取り出してFAXを送信 anchor.png

メールから添付されたPDFファイルを取り出して,FAXを送信するスクリプト~/sendfax.shを作成した。

filesendfax.sh
Everything is expanded.Everything is shortened.
-
!
-
!
-
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
-
|
|
|
!
!
 
 
 
 
 
-
|
!
 
-
!
-
|
!
 
 
-
|
-
|
!
|
|
!
 
 
 
 
#!/bin/sh
 
# Hylafaxを使ってメール添付ファイル(PDF)をFAX送信する
 
# error時にメールする
err_mail()
{
  {
    echo "From: <メールアドレス>"
    echo "To: "$1
    echo "Subject: HylaFax MailFax Error"
    echo
    echo "FaxNo: "$2
    echo $3
  } | /usr/sbin/sendmail -i -t                                                  # mail送信
  rm $dest/*                                                                    # 全tempファイルを削除
  exit 0
}
 
dest=~/sendfax/tmp                                                              # temp保存先
tmp="$$"                                                                        # pidをファイル名の先頭にする
 
nkf -w > $dest/$tmp-mail                                                        # mailをutf8(mimeデコード)に変換
 
faxno=`grep -i "^Subject:" $dest/$tmp-mail | sed -e "s/subject: //i"`           # FAX送信先番号を取得
mailadr=`grep -i "^Return-Path:" $dest/$tmp-mail | sed -e "s/Return-Path: //"`  # Return-Pathから返却メールアドレスを取得
if [ "$mailadr" = "" ];then                                                     # 設定されてなかったら
  froml=`grep -i -A 1 "^from:" $dest/$tmp-mail`                                 # Fromから取得する
  if [ "`echo $froml | grep '<.*>'`" != "" ]; then
    mailadr=`echo $froml | sed -e 's/.*<\(.*\).*>.*/\1/'`
  else
    mailadr=`echo $froml | sed -e 's/^[Ff]rom://g' -e 's/[ ]*\([^ ]*\).*/\1/'`
  fi
fi
 
munpack -q -C $dest $tmp-mail                                                   # 添付ファイルを取り出す
find $dest -name "*.*" | grep " " | sed -e 's/.*/"&"/; p; s/ /_/g' | xargs -r -n2 mv    # file名の" "を"_"に置換
 
file $dest/*.* | grep -i 'PDF' | sed -e "s/:.*//" > $dest/${tmp}filelist        # pdfファイルのリスト作成(複数ファイル用)
if [ ! -s $dest/${tmp}filelist ];then
  err_mail $mailadr $faxno "No PDF File"                                        # pdfファイルがない場合はerror mailを送信
fi
 
# gsで全てのpdfファイルをマージする
gs -dNOPAUSE -dFIXEDMEDIA -dPDFFitPage -sPAPERSIZE=a4 -dBATCH -sDEVICE=pdfwrite -dAutoRotatePages=/None -o $dest/${tmp}faxdata.pdf -f `cat $dest/${tmp}filelist`
if [ $? = 1 ];then
  err_mail $mailadr $faxno "Ghostscript Error"                                  # error時はerror mailを送信
fi
 
pass=`grep -i pass: $dest/*.d* | sed 's/<[^>]*>//g' | sed -e 's/^[^:]*://'`     # 本文のpass:以降を取り出す
if [ "$pass" = "zzzzzzz" ]; then                                                # passが正しいかチェックする
  sendfax -n -m -d $faxno $dest/${tmp}faxdata.pdf                               # 正しければFAX(fine mode)を送信する
  if [ $? = 1 ];then
    err_mail $mailadr $faxno "SENDFAX ERROR"                                    # error時はerror mailを送信
  fi
else
    err_mail $mailadr $faxno "PASSWORD ERROR"                                   # 正しくなければerror mailを送信
fi
 
rm $dest/*                                                                      # 全tempファイルを削除
 
exit 0

必要なところ(トークンパスワード等)は編集し,パーミションの設定をしておく。

$ chmod 700 ~/sendfax.sh

sendfax.shはfetchmailから実行される。FAXの送信は,HylaFAXのsendfaxコマンドを使用している。

FAXサーバー側のsendfax.shで,正しいトークンが記載されているかどうかチェックし,正しくない場合はFAXの送信はしないようにしている。

こうしておかないと,どのユーザーからのメールでもFAXを送信することが出来てしまい,電話回線が勝手に使われてしまうことになってしまうから [worried]

またFAXでのカバーページは送信しないようにしている。

注意する事として,munpackだと添付ファイル名に日本語を使うとうまく処理できない場合があるので,添付ファイル名は英数字にする。

Page Top

cronでfetchmailを定期的に動かす anchor.png

fetchmailが5分毎に動作するようにcronに設定した。

*/5 * * * * /usr/bin/fetchmail -s

これで定期的にfetchmailが動作し,メールサーバーからfaxxxxx宛の新しいメールを読み出して,sendfax.shスクリプトを使ってそのメールに添付されたPDFファイルを取り出してFAX送信される。

Page Top

メールでFAX送信を依頼してみる anchor.png

電子メールでFAX送信するPDFファイル(FAX出来るのはPDFのみ)を添付し,件名に送信先のFAX番号を入れ,本文に以下のようなトークンを記載(知っている人以外にFAXを送信できなくなる)したメール作成して送信する。

pass:ZZZZZZZ

しばらくしてFAXが宛先に届けば,問題なく動作している。


*1 現在はRaspberry Pi OSになっている。

新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

Front page   Freeze Diff Backup Copy Rename Reload   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom)
Counter: 312, today: 2, yesterday: 2
Last-modified: 2023-03-23 (Thu) 19:44:16 (JST) (536d) by yuji