Raspberry Pi (Raspbian)でPDFファイルをメールからFax送信する

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

メールを送信することでFaxを送信できるようにする。
なるべくポート開きたくないので、Fetchmailを使用してGmailの専用アドレスにあるメールをPOP3で受信してFaxで送信。
送信のセキュリティはGmailのフィルタ機能で設定しておく。

この記事はRaspberry Pi (Raspbian)でFAX送受信環境を構築するの続きです。

2017/11/07 追記 ミスが複数あり正しく動作しなかったため修正しました。

環境

  • Raspberry Pi(Raspbian)にHylafaxが導入されて正常にFaxの送受信ができること。[構築方法(前記事)]
    前記事に書かれている中身はすべて行われているものとしてこの記事は書かれています。

設定方法

Fetchmail、nkfをインストール


sudo apt-get install fetchmail nkf

Fetchmail設定

Fax用ユーザーアカウントで
Fetchmailの設定ファイルを作成する。


vim ~/.fetchmailrc

set postmaster root
set no bouncemail  #エラーをrootにメール送信する
poll pop.gmail.com
  protocol pop3
  port 995
  user '[ユーザー名]@gmail.com'
  pass '[パスワード]'
  ssl
  mda '/home/faxuser/sendfax.sh'

パスワードが書かれているので他ユーザーが開けないようにする。


chmod 600 ~/.fetchmailrc

シェルスクリプトを作成する。


vim ~/sendfax.sh

#!/bin/sh

err_mail()  #エラー発生時にsendmailでメール送信。
{
  {
    echo "From: [Fax用メールアドレス]"
    echo "To: "$1
    echo "Subject: HylaFax MailFax"
    echo
    echo "FaxNo: "$2
    echo $3
  }|/usr/sbin/sendmail -i -t
  exit 0
}

dest=/home/faxuser/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: //"`   #メールアドレス取得

#添付ファイル取得処理
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}"
 #base64 -d > "$dest/$(basename $1)_${b}"
done
#添付ファイルここまで

find $dest -name "* *" | rename 's/ /_/g'  #ファイル名のスペースをアンダーバーに置換

#PDFファイルのリストを作成。PDFファイルがない場合はエラーメールを送信。
file $tmp-* |grep -i 'PDF' |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

echo ${tmp}faxdata.pdf

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

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

特にこの部分は参考URLのコードをほぼそのまま使わせていただきました。

実行権限を与えて、必要なディレクトリを作成する


chmod +x ~/sendfax.sh
mkdir ~/sendfax
mkdir ~/sendfax/tmp

自動受信の設定


crontab -e

以下のコードを末尾に追加する。(3分おきにGmailにアクセスして新着メールを取得する。)


*/3 * * * * /usr/bin/fetchmail

これで設定したメールアドレスに件名を宛先電話番号にしてPDFを添付したメールを送ればFaxが送信されるはず。
ただ、Apple MailがPDFファイルを単純な添付ファイルとして扱ってくれないので、Apple Mailから送信すると正しくFax送信できない。
いろいろ試したけれども、私にはうまくシェルスクリプトを編集して改善させることはできなかったので、Automatorでプリントプラグインを書いて各アプリの印刷画面から送信できるようにした。こっちの方が便利そうだし…

参考

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメント

コメントを残す