diff --git a/apps/voicemail/AnswerMachine.cpp b/apps/voicemail/AnswerMachine.cpp index 05d7e8c4..c2b67b92 100644 --- a/apps/voicemail/AnswerMachine.cpp +++ b/apps/voicemail/AnswerMachine.cpp @@ -82,6 +82,9 @@ AmDynInvokeFactory* AnswerMachineFactory::MessageStorage=0; bool AnswerMachineFactory::SaveEmptyMsg = true; bool AnswerMachineFactory::TryPersonalGreeting = false; +vector AnswerMachineFactory::MailHeaderVariables; + + string AnswerMachineFactory::SmtpServerAddress = SMTP_ADDRESS_IP; unsigned int AnswerMachineFactory::SmtpServerPort = SMTP_PORT; @@ -469,6 +472,16 @@ int AnswerMachineFactory::onLoad() DBG("voicemail will %stry to find a personal greeting.\n", TryPersonalGreeting?"":"not "); + MailHeaderVariables = explode(cfg.getParameter("mail_header_vars"), ";"); + if (MailHeaderVariables.size()) { + DBG("variables that will be substituted from " PARAM_HDR " header:\n"); + for (vector::iterator it= + MailHeaderVariables.begin(); it != MailHeaderVariables.end(); it++) { + DBG(" %s\n", it->c_str()); + } + } + + DBG("Starting SMTP daemon\n"); AmMailDeamon::instance()->start(); @@ -496,6 +509,8 @@ AmSession* AnswerMachineFactory::onInvite(const AmSipRequest& req) string uid; // user ID string did; // domain ID + EmailTmplDict template_variables; + int vm_mode = MODE_VOICEMAIL; string iptel_app_param = getHeader(req.hdrs, PARAM_HDR); @@ -641,11 +656,18 @@ AmSession* AnswerMachineFactory::onInvite(const AmSipRequest& req) if(announce_file.empty()) throw AmSession::Exception(500,"voicemail: no greeting file found"); + // a little inefficient this way - but get_header_keyvalue supports escaping + for (vector::iterator it= + MailHeaderVariables.begin(); it != MailHeaderVariables.end(); it++) { + template_variables[*it] = get_header_keyvalue(iptel_app_param, *it); + } + // VBOX mode does not need email template if ((vm_mode == MODE_BOX) || (vm_mode == MODE_ANN)) return new AnswerMachineDialog(user, sender, domain, email, announce_file, uid, did, - greeting_fp, vm_mode, NULL); + greeting_fp, vm_mode, + template_variables, NULL); if(email.empty()) throw AmSession::Exception(404,"missing email address"); @@ -676,7 +698,8 @@ AmSession* AnswerMachineFactory::onInvite(const AmSipRequest& req) email, announce_file, uid, did, greeting_fp, - vm_mode, &tmpl_it->second); + vm_mode, template_variables, + &tmpl_it->second); } @@ -689,10 +712,13 @@ AnswerMachineDialog::AnswerMachineDialog(const string& user, const string& did, FILE* announce_fp, int vm_mode, + const EmailTmplDict& template_variables, const EmailTemplate* tmpl) : announce_file(announce_file), announce_fp(announce_fp), tmpl(tmpl), playlist(this), - status(0), vm_mode(vm_mode) + status(0), vm_mode(vm_mode), + email_dict(template_variables) + { email_dict["user"] = user; email_dict["sender"] = sender; diff --git a/apps/voicemail/AnswerMachine.h b/apps/voicemail/AnswerMachine.h index b9b2a49e..a4a12911 100644 --- a/apps/voicemail/AnswerMachine.h +++ b/apps/voicemail/AnswerMachine.h @@ -41,8 +41,10 @@ #include #include +#include using std::string; using std::map; +using std::vector; // defaults for config options #define SMTP_ADDRESS_IP "localhost" @@ -83,6 +85,8 @@ public: static bool SaveEmptyMsg; static bool TryPersonalGreeting; + static vector MailHeaderVariables; + /** After server start, IP of the SMTP server. */ static string SmtpServerAddress; /** SMTP server port. */ @@ -132,6 +136,7 @@ class AnswerMachineDialog : public AmSession const string& did, FILE* announce_fp, int vm_mode, + const EmailTmplDict& template_variables, const EmailTemplate* tmpl); ~AnswerMachineDialog(); diff --git a/apps/voicemail/etc/voicemail.conf b/apps/voicemail/etc/voicemail.conf index 9e96452b..cd94f391 100644 --- a/apps/voicemail/etc/voicemail.conf +++ b/apps/voicemail/etc/voicemail.conf @@ -66,3 +66,18 @@ max_record_time=30 # # Default: # try_personal_greeting=no + +# mail_header_vars=var1;var2;var3;... +# +# Variables that are substituted in the email template with +# values from App-Param header (comma-separated list). +# +# Example: +# mail_header_vars=msg_count;sender_count +# +# P-App-Param: user=...;eml=...;msg_count=10;sender_count=2 +# +# email.template: In your voicebox are %msg_count% messages, +# %sender_count% from this sender. +# +# Default: none