Home » Sharepoint » Alerte SMS din Sharepoint 2010
formats

Alerte SMS din Sharepoint 2010

Inspirat fiind de ceea ce scria Valy în această postare  m-am gândit că n-ar fi rău să încerc implementarea de alerte prin SMS oferită de Sharepoint 2010. Totuşi, deşi Microsoft a decis să folosească un format proprietar pentru alertarea prin SMS, denumit OMS (Office Mobile Service Protocol), am început să caut vreo modalitate de a intercepta alerta înainte de a fi trimisă.

Nu mi-a luat prea mult să găsesc modalitatea în care pot face acest lucru, deşi ceea ce am găsit nu m-a ajutat prea mult se referea la alertele prin email, aşa că am început să-mi instalez maşina virtuală. Din păcate nu am avut mare success întrucât, odată instalat totul, dura aproximativ 7 minute să dau un click :) L-am rugat pe Valy dacă mă poate ajuta cu ceva resurse şi, după cum citiţi, a fost de acord – Valy, dau o bere.

Aşadar, înarmat cu tutorialul găsit pe KB Microsoft am început treaba. La început ideea a stat în felul următor: implementez captarea alertelor prin e-mail, după care folosesc codul rezultat la alertele prin SMS. Din păcate această abordare a fost total greşită, dându-mi seama târziu că acest lucru nu este posibil. Aici  spune clar că nu este posibilă interceptarea alertelor de tip SMS din handler, dar dacă vrem totuşi să folosim alt protocol decât OMS, va trebui să implementăm propriul serviciu web ce se interpune între OMS şi alt protocol. Lucrurile sunt destul de triste şi, aşa cum am mai spus, nu înţeleg abordarea Microsft cu aceste cazuri speciale. Am ales aşadar o altă soluţie: mă voi folosi de alertele prin email, iar userii care doresc să primească şi SMS (lucru ce poate fi aflat printr-un Survey de exemplu) vor primi mesaje text dar şi email în acelaşi timp pentru zonele dorite.

Iată modul de implementare:

  1. Utilizatorul optează pentru recepţionarea de mesaje prin SMS
  2. Utilizatorul îşi modifică setările personale (My Settings) definindu-şi un număr de telefon mobil, după care alege alertele prin email pe care le doreşte
  3. Handler-ul creează alerta pentru email şi o altă alertă cu un conţinut mai sumar, fără cod HTML, ce va fi trimis la o adresă suplimentară. Totodată aici se preia numărul de telefon mobil anterior definit şi se pune în subiectul mesajului adiţional pentru putea trimite mai uşor SMS-ul
  4. Adresa de email este monitorizată constant, automat, şi în momentul primirii mesajului există un alt soft ce expediază SMS la numărul pus în subiect, având conţinutul din corpul (body) mesajului. Înainte de trimiterea mesajului se verifică dacă utilizatorul a optat pentru SMS, prin asocierea numărului de telefon cu opţiunea din survey.
  5. Utilizatorul primeşte alerta pe telefonul mobil

 

Abordarea expusă este buna? Este rea? Ca întotdeauna răspunsul este “depinde”. Câteva aspecte de luat în calcul:

a)      Se renunţă într-adevăr la opţiunea de alertare prin SMS a Sharepoint, ceea ce presupune ceva parte de programare

b)      Totuşi sunt puţini provideri de SMS care suportă protocolul OMS

c)      În medie costul unui SMS este de 5-6 eurocenti către Europa, iar dacă din nefericire am vreo 2000 useri fiecare primind câte 10 alerte pe zi, ajung la un cost de 1000 EUR în fiecare zi

d)      Folosind un provider online pot seta expeditorul, astfel încât de exemplu pot primi mesaj de la PortalFEAA, ceea ce pe modem nu pot face

e)      Folosind handler personalizat am control mai bun a ceea ce se trimite

f)        Nu e nevoie să folosesc un provider online, ci pot folosi la fel de bine 1-2-3 modem-uri GSM ataşate la server. Astfel pot lua un pachet cu SMS-uri nelimitate în reţea şi să mă folosesc de ele, reducând din costuri

g)      Timpul mediu necesar expedierii unui SMS prin modem este undeva pe la 10 secunde, astfel încât la un flux mare de alerte este foarte posibil ca anumiţi utilizatori să primească abia a2a zi mesajul

h)      Având control total, pot expedia mesaje de tip WAP Push astfel încât daca s-a modificat un document spre exemplu, atunci prin acest mesaj utilizatorul poate deschide automat locaţia documentului. Acest lucru este util mai ales la telefoanele care nu stiu sa interpreteze o adresa web ca fiind hyperlink (vezi demo la final)

 

Să trecem acum la implementare…

Mai întâi am instalat Visual Studio 2010 alături de componentele de Sharepoint (SDK) – treaba se desfăşoară la modul Next, Next, Finish – după care…

 

1. Documentaţia spune că trebuie creeat un handler propriu care moşteneşte interfaţa IAlertNotificationHandler, apoi fiind oferit codul. Mda, chestii puţin mai complicate aşa că încerc să-mi amintesc de lucrurile facute în facultate. Pas cu pas, pentru a avea codul funcţional lucrurile stau cam aşa…

 a) deschideţi Visual Studio 2010, alegând ca şi interfaţă de dezvoltare Visual C#. Alegeţi File – New – Project, din fereastra nouă selectăm Class Library

Visual Studio Class

b) Faceţi Copy-Paste la codul de mai jos. Dacă încercaţi să luaţi codul oficial, veţi beneficia de o frumoasa eroare: variabila eventType nu e declarata nicăieri (thanks MS). Nu uitaţi să modificaţi a2a adresă de email la care se trimite mesajul special construit pentru SMS-uri.

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Microsoft.SharePoint;

using Microsoft.SharePoint.Utilities;

using System.Web;

 

 

namespace ClassLibrary1

{

 

 

    public class Class1 : IAlertNotifyHandler

    {

        #region IAlertNotifyHandler Members

 

        public bool OnNotification(SPAlertHandlerParams ahp)

        {

            SPSite site = null;

            SPWeb web = null;

 

            try

            {

                site = new SPSite(ahp.siteUrl + ahp.webUrl);

                web = site.OpenWeb();

                SPList list = web.Lists[ahp.a.ListID];

                SPListItem item = list.GetItemById(ahp.eventData[0].itemId);

 

                string FullPath = HttpUtility.UrlPathEncode(ahp.siteUrl + „/” + ahp.webUrl + „/” + list.Title + „/” + item.Name);

                string ListPath = HttpUtility.UrlPathEncode(ahp.siteUrl + „/” + ahp.webUrl + „/” + list.Title);

                string webPath = HttpUtility.UrlPathEncode(ahp.siteUrl + „/” + ahp.webUrl);

                string eventType = „”;

                string build = „”;

                string buildsms = „”;

                if (ahp.eventData[0].eventType == 1)

                    eventType = „Adaugat”;

                else if (ahp.eventData[0].eventType == 2)

                    eventType = „Modificat”;

 

 

                build = „<style type=\”text/css\”>.style1 { font-size: small; border: 1px solid #000000;” +

                „background-color: #DEE7FE;}.style2 { border: 1px solid #000000;}</style></head>” +

                „<p><strong>” + item.Name.ToString() + „</strong> a fost ” + eventType + „</p>” +

                „<table style=\”width: 100%\” class=\”style2\”><tr><td style=\”width: 25%\” class=\”style1\”>” +

                „<a href=” + webPath + „/_layouts/mysubs.aspx>Modifica setarile</a></td>” +

                „<td style=\”width: 25%\” class=\”style1\”> <a href=” + FullPath + „>Vezi ” + item.Name + „</a></td>” +

                „<td style=\”width: 25%\” class=\”style1\”><a href=” + ListPath + „>Vezi ” + list.Title + „</a></td>” +

                ” </tr></table>”;

 

                // iau userul si informatiile

                SPUser user = web.AllUsers.GetByID(ahp.a.UserId);

                SPListItem userInfo = user.ParentWeb.SiteUserInfoList.GetItemById(user.ID);

 

                //subiectul pentru email

                string subject = list.Title.ToString();

                SPUtility.SendEmail(web, true, false, ahp.headers[„to”].ToString(), subject, build);

 

                //subiectul pentru SMS – iau nr de tel mobil si construiesc un continut mai scurt

                string smssubject = userInfo[„MobilePhone”].ToString();

                buildsms = item.Name.ToString() + ” a fost ” + eventType + ” – Vezi continutul: ” + FullPath;

                SPUtility.SendEmail(web, true, false, „alert.sms@feaa.uaic.ro”, smssubject, buildsms);

                return false;

            }

            catch (System.Exception ex)

            {

                return false;

            }

            finally

            {

                if (web != null)

                    web.Dispose();

                if (site != null)

                    site.Dispose();

            }

 

        }

 

        #endregion

    }

    //===================code end=====================

 

}

 

c)  Adăugarea de referinţe în proiect: se dă + pe References, selectăm directorul References, click dreapta, Add reference. Referinţa pentru Sharepoint se găseşte în locaţia “C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\ISAPI\” de unde selectăm Microsoft.SharePoint.dll. Alte referinţe, în cazul în care aveţi erori, le alegeţi din tab-ul .NET

 Visual Studio Reference1  Visual Studio Reference2

 

 

d)      Dacă nu aveţi erori, codul este perfect. Un alt lucru care nu este spus prin documentaţie este acela că cel mai probabil IIS-ul se bazează pe o versiune mai veche de .NET Framework, astfel încât va trebui să specificăm acest fapt în proiectul C#. Pentru asta click dreapta pe numele de namespace din Solution Explorer, Properties. În noul tab se merge la Application, Target Framework unde selectăm .NET Framework 3.5

2.Codul are ca şi rezultat un fişier .dll, fişier ce trebuie să fie „strongly signed” după care se adaugă în Global Assembly Cache (GAC). Cu alte cuvinte, fişierul trebuie semnat pentru a ne asigura că este unic, după care trebuie adăugat în cache-ul .NET pentru ca Sharepoint-ul să ştie de unde să-l ia.
Pentru a semna dll-ul, în proiectul C# deschidem din nou proprietăţile cum am făcut mai sus, iar de această dată alegem Signing. Se bifează “Sign the assembly”,  iar din drop-down click pe New. În noua fereastră alegem un nume, dar nu bifăm “Protect my key file with a password”.

  

Acum suntem siguri că fişierul rezultat e semnat. Pentru a obţine dll-ul, din Build alegem Build Solution, rezultatul aflându-se în folder-ul Bin\Debug din locaţia unde aveţi proiectul pe disc.

Adăgarea în GAC are mai multe metode şi nu se face din Visual Studio Command Prompt sau din locaţia .NET 4.0 ca aici  ci folosind utilitarul „gacutil” din „C:\program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin. Comanda este „gacutil –i <cale catre fisier dll>”.

Pentru a fi siguri că într-adevăr a ajuns în GAC, din Start – Run accesăm C:\Windows\assembly unde ar trebui să existe numele fişierului.

Dacă totul a decurs bine până aici, acum vine partea mai uşoară. Sharepoint 2010 ţine template-urile pentru alerte în folderul “C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\Template\Xml”. Aici sunt 2 fişiere XML: alerttemplates.xml pentru alerte prin email, alerttemplates_sms.xml pentru SMS.

3. Faceţi o copie a alerttemplates.xml şi denumiţi-o altfel (eu am folosit CaAlertTemplates.xml). Deschideţi fişierul şi căutaţi tipul de alertă ce vreţi să folosească dll-ul propriu. Tipul de alertă este specificat în tag-ul AlertTemplate. De exemplu pentru Document Library ar fi  <AlertTemplate Type=”List” Name=”SPListTemplateType.DocumentLibrary”>. În zona de Properties vor trebui adăugate următoarele rânduri:

 <NotificationHandlerAssembly>ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d59ecf2a3bd66904</NotificationHandlerAssembly>
<NotificationHandlerClassName>ClassLibrary1.Class1</NotificationHandlerClassName>
<NotificationHandlerProperties></NotificationHandlerProperties>

 

Foarte important:

a)      ClassLibrary1 este numele atribuit pentru namespace din proiectul C#
b)      Class1 este numele clasei din proiect şi va trebui trecut sub forma namespce.clasa
c)      PublicKeyToken e codul unic dat de semnătura dll. Cel mai uşor îl puteţi afla prin vizualizarea proprietăţilor noului fişier din C:\Windows\assembl (img9)

Codul final pentru Properties ar trebui să arate aproximativ astfel:

<ImmediateNotificationExcludedFields>ID;Author;Editor;Modified_x0020_By;Created_x0020_By;_UIVersionString;ContentType;TaskGroup;IsCurrent;Attachments;NumComments;</ImmediateNotificationExcludedFields>            <DigestNotificationExcludedFields>ID;Author;Editor;Modified_x0020_By;Created_x0020_By;_UIVersionString;ContentType;TaskGroup;IsCurrent;Attachments;NumComments;</DigestNotificationExcludedFields>
<NotificationHandlerAssembly>ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d59ecf2a3bd66904</NotificationHandlerAssembly>
<NotificationHandlerClassName>ClassLibrary1.Class1</NotificationHandlerClassName>
<NotificationHandlerProperties></NotificationHandlerProperties>

 

Salvaţi XML-ul şi asiguraţi-vă că se află în folderul “C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\Template\Xml”.

4. Pentru a folosi template-ul personalizat, din “C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\Bin” se lansează comanda:

stsadm -o updatealerttemplates -filename „C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\XML\nume_fisier_template.xml” -url adresa_site

Întrucat la o instalare implicită timpul de trimitere al alertelor imediate este de 5 minute, vom modifica valoare la 1 minut:

stsadm -o setproperty -pn job-immediate-alerts -pv „every 1 minutes”

5. Au mai rămas doar câţiva paşi: rulăm iisreset, restart la serviciul Sharepoint Timer Service.

Dacă schimbaţi ceva în cod, atunci trebuie pus iar în GAC, iisreset si restart la Sharepoint Timer.

După cum observaţi din cod, am construit un email personalizat pentru alerta de tip SMS, în care am pus ca subiect numărul de telefon din profilul personal al utilizatorului, iar în conţinut faptul că fişierul x a fost modificat-adăugat şi adresa unde se află. Ceea ce a mai rămas de făcut este să avem o aplicaţie ce monitorizează permanent căsuţa respectivă de email, preia conţinutul şi-l trimite la un SMS gateway. O soluţie gratuită pentru SMS gateway (pe Linux ce-i drept) este Kannel  şi cu ceva cătări pe net găsiţi implementat cod care face trimiterea de mesaje email-to-SMS. Eu am folosit pentru Windows produsul Ozeki NG  ce ştie deja de email to SMS. La oricare dintre aceste produse se poate ataşa atât un modem fizic cât şi configura o conexiune via SMPP/HTTP. Informaţii despre modul de configurare găsiţi aici, iar lucrurile funcţionează cam aşa

Acum aveţi un sistem funcţional de alertare prin SMS al Sharepoint, folosind alertarea prin email. Sper să folosească cuiva cele expuse aici sau, dacă există îmbunătăţiri, să le expună aici.

 

Vedere generala a modului de dezvoltare

Demo funcţionare alerte (email)

Demo funcţionare alerte (SMS)

Primire mesaj WAP Push pe telefon

 

 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *

Poți folosi aceste etichete și atribute HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

© m-sec.net
credit