powered_by.png, 1 kB
Рассылка SMS через Communigate PRO Версия в формате PDF Версия для печати Отправить на e-mail
Написал Administrator   
20.04.2014

Немного переработал модуль доставки SMS для сервера CommuniGate PRO, теперь SMS можно рассылать из любого IM клиента.

Исходный код модуля

// ================================================== //
// Gateway Caller Application //
// //
// Version 0.1 //
// Copyright (c) 2006-2011, Stalker Software, Inc. //
// ================================================== //
// Desing by Invit.
//
//
// Router records can specify the gw to use as
// the second parameter:
// S:<+1(10d)@telnum> = smsgw{1*,gw1}#pbx
// If gwN to use is not specified, and a setting
// is a dictionary, the first dictionary item is used.
//
procedure relaySMS(input) forward;

function isPhoneNumber(theAddr) is
firstSymbol = Substring(theAddr,0,1);
return IsDigit(firstSymbol) or else firstSymbol == "+";
end function;

entry Main is
if IncomingRequestURI() == null then // no pending request?
input = ReadInput(5);
if IsInstantMessageEvent(input) then relaySMS(input); end if; // no IM or some other event -> stop
stop;
end if;

end entry;

function doRelaySMS(input) is
authSender = input.parameter.From;
// userfrom = EmailUserPart(input.parameter.From);
domainfrom = EmailDomainPart(input.parameter.From);
if domainfrom == "telnum" then return("unauthenticated IM rejected"); end if;
// if authSender != userfrom + "@" + domainfrom then authSender = null; end if; // Only users can send SMS

errorCode = null;
if authSender == null then
return("unauthenticated IM rejected");
end if;

// Read sender's Account Settings. If failed -> reject
senderSettings = GetAccountSettings(null,authSender);
if senderSettings == null then return("Failed to read sender settings"); end if;

theBody = input.parameter.("");
// if not IsString(theBody) then
// return("non-text IM rejected");
// end if;

smppHost = senderSettings.PSTNSMSHost;

if IsString(Vars().startParameter) then
phoneNumber = Vars().startParameter;
else
phoneNumber = Vars().startParameter[0];
if not IsString(smppHost) or else smppHost == "" then
smppHost = Vars().startParameter[1];
end if;
end if;

smppDomain = IsString(smppHost) and then smppHost != "" ? smppHost + ".smpp" : "smpp";

SysLog("sending SMS to '" + phoneNumber + "' via " + smppDomain);

return(SendInstantMessage(input.parameter.From,phoneNumber + "@" + smppDomain,theBody));
end function;

procedure relaySMS(input) is
errorCode = doRelaySMS(input);
if errorCode != null then
SysLog("failed to submit SMS: " + errorCode);
params = NewDictionary();
params.type = "error";
params.id = input.parameter.id;
errorXML = NewXML("error","");
errorXML.setAttribute("cancel","type",null);

errorStanza = NewXML("bad-request","");
errorStanza.setNamespace("urn:ietf:params:xml:ns:xmpp-stanzas","");
errorXML.addElement(errorStanza);

params.suppl = NewArray();
params.suppl.addElement(errorXML);
void(SendInstantMessage(input.parameter.To,input.parameter.From,params));
end if;
end procedure;

Данный модуль работает только на отправку, если во входящая SMS не была обработана модулем диалогов т.е. в поле отправителя имеется фиктивный домен telnum, то sms будет отвергнута, что бы избежать возможных зацикливаний.
Приём SMS осуществляется напрямую средствами CGP.

Правила для маршрутиатора
Отправка N:IM:<+(11d)@telnum> = smsgw{+*,gateway}#pbx
Приём N:IM:<+client_number@telnum> = user@domain

Правила приёма заводится на каждого пользователя отдельно, если пользователей много тогда нужно дописывать модуль на приём.

 
< Пред.   След. >
Фонд Развития Интернет
InvitNET © 2018
Страница сгенерирована за 0.009029 секунд