mail2fax その3!

Clipboard02

前回前々回のつづき たぶんこれで完成版。

いろんなPDFファイルぶち込んでテストしていたところ一部ファイルがpdftopsで変換するとHylafaxの送信中にハングアップする事が判明したのでpdftopsとpdftkをやめて処理をGhostscriptに投げる形にしてみました!

更にmunpackは2バイト文字が使えない関係で文字数が同じファイルを同時に送信すると上書きしてファイルがファイルが一枚しか生成されない問題も対策。

更に更にPDFファイルが添付されていなかった場合はメールで通知して処理を中断します。

 

と、言うわけで大幅に仕様変更したので前の記事から試してる人は古いパッケージは消してくださいw

 

最終的にRasPBXで運用するにあたり追加するパッケージはこれだけ。

apt-get install fetchmail nfk

nfkも無しで処理出来るけど楽だからそのまま使う。

fetchmailの設定は以前の記事と同じだから省略。

続いてシェルスクリプト

#!/bin/sh

err_mail()  #エラー発生時にsendmailでメール送信。
{
  {
    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  #メールをMIMEデコードして保存
faxno=`grep -i "^Subject:" $tmp-mail | sed -e "s/subject: //i"`   #タイトル取得
mailadr=`grep -i "^Return-Path:" $tmp-mail | sed -e "s/Return-Path: <//i" -e"s/>//"`   #メールアドレス取得

#添付ファイル取得処理
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'  #ファイル名のスペースをアンダーバーに置換

#PDFファイルのリストを作成。PDFファイルがない場合はエラーメールを送信。
file $tmp-* |grep -i "PDF DOCUMENT" |sed -e "s/:.*//" > ${tmp}filelist
if [ ! -s ${tmp}filelist ];then
  err_mail $mailadr $faxno "No PDF File"
fi

#GhostscriptでPDFファイルを処理。全ファイルをA4縦に変換して連結。処理失敗時はエラーメールを送信。
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

#FAX送信 エラー時はメール送信。
sendfax -f $mailadr -n -d $faxno ${tmp}faxdata.pdf
if [ $? = 1 ];then
  err_mail $mailadr $faxno "SENDFAX ERROR"
fi

#一時ファイルを削除して終了。
rm $tmp*
exit 0

こんな感じです。

メールの添付ファイルの切り出し処理はこちらのサイトを参考に(丸パクリ)しました。(部分的に改変してソースを汚くしちゃってるんでコメントは削除させてもらってます。)

grepやsedで処理出来るのはわかっていたけど自分の知識ではもっとめちゃくちゃなソースになりそうだから助かった!

 

とりあえずこれで前回のよりは遥かに安定して動くはず!

GSで日本語が表示されなかったのはPDF2PSが日本語処理できていないようでGSを直接叩けばある程度は表示されました。

あと、SendFaxに送るのに今回はPDFのまま送ってますけどGSで結局HylaFaxは処理してるんでPSで送りつけてもPDFで送りつけても大差ないと思う(?)

 

今回、自分はFAX専用メールアドレスを使用しているので普段メールアドレスを管理する事はありません。

そのためFetchmailには何がなんでも正常終了を送ってメールを削除させるように処理してます。

エラーを返してしまうとFetchmailがメールを削除せずにdaemonで永遠とエラー処理を繰り返しちゃうからこんな感じの処理でOKだと思う。

 

GSに変えたらPDF処理もかなり軽くなったのでRaspberry Piでの運用も問題なさそう。