Email notifications for missed calls in Asterisk

A feature I have wanted for a long time is to get emails about missed calls. I have a Blackberry and knowing that people are calling and hanging up before leaving a vm is very useful when I am out in the field. I wrote a small shell script to add this functionality to Asterisk.

I place the script in the h extension of the stdexten marco. The h extension triggers once a call is hung up from that context. The first and only priority for the h extension is a System() call. It calls this shell script and passes many parameters to it. The first parameter is the email address to send the email to. To make this work for the marco, I adjust the macro to have a third parameter which is email address. I would like to pull the email address from that extensions vm but that function does not exist and I could not figure out how to add that function in the C source code. If anyone knows a better way, please let me know. The script requires you have the mailx package installed.

  • Download the script
  • Rename the file processCallEmail.sh.
    mv processCallEmail.txt processCallEmail.sh
  • Put it in the /var/lib/asterisk/agi-bin directory.
    mv processCallEmail.sh /var/lib/asterisk/agi-bin/"
  • Make sure the asterisk user has execute permissions on the script.
    chmod 755 /var/lib/asterisk/agi-bin/
    processCallEmail.sh
  • Add one line of documentation to macro-stdexten context on the line after ${ARG2}. ; ${ARG3} - email address to send emails about missed calls to
  • Add the h extension line to the macro-stdexten context. exten => h,1,System(processCallEmail.sh "${ARG3}" "${CALLERID(num)}" "${CALLERID(name) }" "${DIALSTATUS}" "${VMSTATUS}")
  • Alter the line that calls the macro to include an email address. exten => 500,1,Macro(stdexten,500,SIP/${EXTEN},abc@test.com)

Here is an example of an updated stdexten macro.
[macro-stdexten];
;
; Standard extension macro:
; ${ARG1} - Extension (we could have used ${MACRO_EXTEN} here as well
; ${ARG2} - Device(s) to ring
; ${ARG3} - email address to send emails about missed calls to
;
exten => s,1,AGI(ldaplookupphone2.agi)
exten => s,n,Dial(${ARG2},20) ; Ring the interface, 20 seconds maximum
exten => s,n,Goto(s-${DIALSTATUS},1) ; Jump based on status NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER)

exten => s-NOANSWER,1,Voicemail(${ARG1},u) ; If unavailable, send to voicemail w/ unavail announce

exten => s-NOANSWER,2,Goto(default,s,1) ; If they press #, return to start

exten => s-BUSY,1,Voicemail(${ARG1},b) ; If busy, send to voicemail w/ busy announce
exten => s-BUSY,2,Goto(default,s,1) ; If they press #, return to start

exten => _s-.,1,Goto(s-NOANSWER,1) ; Treat anything else as no answer

exten => a,1,VoicemailMain(${ARG1}) ; If they press *, send the user into VoicemailMain

exten => h,1,System(
processCallEmail.sh "${ARG3}" "${CALLERID(num)}" "${CALLERID(name) }" "${DIALSTATUS}" "${VMSTATUS}")

2 Responses to “Email notifications for missed calls in Asterisk”

  1. christendoc Says:

    Howdy,

    Can’t thank you enough for this little gem. Just started in on telephony (for fun and to feed the inner control freak, not professional). I kept looking at SIP providers to give email notification of missed calls, and no one did. So, I changed focus and sought a really lightweight PBX system (initially avoiding Asterisk) that had the feature. Alas :) this post of yours was about the only promising hit, so I spent a few days learning enough Asterisk to figure out where to plug your script in. It was a fun learn. I really fell for Asterisk in the process, and still think your script is just elegant and impressive — surpising the Digium team left this out.

    Thanks again, friend.

  2. christendoc Says:

    [LATER] Oh, and one other bit: I had to pull the backticks off this line:
    `echo $BODY | $MAILCMD $SUBJECT $EMAIL`

    It’s the payload line at the end of the script. If I’m just stupid and there’s a reason for them, let me know.

    Thanks again.

Leave a Reply

You must be logged in to post a comment.