Raspberry Pi 2台でFAXをリレー送信できるようにしてみた。その②

Clipboard02

前回の続き。

前回、とりあえずメールを使ったFAXの中継サーバーが出来たのでそれをもうちょい最適化します。

タグライン上書きの問題を解決するために転送時はHylaFaxのタグラインを印字しないようにします。

sendfaxの-Fオプションでタグラインの書き換えが可能らしいのだけど…

うまく動作しないんでタグライン無しの内線番号をひとつ構築します。

 

add-fax-extensionを実行してFAX用内線番号を追加。

追加したらconfig.ttyI内線番号を書き換えます。

nano /etc/hylafax/config.ttyI内線番号

TagLineFormat:          “"

こんな感じでTagLineFormatを空にします。

こうする事で下に印字されてるタグラインが上書きされずに印字されます。

 

次はメールの送信元によって使う内線番号を変えるように以前作ったスクリプトを書き換え。

#!/bin/sh

err_mail()
{
{
echo “From: sendfax@cactus-garage.jp"
echo “To: “$1
echo “Subject: HylaFax MailFax Error"
echo
echo “FaxNo: “$2
echo $3
}|sendmail -i -t
exit 0
}

dest=/usr/sendfax/tmp
tmp="$dest/$$"
nkf -w > $tmp-mail   #漢字コード変換
faxno=`grep -i “^Subject:" $tmp-mail | sed -e “s/[^0-9]//g"`  #メールのタイトルから数字のみを抽出
mailadr=`grep -i “^Return-Path:" $tmp-mail | sed -e “s/Return-Path: <//i" -e"s/>//"`  #送信元メールアドレスを抽出

modetext=`grep -i “Quality:" $tmp-mail`  #本文のQualityの行を抽出
sizetext=`grep -i “Size:" $tmp-mail`     #本文のSizeの行を抽出

grep -i '^Content-Type:’ “$tmp-mail" |
grep “multipart/mixed" |
head -n 1 |
sed 's/..*boundary=//’ |
tr -d '"' > $tmp-boundary
awk -v b="^–$(cat $tmp-boundary)" -v f="$tmp-F" \
'{if($0~b){a++};print > f a}’ “$tmp-mail"
grep -i 'filename=’ $tmp-F* |
sed 's/^\([^:][^:]*\):..*filename=\(..*\)/\1 \2/’ |
tr -d '"' |
while read a b ; do
sed -n '/^$/,$p’ “$a" |
base64 -d > “$a-${b}"
done

find $dest -name “* *" | rename 's/ /_/g’
file $tmp-* |grep -i “PDF DOCUMENT" |sed -e “s/:.*//" > $tmp-filelist
if [ ! -s $tmp-filelist ];then
err_mail $mailadr $faxno “No PDF File"
fi

gs -dNOPAUSE -dFIXEDMEDIA -dPDFFitPage -sPAPERSIZE=a4 -dBATCH -sDEVICE=pdfwrite -dAutoRotatePages=/None -o $tmp-faxdata.pdf -f `cat $tmp-filelist`
if [ $? = 1 ];then
err_mail $mailadr $faxno “Ghostscript Error"
fi

case $mailadr in
*送信元メールアドレス*)
modem="ttyI内線番号@127.0.0.1″;;  #送信元メールアドレスが転送サーバからの場合転送用内線番号を使用
*)
modem="ttyI内線番号@127.0.0.1″;;  #それ以外の場合は通常のHylaFax内線番号を使用
esac

case $modetext in  #メール本文から抽出したQuality行を確認
*Normal*)
mode="";;       #行にNomalの文字列がある場合はオプション無し
*Fine*)
mode="-m";;     #行にFineの文字列あある場合は-mのオプションを付ける
*)
mode="-G";;     #それ以外の場合は-Gのオプションを付ける
esac

case $sizetext in   #メール本文のSizeの行を確認して-sオプションを使用して用紙サイズを指定
*A3*)
size="-s A3″;;
*A5*)
size="-s A5″;;
*A6*)
size="-s A6″;;
*B4*)
size="-s B4″;;
*)
size="-s A4″;;
esac

sendfax -f $mailadr $mode $size -n -T 3 -d $faxno $tmp-faxdata.pdf -h $modem   #各オプションを合わせてsendfaxを実行。

if [ $? = 1 ];then
err_mail $mailadr $faxno “SENDFAX ERROR"
fi
rm $tmp*
exit 0

とりあえずシェルスクリプトはこんな感じにしてみた。

これでアナログFAXで受信した用紙サイズや画質などをそのまま引き継いでHylaFaxから転送可能になったはず…

なのだけど…画質設定の-Gのオプションがうまく動かないので実質使えるのはFineとNomalの二種類です。

何故か-Gを指定してもFineでしか動作しません。

これもネットで調べてみたけれど原因は不明。

受信はSuperfineやHyperfineもちゃんと処理できるのに送信だけは処理できず…

なのでアナログFAXから高画質送信をするときはFineモードまでになります。

Superfineモードは解像度変換時に画像が荒れるから使わないほうがいいけれどいわゆる写真モードはHyperfine相当だけどアナログFAX側でディザ処理をしてくれるので転送時にFineに画質は落ちるものの写真もそこそこ綺麗に送れるから使えるかも?

メールの本文から用紙サイズの指定が可能になったので今までのMail to Faxでも同じようにSize等を書き換えて動作OKになりました!

 

とりあえずFax転送サーバはこんな感じで完成。

SuperfineやHyperfineの扱い方がわかったらまた更新します。

あと、転送サーバ側の送信元アドレスの指定はFaxDispatchでFROMADRを指定して書き換えれるので使い勝手に合わせて変更しましょう。

 

以前、同じように設定してもメールが届かないという質問を頂いた事がありますが…

RasPBXのメール送信はデフォルトのままだとEXIM4を使ったSMTPDで送信しています。

スパムメール等の送信に悪用される可能性があるので一部のISPではSMTPDのポートが閉じられているため外部にメールが送信できなくなっているのが原因です。

メールが送信出来ない場合はEXIM4の設定を変更してスマートホスト経由でのメール送信等に設定してみてください。

詳しくはネットで調べればいくらでも出てきますからここでは省略します!

 

まぁ、ネットで自宅サーバ運用を何かしら使うのだったら迂回策を使うよりもプロバイダから選定した方がいいと思うんで…この際プロバイダから選びなおしてみてはいかがですかね?