FreePBX | Register | Issues | Wiki | Portal | Support

FPBX/Asterisk option to replace Avaya IPO "Campaigns"


Is there any way to make it use the existing email body for Voicemail instead of creating a custom one? That way it’s tied to the modifications that would be made if the system admin changes that content (and it would look like a regular voicemail). :slight_smile:

(Dickson) #22

@kristiandg here you go!

This is BETA RELEASE 3 of the code.


This is beta 3, the instructions posted above are still relevant, but the code has had enough subtle changes that I would just erase what I’ve put in before and replace with this:

Instead of the recording being directly emailed, it instead is left on an extension voicemail system and is sent using that mechanism. You will need to have an extension with a voicemail box setup that, ideally nobody answers. If someone does, it will play the message and it wont be subsequently recorded and emailed.

Additional macro called, “macro-questionanswer1”

Changes to leave the recordings as ULAW not WAV (i had problems getting the system to play wav files to callers)

I’ve tested this in the FreePBX Distro using worked ok as a beta test. It may need alteration for your own environments, however I am using commands that have been around a long time so should be compatible with most versions.
Code from strangers should never be tested in a production environment.

What this code does.
The system will ask questions, after each it will record the caller for a maximum of 15 seconds (you can change this of course) or until the users presses # key, whichever comes first.
This code allows for two questions and answers to be given.

In this example, after the 2nd answer is given, the system will play back both recordings together so you can hear it.

If caller press # the call will stop recording and continue to next questions

If caller either doesn’t say anything for 3 seconds, the system continues to next question (changeable of course)

Once the questions are done, the caller is hungup on.

The system generates a .call file which will contact an extension of your choice, one that goes directly to voicemail.

The file that is recorded is saved to thevoicemail box, then the call hangsup.
Your asterisk system will send the email to the recipient using your voicemail parameters.

To make the code simpler, for those not versed in asterisk dialplan, any line starting with a ; semicolon is a remark line and can be safely removed for ease of viewing. Lines with ; are there to either leave a comment, or to have the system not execute that line of code.

open up "extensions_custom.conf"
Copy the code below between the ------ lines into the bottom of extensions_custom.conf and then save the file.
Replace code from previous BETA 1 & 2 releases


exten => s,1,answer()
exten => s,n,playback(/var/lib/asterisk/sounds/en/custom/question1)
exten => s,n,Record(${UNIQUEID}.ulaw,3,15,a)

exten => s,n,playback(/var/lib/asterisk/sounds/en/custom/question2)
exten => s,n,Record(${UNIQUEID}.ulaw,3,15,a)

;Generate .call file that asterisk will use to send the call to a voicemail box
;Change XXXXX to be an extension in your system that you want called and have the message left on
exten => s,n,system(echo “Channel: LOCAL/XXXXX” > /var/lib/asterisk/sounds/
exten => s,n,system(echo “Context: macro-questionanswer1” >> /var/lib/asterisk/sounds/
exten => s,n,system(echo “Extension: s” >> /var/lib/asterisk/sounds/
exten => s,n,system(echo “Setvar: playfile=${UNIQUEID}” >> /var/lib/asterisk/sounds/

exten => s,n,system(mv /var/lib/asterisk/sounds/ /var/spool/asterisk/outgoing)
exten => s,n,hangup()

exten => s,1,wait(1)
exten => s,n,senddtmf(#)
exten => s,n,playback(/var/lib/asterisk/sounds/${playfile})

;delete sound file.
exten => s,n,system(rm /var/lib/asterisk/sounds/${playfile}.ulaw)
exten => s,n,hangup()


Click on “SAVE”

If you are updating this code from previous versions, you can stop here and test it out.

Create a new custom destination "questionanswer"
Set the target as
Save those changes

Create a way to trigger the application to run from dialplan.
For example, create a IVR, and set one of the numeric values a caller can enter to Custom Destination -> “questionanswer”"

Save your changes AND apply the configuration.

Create your question files.

Use system recordings, and either record them over your phone, or through a 3rd party sound recording application. If recording with another app, they must be saved as 8000khz MONO 16bit WAV PCM.

The recordings you make, set their name to “recording1” “recording2” “recording3

in /tmp/ create a file called "email.txt"
In that file put in something like
Here is a new recording to review.

Save changes.


Call and leave your recordings. System should leave the message and you should get an email alert with the message attached.

1> As previous, your recorded questions are played, and the answers are recorded into a single file.
2> After the last question is answered, the system will hangup.
3> Then the system internally places a call to the extension that you want the system to send the voicemail through.
4> When that system picks up, assuming voicemail, the system sends a “#” tone to the extension to bypass any greetings and additional instructions that voicemail systems have.
5> The system in the background plays the message that your caller left, and sends it as a voicemail.
6> Your recipient should get the message alert in their email.

Give it a test!


If you create .txt file with the proper calling parameter information, you can drop that file in the outgoing folder in asterisk and that will make your phone call happen.
Essentially these 4 lines generate the 4 line file.

The number you want to call, this example is extension 1234
exten => s,n,system(echo “Channel: LOCAL/1234” > /var/lib/asterisk/sounds/

The context you want executed when the destination 1234 answers
exten => s,n,system(echo “Context: macro-questionanswer1” >> /var/lib/asterisk/sounds/

The line you want executed in the context
exten => s,n,system(echo “Extension: s” >> /var/lib/asterisk/sounds/

Variables you want passed to the system when 1234 answers
exten => s,n,system(echo “Setvar: playfile=${UNIQUEID}” >> /var/lib/asterisk/sounds/

The variable is the most complicated piece. UniqueID is the unique number given for each call. When you are recording the calls, we use that number as the file number. However, when we call the new number to leave the voicemail, that generates a new unique ID. So in this code we set a temporary variable of “playfile” to store the unique number that is the file name. This temporary file is, in itself unique to this call, so it wont affect things if you have multiple question answers recording simultaneously…


Absolutely beautiful! Thank you!


Amazing. Your fantastic. Sure appreciate your time and efforts.



Finally got around to putting this into pre-production for the client - works wonderfully - I especially like how it maintains the voicemail notification format!!!

One thing I did notice is that, I’m guessing, because the system is making the call to voicemail, there’s no caller id. It says “from an unknown caller”.

Any way to have it call on behalf of the original CLID instead?

Also, I modified it to use the “SAME” function:
exten => s,1,answer()
same => n,playback(/var/lib/asterisk/sounds/en/custom/question1)
same => n,Record(${UNIQUEID}.ulaw,3,15,a)
same => n,playback(/var/lib/asterisk/sounds/en/custom/question2)

Thanks again for all this wonderful work!!!

(Dickson) #26

I’ll get this code back into a test system today and do some testing on the CLID. I’m sure that isn’t a big deal to resolve.


A gentleman and a scholar… Thank you, sir. :slight_smile:


Did you have any luck on this one? Thanks…


By chance, have you had a chance to explore the CLID component of this?


(Dickson) #30

Sorry, have not been able to work on this, but i’m installing it now.
I’ll update shortly.

(Dickson) #31

Again, sorry took so long to get to this, life eh?
Add the line in BOLD and it will give you the CLID info for the calls in the email and in the UCP

exten => s,n,system(echo “Channel: LOCAL/XXXXX” > /var/lib/asterisk/sounds/
exten => s,n,system(echo “Context: macro-questionanswer1” >> /var/lib/asterisk/sounds/
exten => s,n,system(echo “Extension: s” >> /var/lib/asterisk/sounds/
exten => s,n,system(echo “Setvar: playfile=${UNIQUEID}” >> /var/lib/asterisk/sounds/
exten => s,n,system(echo “CallerID: ${CALLERID(name)} ${CALLERID(number)}” >> /var/lib/asterisk/sounds/

One thing I did notice was I have quotes my posts (EX: “Channel: LOCAL/XXXX”) and when I tested it on my system, it was balking at the quotes, so I removed them and it work. I know it must have worked at the time of testing, i’m not sure why it failed so just take note, maybe there was an update or i goofed pasting it. Just be aware.

So this might be what you will need
exten => s,n,system(echo Channel: LOCAL/2004 > /var/lib/asterisk/sounds/
exten => s,n,system(echo Context: macro-questionanswer1 >> /var/lib/asterisk/sounds/
exten => s,n,system(echo Extension: s >> /var/lib/asterisk/sounds/
exten => s,n,system(echo Setvar: playfile=${UNIQUEID} >> /var/lib/asterisk/sounds/
exten => s,n,system(echo CallerID: ${CALLERID(name)} ${CALLERID(number)} >> /var/lib/asterisk/sounds/

(Dave Burgess) #32

You can probably get rid of all the quotes on that line.

(Dickson) #33

Maybe the quotes are from habit…

(Itzik) #34

Thank you!
I would use this in post agent queue hangup, anyway to add the agent name or ext the caller spoke with?



Hmmm - like an “after call survey”. NICE!

@dickson = Thanks so much. May want to update your official code above (now, Beta 4 I suppose). :wink: