Fax2mail

From KlavoWiki
Jump to navigationJump to search

What is fax2mail

A bash script to accept inbound faxes and forward them (in PDF/EPS/TIFF format) to the desired email addresses. This script links to Asterisk PBX.

The latest version of the fax2mail script can be downloaded from here.

CPAN Prerequisite

For fax2mail to be able to send emails mime-construct requires to be installed.

yum -y install perl cpan libyaml perl-YAML perl-Time-HiRes libtiff-tools

cd /usr/src
wget http://search.cpan.org/CPAN/authors/id/R/RO/ROSCH/mime-construct-1.11.tar.gz
tar xzvf mime-construct-1.11.tar.gz
cd mime-construct-1.11
perl Makefile.PL
make install 

Patch

Install LWP. For a list of CPAN mirrors

PERL_MM_USE_DEFAULT=1 perl -MCPAN -e "install Bundle::LWP"

For mime-construct to be configured correctly on a CentOS installation a patch must be run.

PERL_MM_USE_DEFAULT=1 perl -MCPAN -e "install Proc::WaitStat"
PERL_MM_USE_DEFAULT=1 perl -MCPAN -e "install MIME::Types"

Testing

mime-construct

You should see:

mime-construct: no recipients specified

Simple email sending

mime-construct --to "your@mail.com" --subject 'hi there' --string "test"

Email with attachment

/usr/local/bin/mime-construct --header 'Sender: MOR_FAX@TEST.COM' --header 'From: MOR_FAX@TEST.COM' --to your@mail.com --subject 'Email test' --file-attach /var/spool/asterisk/faxes/fax_test.pdf

fax extensions

[prifax]
exten => s,1,GotoIf($["${CALLERID(name)}"="${CALLERID(number)}"]?:3)
same  =>   2,Set(CALLERID(name)=)
same  =>   3,AGI(cid-lookup-v4.agi)
same  =>   4,Set(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID})
same  =>   5,Answer()
same  =>   6,Wait(2)
same  =>   7,ReceiveFAX(${FAXFILE}.tif)

exten => h,1,System(/usr/sbin/fax2mail -f ${FAXFILE} --cid-name "${CALLERID(name)}" --cid-number ${CALLERID(num)})

fax2mail v2.3 script

Slight formatting edits to the logfile.

#!/bin/bash
#=========================================================================|
#                                                                         |
# File: fax2mail                                                          |
# Type: BASH script                                                       |
# Summary: fax to E-Mail helper application for asterisk PBX              |
# Description: fax2mail is a helper application which sits between        |
#   asterisk and a MTA.  Is is designed to be called by asterisk upon the |
#   receipt of a new fax.  It will forward the received fax to the email  |
#   address of choice, and will convert the file the one of several       |
#   formats.                                                              |
#                                                                         |
#=========================================================================|
#                                                                         |
# Usage:                                                                  |
#   fax2mail allows these parameters from asterisk as follows:            |
#     -p = To attach in pdf format (default)                              |
#     -e = To attach in eps format                                        |
#     -t = To attach in tif format                                        |
#     -f = absolute path to file w/out .tif extension                     |
#     --cid-name <CID Name> = Set CID Name of caller to <CID Name>        |
#     --cid-number <CID Number> = Set CID Number of caller to <CID Number>|
#     --dest-exten <Exten Called> = Used to look up destination info      |
#         from voicemail.conf.                                            |
#     --dest-email <Destination Email> = Used to send teh email to.       |
#         optional if --dest-exten is provided so that the email address  |
#         can be looked up in voicemail.conf                              |
#                                                                         |
#=========================================================================|
#                                                                         |
# Examples:                                                               |
#   fax2mail -f /absolute/path/file                                       |
#     file.tif in /absolute/path/ would be coverted to a pdf and sent to  |
#     the email address specified in the "DEFAULTTO" global variable      |
#   fax2mail -f /absolute/path/file --dest-exten 100                      |
#     file.tif in /absolute/path/ would be converted to a pdf and sent to |
#     the email address associated with the exten 100 in voicemail.conf   |
#   fax2mail -t -f /absolute/path/file --dest-email user@domain.tld       |
#     file.tif in /absolute/path/ would be emailed in tif format to       |
#     user@domain.tld                                                     |
#                                                                         |
#=========================================================================|
#                                                                         |
#  Astrerisk config:                                                      |
#    [default]                                                            |
#    ...Unimportant stuff removed for this...                             |
#    ;Detected fax call                                                   |
#    exten => fax,1,Goto(fax,s,1)                                         |
#                                                                         |
#    [fax]                                                                |
#    exten => s,1,Macro(recvfax)                                          |
#    exten => h,1,System('/usr/bin/fax2mail --cid-number "${CALLERIDNUM}" |
#             --cid-name "${CALLERIDNAME}" --dest-exten "${INIT_EXTEN}"   |
#             -f "${FAXFILE}"')                                           |
#    NOTE: INIT_EXTEN has to be set with something similar to...          |
#          exten => s,n,Set(INIT_EXTEN=${EXTEN})                          |
#                                                                         |
#  [macro-recvfax]                                                        |
#    ;                                                                    |
#    ;  Receive incoming fax macro:                                       |
#    ;                                                                    |
#    exten => s,1,Set(FAXFILE=/var/spool/asterisk/fax/${STRFTIME(${EPOCH} |
#              ,,%Y%m%M%S)}-${CALLERIDNUM}-${INIT_EXTEN})                 |
#    exten => s,2,rxfax(${FAXFILE}.tif)                                   |
#                                                                         |
#=========================================================================|
#                                                                         |
# Dependencies:                                                           |
#   This application requires asterisk, ast_fax, app_rxfax, tifflib       |
#   mime-construct                                                        |
#                                                                         |
#=========================================================================|
#                                                                         |
# Author:                                                                 |
#   Designed and written by Michelle Dupuis on October 7, 2005            |
#   Michelle can be reached at support@ocgca                              |
#   This script and other related tools are available for download        |
#   at www.generationd.com                                                |
#                                                                         |
#=========================================================================|
#                                                                         |
# DATE         VER  AUTHOR        DESCRIPTION                             |
# Oct 7 2005   1.0  M Dupuis      Original coding                         |
# Oct 9 2005   1.8  M Dupuis      Better parameter & email checking       |
# Oct 23 2005  1.9  M Dupuis      Syntax error fixes, hand ! in ID name   |
# Oct 25 2005  2.0  M Dupuis      Improved page count mechanism           |
# Nov 23 2006  2.1  J Puckett     Generalized the script & pulled vars    |
#                                 from voicemail.conf                     |
# Nov 29 2006  2.2  J Puckett     Made grep use regex to find exten and   |
#                                 modified documentation                  |
# May 1 2008   2.3  Asif Iqbal    Fix comment error, fix double redirect  |
#                                                                         |
#=========================================================================|

VERSION="fax2mail v2.3"
LOGFILE="/var/log/asterisk/faxlog"  #Set to /dev/null to disable logging
DATETIME=$(date +"%A, %B %d %Y, at %I:%M %p")
FROMEMAIL="AsterFAX <do-not-reply@mypbx.com>"
DEFAULTTO="myaddress@somewhere.com"

echo >>$LOGFILE
echo $VERSION >>$LOGFILE
echo "Triggered on $DATETIME" >>$LOGFILE
echo "Called with $*" >>$LOGFILE

if [ ${#} -le 1 ]; then
  echo "Usage: $CMD_SCRIPT [-p | -e | -t] -f File [--cid-name <CID Name>] [--cid-number <CID Number>] [--dest-exten <Extension Called>] [--dest-name <Destination Name>] [--dest-email <Destination Email>]"
  echo "  No parameters were given.">>$LOGFILE
  exit 1;
fi

CID_NAME=""
CID_NUMBER=""
DEST_NAME=""
DEST_EMAIL=""
DEST_EXTEN=""
FILE=""
FORMAT="pdf"

while [ ${#} -gt 0 ]; do
  case "${1}" in
    "--cid-name" )
      CID_NAME=${2}
      shift
      ;;

    "--cid-number" )
      CID_NUMBER=${2}
      shift
      ;;

    "--dest-name" )
      DEST_NAME=${2}
      shift
      ;;

    "--dest-email" )
      DEST_EMAIL=${2}
      shift
      ;;
    "--dest-exten" )
      DEST_EXTEN=${2}
      shift
      ;;
    "--file" | "-f" )
      FILE=${2}
      shift
      ;;

    "-e" )
      FORMAT="eps"
      ;;

    "-t" )
      FORMAT="tif"
      ;;

    "-p" )
      FORMAT="pdf"
      ;;

  esac

  shift
done

if [ "$FILE" = "" ]; then
  echo "Error: A file is required"
  echo "  No file was given.">>$LOGFILE
  exit 1;
fi

echo "         CallerID number of fax sender = $CID_NUMBER">>$LOGFILE
echo "           CallerID name of fax sender = $CID_NAME">>$LOGFILE
echo "                     Fax number called = $DEST_EXTEN">>$LOGFILE
echo "                      Destination name = $DEST_NAME">>$LOGFILE
echo "             Destination email address = $DEST_EMAIL">>$LOGFILE
echo "Fax file name (without .tif extension) = $FILE">>$LOGFILE
echo "          Attachment format conversion = $FORMAT">>$LOGFILE
echo "" >>$LOGFILE

# Correct for missing info
if [ "$CID_NUMBER" = "" ] ; then
  CID_NUMBER="<hidden number>"
  echo "   Set CallerID number of fax sender to $CID_NUMBER">>$LOGFILE
fi
# Must surround in quotes in case name is preceded by a !

if [ "$CID_NAME" = "" ] ; then
  CID_NAME="<unknown name>"
  echo "     Set CallerID name of fax sender to $CID_NAME">>$LOGFILE
fi
if [ "$DEST_EXTEN" = "" ] ; then
  DEST_EXTEN="<unknown number>"
  echo "               Set Fax number called to $DEST_EXTEN">>$LOGFILE
fi

# Get destination name if empty
if [ "$DEST_NAME" = "" ] ; then
  DEST_NAME=`egrep "^$DEST_EXTEN\s*=>\s*" /etc/asterisk/voicemail.conf | cut -d, -f2`
  echo "                Set Destination name to $DEST_NAME">>$LOGFILE
fi

# Get destination email if empty
if [ "$DEST_EMAIL" = "" ] ; then
  DEST_EMAIL=`grep "^$DEST_EXTEN\s*=>\s*" /etc/asterisk/voicemail.conf | cut -d, -f3-`
  if [ "$DEST_EMAIL" = "" ] ; then
    DEST_EMAIL=$DEFAULTTO
  fi
  echo "       Set Destination email address to $DEST_EMAIL">>$LOGFILE
fi

echo "" >>$LOGFILE

SOURCEFILE=$FILE.tif
DESTFILE=$FILE.$FORMAT
INFOFILE=$FILE.txt
if [ -e $SOURCEFILE ]
  then
  echo "  Fax file $SOURCEFILE found.">>$LOGFILE

  # Read data from TIFF file
  PAGES=$(tiffinfo $SOURCEFILE | grep "Page" | cut -d " " -f 1)
  DT=$(tiffinfo $SOURCEFILE | grep "Date")
  DTFAX=${DT#*:}
  COUNT=${PAGES#*-}
  if [ -z $COUNT ]
  then
    # If didn't find a page count, use the number of occurrences of "spandsp"
    COUNT=$(grep -c "spandsp" $SOURCEFILE)
    if [ -z $COUNT ]
    then
      COUNT="<unknown>"
    fi
  fi

# Do any conversions requested
case "$FORMAT" in
  # Check if PDF conversion required
  "pdf" )
    tiff2pdf -f -p letter $SOURCEFILE > $DESTFILE
    #I like to keep around for a few days & use tmpwatch to clean up
#    rm -f $SOURCEFILE
    echo "  Converted $SOURCEFILE to $DESTFILE.">>$LOGFILE
    ;;

  # Check if EPS conversion required
  "eps" )
    tiff2ps -2eaz -w 8.3 -h 11.7 $SOURCEFILE > $DESTFILE
#    rm -f $SOURCEFILE
    echo "  Converted $SOURCEFILE to $DESTFILE.">>$LOGFILE
    ;;

  # Default to leave as tif
  *)
    echo "  No conversion of $SOURCEFILE required.">>$LOGFILE
    ;;
esac

echo "" >$INFOFILE
echo "Dear $DEST_NAME," >>$INFOFILE
echo "" >>$INFOFILE
echo "You have just received a $COUNT page fax:" >>$INFOFILE
echo "" >>$INFOFILE
echo "     From : $CID_NAME <$CID_NUMBER>" >>$INFOFILE
echo "       To : $DEST_EXTEN" >>$INFOFILE
echo "     Date : $DATETIME" >>$INFOFILE
echo "" >>$INFOFILE
echo "The original fax document is attached in $FORMAT format." >>$INFOFILE
cat $DESTFILE | mime-construct --subpart --attachment fax.$FORMAT --type application/$FORMAT --file - >$FILE.part1
cat $INFOFILE | mime-construct --header "From: $FROMEMAIL" --to $DEST_EMAIL --subject "[PBX]: New fax from $CID_NAME <$CID_NUMBER>" --subpart-file $FILE.part1 --file -
echo "  E-mailed file to $DEST_EMAIL">>$LOGFILE

# Delete the source and destination file
echo "  Removing destination file $DESTFILE">>$LOGFILE
rm -f $DESTFILE

echo "  Removing source file $SOURCEFILE">>$LOGFILE
rm -f $SOURCEFILE




# Exit with OK status code
RETVAL=0

# Else tif file is missing
else
echo "  Fax file $SOURCEFILE not found.">>$LOGFILE
echo -n > $INFOFILE
echo "Dear $DEST_NAME,">>$INFOFILE
echo >>$INFOFILE
echo "You have just received a fax attempt from $CID_NAME <$CID_NUMBER>, at phone number $DEST_EXTEN, on $DATETIME.  There was a problem receiving the fax.">>$INFOFILE
echo >>$INFOFILE
echo >>$INFOFILE
cat $INFOFILE | mime-construct --header "From: $FROMEMAIL" --to $DEST_EMAIL --subject "[PBX]: Failed fax attempt from $CID_NAME <$CID_NUMBER>" --file -
echo "  "E-mailed warning to $DEST_EMAIL >>$LOGFILE
RETVAL=1
fi
# Delete the temporary message file
rm -f $FILE.part1
rm -f $INFOFILE
echo >>$LOGFILE
# exit with failure code
exit $RETVAL

Installation

wget http://klaverstyn.com.au/david/asterisk/files/fax2mail -O /usr/sbin/fax2mail
chmod +x /usr/sbin/fax2mail
mkdir /var/spool/asterisk/fax