Modified version of fax2mail that ties to voicemail.conf

We have a PRI with blocks of DID’s, and we wanted to have a single number for direct line & direct fax. Plus we really don’t want fax–we use email. Anyhow, I have taken 's fax2mail script and modified it to map extensions to email addresses to keep from duplicating entering that info. While we in it, we changed up a few things. Please let me know what you think, and if you see any pitfalls–I am new to *, so I maybe doing something stupid here?

fax2mail…

[code]#!/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 expects seven parameters from asterisk as follows: |

$1 = CallerID Number of fax sender |

$2 = CallerID Name of fax sender |

$3 = Fax number called |

$4 = Destination name |

$5 = Destination email address |

$6 = Fax file name (without .tif extension) |

$7 = Format conversion (n=none,p=pdf,e=eps) |

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 avaiable 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 Generisized the script & pulled vars |

from voicemail.conf |

#--------------------------------------------------------------------------
#!/bin/bash

Script to mail the received file to the specified user

Send the tiff file to the email address

VERSION=“fax2mail v2.1"
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@domain.tld"
DEFAULTTO=“where.ever@domain.tld”

if [ ${#} -eq 0 ]; then
echo "Usage: $CMD_SCRIPT [-p | -e | -t] -f File [–cid-name ] [–cid-number ] [–dest-exten ] [–dest-name ] [–dest-number ]"
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"
  ;;

esac

shift
done

if [ “$FILE” = “” ]; then
echo "Error: A file is required"
exit 1;
fi

echo >>$LOGFILE
echo $VERSION >>$LOGFILE
echo " Triggered on $DATETIME">>$LOGFILE
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="“
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="“
echo " Set CallerID name of fax sender to $CID_NAME”>>$LOGFILE
fi
if [ “$DEST_EXTEN” = “” ] ; then
DEST_EXTEN="“
echo " Set Fax number called to $DEST_EXTEN”>>$LOGFILE
fi

Get destination name if empty

if [ “$DEST_NAME” = “” ] ; then
DEST_NAME=grep $DEST_EXTEN /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 /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 occurances of “spandsp"
COUNT=$(grep -c “spandsp” $SOURCEFILE)
if [ -z $COUNT ]
then
COUNT=”"
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 arround 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 $CID_NAME-$CID_NUMBER.$FORMAT --type application/$FORMAT --file - >$FILE.part1
cat $INFOFILE | mime-construct --header “From: $FROMEMAIL” --to $DEST_EMAIL --subject “[Fax]: 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 “[Fax]: 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
[/code]
part of extensions.conf…

[code]
[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}”’)[/code]
part of macros.incl…

[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)
Please let me know if you see anything that could cause issues.

Well, I found a bug with the grep when looking for the email address. I have replaced with a regex. Additionally, I have modified the documentation…

[code]#!/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 = Set CID Name of caller to |

–cid-number = Set CID Number of caller to |

–dest-exten = Used to look up destination info |

from voicemail.conf. |

–dest-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.1.1 J Puckett Made grep use regex to find exten and |

modified documentation |

|

#=========================================================================|

VERSION=“fax2mail v2.1.1"
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@domain.tld"
DEFAULTTO=“whatever@domain.tld”

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-number ] [–dest-exten ] [–dest-name ] [–dest-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="“
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="“
echo " Set CallerID name of fax sender to $CID_NAME”>>$LOGFILE
fi
if [ “$DEST_EXTEN” = “” ] ; then
DEST_EXTEN="“
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=”"
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
[/code]