Fax2mail

From KlavoWiki
Revision as of 03:09, 7 April 2009 by David (Sọ̀rọ̀ | contribs)
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.

fax2mail v2.3 script

#!/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="Asterisk PBX <asterisk@spinen.com>"
DEFAULTTO="info@spinen.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

# Correct for missing info
if [ "$CID_NUMBER" = "" ] ; then
  CID_NUMBER="<unknown 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

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 -n >$INFOFILE
echo "Dear $DEST_NAME,">>$INFOFILE
echo >>$INFOFILE
echo "You have just received a $COUNT page fax from $CID_NAME <$CID_NUMBER>, at phone number $DEST_EXTEN, on $DATETIME.  The original fax document is attached in $FORMAT format.">>$INFOFILE
echo >>$INFOFILE
echo >>$INFOFILE
echo >>$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 destination file
echo "  Removing destination file $DESTFILE">>$LOGFILE
rm -f $DESTFILE

# 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