This is not too hard...
let's start with this example...
with my internal extensions 3300 - 3399....
[default]
exten => 33XX,1,Set(__USEREXTEN=${CDR(src)})
exten => 33XX,n,GotoIf($[${CDR(src)} = ${CDR(dst)}]?voicemailmain,s,1)
exten => 33XX,n,Dial(SIP/${EXTEN})
exten => 33XX,n,Voicemail(${EXTEN}@default,u)
[voicemailmain]
exten => s,1,Answer()
exten => s,n,VoicemailMain(${USEREXTEN},s)
exten => s,n,Hangup()