Send mp3 in voicemails with FreePBX 14

This post is an update to “Send mp3 voicemails with FreePBX 13

An updated sendmailmp3 script that will work in FreePBX 14 (and 13, but you have to install lame). With 14, lame and sox are included in the distro, so you just need to do these steps:

  1. Create sendmailmp3 in /usr/sbin
  2. Paste in the text from the newer version of the script available here: http://bernaerts.dyndns.org/linux/179-asterisk-voicemail-mp3
  3. Make it executable: chmod +x /usr/sbin/sendmailmp3
  4. In FreePBX 14, Go to Settings > Voicemail Admin
  5. Click on Settings, then Email Config
  6. Scroll down and find the Mail Command setting. Change this to “/usr/sbin/sendmailmp3″ (without the quotes)
  7. Submit your settings and be sure to click the Apply Config button.

Don’t send me mail on how the script works, I didn’t write it, so you make ask the creators and maintainers here:
http://bernaerts.dyndns.org/linux/179-asterisk-voicemail-mp3

I will also paste-dump the script below in case the page referenced disapears:

#!/bin/sh
# Asterisk voicemail attachment conversion script
# Revision history :
# 22/11/2010 - V1.0 - Creation by N. Bernaerts
# 07/02/2012 - V1.1 - Add handling of mails without attachment (thanks to Paul Thompson)
# 01/05/2012 - V1.2 - Use mktemp, pushd & popd
# 08/05/2012 - V1.3 - Change mp3 compression to CBR to solve some smartphone compatibility (thanks to Luca Mancino)
# 01/08/2012 - V1.4 - Add PATH definition to avoid any problem (thanks to Christopher Wolff)
# 16/07/2015 - V1.5 - Handle natively GSM WAV (thanks to Michael Munger)

# set PATH
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# save the current directory
pushd .
 
# create a temporary directory and cd to it
TMPDIR=$(mktemp -d)
cd $TMPDIR
 
# dump the stream to a temporary file
cat >> stream.org
 
# get the boundary
BOUNDARY=$(grep "boundary=" stream.org | cut -d'"' -f 2)
 
# cut the file into parts
# stream.part - header before the boundary
# stream.part1 - header after the bounday
# stream.part2 - body of the message
# stream.part3 - attachment in base64 (WAV file)
# stream.part4 - footer of the message
awk '/'$BOUNDARY'/{i++}{print > "stream.part"i}' stream.org
 
# if mail is having no audio attachment (plain text)
PLAINTEXT=$(cat stream.part1 | grep 'plain')
if [ "$PLAINTEXT" != "" ]
then
 
  # prepare to send the original stream
  cat stream.org > stream.new
 
# else, if mail is having audio attachment
else
 
  # cut the attachment into parts
  # stream.part3.head - header of attachment
  # stream.part3.wav.base64 - wav file of attachment (encoded base64)
  sed '7,$d' stream.part3 > stream.part3.wav.head
  sed '1,6d' stream.part3 > stream.part3.wav.base64
 
  # convert the base64 file to a wav file
  dos2unix -o stream.part3.wav.base64
  base64 -di stream.part3.wav.base64 > stream.part3.wav

  # convert wave file (GSM encoded or not) to PCM wav file
  sox stream.part3.wav stream.part3-pcm.wav
 
  # convert PCM wav file to mp3 file
  # -b 24 is using CBR, giving better compatibility on smartphones (you can use -b 32 to increase quality)
  # -V 2 is using VBR, a good compromise between quality and size for voice audio files
  lame -m m -b 24 stream.part3-pcm.wav stream.part3.mp3
 
  # convert back mp3 to base64 file
  base64 stream.part3.mp3 > stream.part3.mp3.base64
 
  # generate the new mp3 attachment header
  # change Type: audio/x-wav or audio/x-WAV to Type: audio/mpeg
  # change name="msg----.wav" or name="msg----.WAV" to name="msg----.mp3"
  sed 's/x-[wW][aA][vV]/mpeg/g' stream.part3.wav.head | sed 's/.[wW][aA][vV]/.mp3/g' > stream.part3.mp3.head
 
  # generate first part of mail body, converting it to LF only
  mv stream.part stream.new
  cat stream.part1 >> stream.new
  cat stream.part2 >> stream.new
  cat stream.part3.mp3.head >> stream.new
  dos2unix -o stream.new
 
  # append base64 mp3 to mail body, keeping CRLF
  unix2dos -o stream.part3.mp3.base64
  cat stream.part3.mp3.base64 >> stream.new
 
  # append end of mail body, converting it to LF only
  echo "" >> stream.tmp
  echo "" >> stream.tmp
  cat stream.part4 >> stream.tmp
  dos2unix -o stream.tmp
  cat stream.tmp >> stream.new
 
fi
 
# send the mail thru sendmail
cat stream.new | sendmail -t
 
# go back to original directory
popd
 
# remove all temporary files and temporary directory
rm -Rf $TMPDIR
1 Like

I have used this script as a basis for something else, and I found that VM notifications without attachments would fail to send. Anyone else who has the same issue may be able to resolve by modifying it as I’ve done here:

3 Likes

That script seems pretty cool.

Now, just to get proficient to roll my own and make a hybrid that would do what the .mp3 script does, along with your text translation script into one script.

1 Like