[asterisk-users] How can i send my sip channel 3 to mailbox 2? Please Help!

Robert Lister robl at linx.net
Tue Sep 4 06:52:03 CDT 2007


On Sun, Sep 02, 2007 at 04:03:51PM +0200, Jonathan GF wrote:
> Hi folks,
> 
> i'm trying to configure my extensions.conf as small as posible and for
> that reason i'm using macros. The problem is that maybe I have a
> misunderstood the concept for the directive "mailbox" in sip.conf.

What mailbox= seems to do in sip.conf is set the message waiting indicator 
(MWI) light on or off when there are messages waiting in a particular 
mailbox for that extension using a SIP message to the phone to update it.

It does not control anything else such as who can access a particular 
mailbox etc. just which extensions get notifications of voicemail. It is not 
in voicemail.conf 

I suppose because asterisk can have different channel types other than SIP, 
it needs configuring for the different notification methods depending on 
devices. (i.e, voicemail app doesn't want to be getting involved in how to 
set and unset MWI for all sorts of different channel types.)

> What i'm trying is to have ONLY 2 voicemail boxes and depending which
> extensions i'm dialing send the caller to one or the other, but not
> send based on the called id/name, but to that mailbox i want (mailbox
> 1 or mailbox 2, just this).
> 
> The error i'm getting is:
> 
> WARNING[2102]: app_voicemail.c:2461 leave_voicemail: No entry in
> voicemail config file for '3'
> 
> The error is correct... i don't have a voicemail box named/numbered
> "3" but this is the behavior i want to control. How can i send my sip
> channel 3 to mailbox 2?

Essentially, you need to pass the mailbox you want to access to the 
voicemail app, which is the thing in ARG1 in your macro.

So, Voicemail(u2) would play the unavailable message for mailbox 2 instead 
of what you are currently passing it, which appears to be ${EXTEN}, the 
dialled extension.

What you can do is check to see if a voicemail mailbox exists for a 
particular extension before you try it, and if no mailbox exists (i.e, you 
have not configured it in voicemail.conf) then you can do something else.)

Something like this will check to see if a mailbox exists before trying it, 
if not then default to mailbox 2:

exten => s,1,MailboxExists(${ARG1},j)
exten => s,2,Voicemail(u2)
exten => s,3,Hangup
exten => s,102,Voicemail(u${ARG1})
exten => s,103,Hangup

Note, you can also check the variable ${VMBOXEXISTSSTATUS} for one of 
"SUCCESS" or "FAILED" if you don't like the old style priority jumping, 
which can get a bit awkward if you have to renumber things, this is the 
'newer' way to do it, something like:-

exten => s,1,MailboxExists(${ARG1},j)
exten => s,2,Goto(s-${VMBOXEXISTSSTATUS},1}
exten => s-FAILED,Voicemail(u2)
exten => s-FAILED,Hangup
exten => s-SUCCESS,Voicemail(u${ARG1})
exten => s-SUCCESS,Hangup

Of course, how you work out when somebody accesses your voicemail to listen 
to messages depends on how you are authenticating them into voicemail in the 
first place. You might just prompt for the mailbox number and/or PIN, or you 
can drop them straight into the right mailbox using a similar technique.

If it gets more exotic than your two mailboxes, then you could use astdb 
entries to work out which mailbox is associated with a particular extension, 
which is more elaborate but might be worth doing for ease of configuration. 
(In that you are not hardcoding stuff into extensions.conf for every 
extension)

astdb is asterisk's builtin database, which is really handy for this kind of 
thing (Unless you have millions of mailboxes which is an entirely different 
database proposition!)

$ asterisk -r
asterisk*CLI> database put 3 mailbox 2
asterisk*CLI> database show 3
/3/mailbox                                      : 2

(That is to say, for the extension 3, we want mailbox 2)

Then, to see that db variable in where you need it in the dialplan, 
would look like this:-

${DB(${EXTEN}/mailbox)} (where ${EXTEN} is 3, this would return "2")

or ${DB(${ARG1}/mailbox)} in the case of your macro.

This will look in the astdb for that mailbox variable you set up and 
use that instead of hardcoding it into the dialplan.

Suppose your voicemail access extension is 444 and you want a passwordless 
login from the extension based on what you have set in the astdb for that 
extension, based on caller ID of the incoming extension:-

; passwordless login
exten => 444,1,VoiceMailMain(${DB(${CALLERID(num)}/mailbox)}|s)
exten => 444,n,Hangup

(Yes, I know, it's a bit fugly bracket hell, but it's worth it!)

You could combine this of course with MailboxExists to drop them into some 
default mailbox, or prompt for a mailbox number, or if there is a mailbox 
for that extension and no translation is required. (i.e, Do a MailboxExists 
and then decide if the ${DB lookup is needed.)

This is just an example of DB lookups, you could do a similar thing for 
determining which mailbox to drop callers in to as well as for mailbox 
access.

Then for all future requirements, you just add that to your astdb as you want 
them and it will take care of it for you. No tweaking of extensions.conf 
required.

Just some food for thought on what is possible.


Rob


-- 
Robert Lister     - London Internet Exchange - http://www.linx.net/
sip:robl at linx.net - inoc-dba:5459*710        - tel: +44 (0)20 7645 3510



More information about the asterisk-users mailing list