Pergunta

Na nossa empresa temos informações confidenciais armazenadas no SharePoint.Algumas pessoas politicamente eficazes estão pressionando para que os Alertas sejam enviados para seus endereços de e-mail externos.Como posso enviar Alertas de e-mail personalizados com conteúdo para e-mails internos e Alertas sem conteúdo para endereços de e-mail externos?

Foi útil?

Solução

Crie novos modelos de alerta

1 Crie uma cópia dos modelos prontos para uso, altere o nome, o ID e adicione a chamada ao manipulador personalizado para cada um.

  • Faça com que os modelos personalizados tenham um “.Ext” no final do nome.

  • Os recursos personalizados também chamam um NotificationHandlerAssembly personalizado

    using System;
    using System.Runtime.InteropServices;
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Administration;
    using System.Xml;
    
    namespace Prov.Shared.CCPersonalEmail.Features.AlertTemplates
    {
        public class AlertTemplatesEventReceiver : SPFeatureReceiver
        {
            public override void FeatureActivated(SPFeatureReceiverProperties properties)
            {
                //The Properties we will add to the Alert Template
                //(Since this feature lives in the same project with the 
                //IAlertNotifyHandler we just refer to our own assembly)
                string ClassToAdd = "CCPersonalClass";
                SPFeatureDefinition FeatDef = (SPFeatureDefinition)properties.Feature.Definition;
                string ourAssemblyName = FeatDef.ReceiverAssembly;
    
                SPWebApplication WebApplication = (SPWebApplication)properties.Feature.Parent;
                SPWebService WebService = WebApplication.WebService; 
                SPAlertTemplateCollection colSPAT = new SPAlertTemplateCollection(WebService);
    
                foreach (SPAlertTemplate SPAT in colSPAT)
                {
                    if (SPAT.Name.Contains(".Ext"))
                    {
                        SPAT.Delete();
                    }
                }
    
                foreach (SPAlertTemplate SPAT in colSPAT)
                {
                    if (SPAT.Name.Contains("SPAlertTemplateType"))
                    {
                        SPAlertTemplate newSPAT = new SPAlertTemplate();
                        XmlDocument xmlSpit = new XmlDocument();
    
                        xmlSpit.LoadXml(SPAT.Xml.ToString());
    
                        //create node and add value
                        XmlNode node = xmlSpit.CreateNode(XmlNodeType.Element, "Properties", string.Empty);
    
                        //create 3 nodes
                        XmlNode nodeAssembly = xmlSpit.CreateElement("NotificationHandlerAssembly");
                        XmlNode nodeClassName = xmlSpit.CreateElement("NotificationHandlerClassName");
                        XmlNode nodeProperties = xmlSpit.CreateElement("NotificationHandlerProperties");
    
                        nodeAssembly.InnerText = ourAssemblyName;
                        nodeClassName.InnerText = ourAssemblyName.Substring(0,ourAssemblyName.IndexOf(",")) + "." + ClassToAdd;
    
                        //add to parent node
                        node.AppendChild(nodeAssembly);
                        node.AppendChild(nodeClassName);
                        node.AppendChild(nodeProperties);
    
                        //add to elements collection
                        xmlSpit.DocumentElement.AppendChild(node);
    
                        newSPAT.Xml = xmlSpit.InnerXml;
                        newSPAT.Name = SPAT.Name.ToString() + ".Ext";
                        newSPAT.Id = Guid.NewGuid();
    
                        colSPAT.Add(newSPAT);
                    }
                }
    
    
    
                foreach (SPTimerServiceInstance timerservice in WebApplication.Farm.TimerService.Instances)
                {
                    timerservice.Stop();
                    timerservice.Start();
                }
    
            }
    
    
    
            public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
            {
                SPWebApplication WebApplication = (SPWebApplication)properties.Feature.Parent;
                SPWebService WebService = WebApplication.WebService; 
                SPAlertTemplateCollection colSPAT = new SPAlertTemplateCollection(WebService);
    
                foreach (SPAlertTemplate SPAT in colSPAT)
                {
                    if (SPAT.Name.Contains(".Ext"))
                    {
                        SPAT.Delete();
                    }
                }
            }
    
        }
    }
    

Montagem do manipulador de notificação personalizado

1 A classe CCPersonalClass implementa a interface IAlertNotifyHandler que contém o método definido OnNotification

  • Tentativas de enviar o alerta personalizado (se falhar, envie o alerta normal).

  • Alerta personalizado:

    • Obtém os dados do campo PersonalEmail da Lista de Informações do Usuário

    • Se o e-mail pessoal estiver vazio, apenas envia um alerta normal

    • Se o e-mail pessoal estiver preenchido

      • Enviar e-mail normal para e-mail interno

      • Enviar e-mail reduzido para endereço externo

      • Substituir http:// com http://ext-

      • Se estiver enviando e-mail externo, remova todos os registros detalhados e deixe apenas os cabeçalhos.

{

    using System;
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Utilities;
    using System.Text.RegularExpressions;
    using Framework.Logger;
    using System.Collections.Specialized;

    namespace Shared.CCPersonalEmail
    {
        class CCPersonalClass: IAlertNotifyHandler
        {
            public bool OnNotification(SPAlertHandlerParams alertHandler)
            {
                using (new SPMonitoredScope("Shared.CCPersonalClass OnNotification"))
                {
                    string siteUrl = alertHandler.siteUrl;
                    using (SPSite site = new SPSite(siteUrl + alertHandler.webUrl))
                    {
                        using (SPWeb web = site.OpenWeb())
                        {
                            try
                            {
                                return CustomAlertNotification(web, alertHandler, siteUrl);
                            }
                            catch
                            {
                                //if it fails due to configuration still the default alert should work
                                SPUtility.SendEmail(web, alertHandler.headers, alertHandler.body);
                                return false;
                            }
                        }
                    }
                }
            }
            private bool CustomAlertNotification(SPWeb web, SPAlertHandlerParams alertHandler, string siteUrl)
            {
                using (new SPMonitoredScope("Shared.CCPersonalClass CustomAlertNotification"))
                {
                    string PersonalEmail = string.Empty;
                    int eventCount = alertHandler.eventData.GetLength(0);

                    //Get the Personal Email from the User Information List
                    try
                    {
                        PersonalEmail = GetPersonalEmail(alertHandler.headers["to"], web);
                    }
                    catch (Exception e)
                    {
                        Logger.LogError(e, "CCPersonalClass");
                    }

                    //Send each alert in the alertHandler
                    for (int i = 0; i < eventCount; i++)
                    {
                        try
                        {
                            if (string.IsNullOrEmpty(PersonalEmail))
                            {
                                SPUtility.SendEmail(web, alertHandler.headers, alertHandler.body);
                            }
                            else
                            {
                                //Send a normal notification to the work email
                                SPUtility.SendEmail(web, alertHandler.headers, alertHandler.body);

                                //Send an abbreviated email to the external email
                                string txt = alertHandler.body.ToString().Replace("http://", "http://ext-");

                                //Digest messages- removing detail records
                                string strRegex = "<tr>\\s*<td class=\"[a-z]*?\"> <div class=\"nobr\">.*?</td>{0}s*</tr>|";
                                //Immediate messages- removing detail records
                                strRegex = strRegex + "<tr>\\s*<td class=\"formlabel\">.*<td class=\"altvb\">&nbsp;</td>\\s*</tr>";

                                txt = Regex.Replace(txt, strRegex, string.Empty, RegexOptions.Singleline);
                                StringDictionary PersonalHeader = alertHandler.headers;
                                PersonalHeader["cc"] = PersonalEmail;
                                SPUtility.SendEmail(web, PersonalHeader, txt);
                            }
                        }
                        catch (Exception e)
                        {
                           Logger.LogError(e, "CCPersonalClass");
                        }

                    }
                    if (eventCount > 1)
                        return true;
                    else
                        return false;
                }
            }
            private string GetPersonalEmail(string WorkEmail, SPWeb web)
            {
                using (new SPMonitoredScope("Shared.CCPersonalClass GetPersonalEmail"))
                {
                    SPQuery SelectUser = new SPQuery();
                    string SelectUserQS = string.Format("<Query><Where><Eq><FieldRef Name='EMail' /><Value Type='Text'>{0}</Value></Eq></Where></Query>", WorkEmail);
                    SelectUser.Query = SelectUserQS;
                    SPList UserList = web.Site.RootWeb.Lists["User Information List"];
                    SPListItemCollection SelectedUserCol = UserList.GetItems(SelectUser);
                    SPListItem SelectedUser = SelectedUserCol[0];
                    return (string)SelectedUser["PersonalEmail"];
                }
            }
        }
    }

Defina os alertas para usar o modelo externo

1 O conteúdo existente é atualizado com o receptor de evento Feature:

  • Alertas existentes:

    • Site.allwebs.alerts são alterados para o mesmo nome de modelo que tinham com .ext anexado
  • Listas existentes:

    • Site.allwebs.lists mudou os modelos de alerta anexados para sua contraparte .ext

{

    using System;
    using System.Runtime.InteropServices;
    using System.Security.Permissions;
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Security;
    using Prov.Framework.Logger;

    namespace Prov.Shared.CCPersonalEmail.Features.CCAlerts
    {
        [Guid("a3889d39-ea91-441e-9039-157c512441e4")]
        public class CCAlertsEventReceiver : SPFeatureReceiver
        {
            // Set AlertTemplates on sites and alerts to custom templates.
            public override void FeatureActivated(SPFeatureReceiverProperties properties)
            {
                using (SPSite site = (SPSite)properties.Feature.Parent)
                {
                    AlertTemplateSelector objSelectedAlertTemplate = new AlertTemplateSelector(site);

                    //Add PersonalEmail field if it does not exist yet
                    SPFieldCollection UserInfoFields = site.RootWeb.Lists["User Information List"].Fields;
                    try
                    {
                        bool FieldExists = UserInfoFields.ContainsField("PersonalEmail");
                        if (!FieldExists)
                        {
                            UserInfoFields.Add("PersonalEmail", SPFieldType.Text, false);
                        }
                    }
                    catch (Exception e)
                    {
                        Logger.LogError(e, "CCPersonalClass");
                    }

                    foreach (SPWeb web in site.AllWebs)
                    {
                        using (web)
                        {
                            web.AllowUnsafeUpdates = true;

                            foreach (SPList List in web.Lists)
                            {
                                try
                                {
                                    List.AlertTemplate = objSelectedAlertTemplate.SwapAlertTemplate(List.AlertTemplate.Name, true);
                                    List.Update();
                                }
                                catch (Exception e)
                                {
                                    Logger.LogError(e, "CCAlertsEventReceiver");
                                }
                            }

                            foreach (SPAlert Alert in web.Alerts)
                            {
                                try
                                {
                                    Alert.AlertTemplate = objSelectedAlertTemplate.SwapAlertTemplate(Alert.AlertTemplate.Name, true);
                                    Alert.Update();
                                }
                                catch (Exception e)
                                {
                                    Logger.LogError(e, "CCAlertsEventReceiver");
                                }
                            }
                            web.AllowUnsafeUpdates = false;
                        }
                    }
                }
            }


            // Revert AlertsTemplates on sites and alerts back to out of box templates.

            public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
            {
                using (SPSite site = (SPSite)properties.Feature.Parent)
                {
                    AlertTemplateSelector objSelectedAlertTemplate = new AlertTemplateSelector(site);

                    foreach (SPWeb web in site.AllWebs)
                    {
                        using (web)
                        {
                            web.AllowUnsafeUpdates = true;

                            foreach (SPList List in web.Lists)
                            {
                                try
                                {
                                    List.AlertTemplate = objSelectedAlertTemplate.SwapAlertTemplate(List.AlertTemplate.Name, false);
                                    List.Update();
                                }
                                catch (Exception e)
                                {
                                    Logger.LogError(e, "CCAlertsEventReceiver");
                                }
                            }

                            foreach (SPAlert Alert in web.Alerts)
                            {
                                try
                                {
                                    Alert.AlertTemplate = objSelectedAlertTemplate.SwapAlertTemplate(Alert.AlertTemplate.Name, false);
                                Alert.Update();
                                }
                                catch (Exception e)
                                {
                                    Logger.LogError(e, "CCAlertsEventReceiver");
                                }
                            }
                            web.AllowUnsafeUpdates = false;
                        }
                    }
                }
            }
        }
    }

O código a seguir é usado pelo recurso ativar, desativar e pelo manipulador de eventos OnListCreation

{

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.SharePoint.Administration;
    using Microsoft.SharePoint;

    namespace Shared.CCPersonalEmail
    {
        class AlertTemplateSelector
        {
            private SPAlertTemplateCollection atc;
            private SPSite site;

            public AlertTemplateSelector(SPSite site)
            {
                this.site = site;
                this.atc = new SPAlertTemplateCollection((SPWebService)site.WebApplication.Parent);
            }

            public SPAlertTemplate SwapAlertTemplate(string PreviousAlert, bool isActivating)
            {

                if ((!PreviousAlert.EndsWith(".Ext")) && (isActivating))
                {
                    PreviousAlert = string.Format("{0}.Ext", PreviousAlert);
                }
                if ((PreviousAlert.EndsWith(".Ext")) && (!isActivating))
                {
                    PreviousAlert = PreviousAlert.Replace(".Ext", "");
                }

                SPAlertTemplate newTemplate = atc[PreviousAlert];
                if (newTemplate == null)
                {
                    if (isActivating)
                    {
                        newTemplate = atc["SPAlertTemplateType.GenericList.Ext"];
                    }
                    else
                    {
                        newTemplate = atc["SPAlertTemplateType.GenericList"];
                    }
                }
                return newTemplate;
            }

        }
    }

2 Teias futuras e suas listas futuras

  • O evento SPListEventReceiver ListAdded() inverte o modelo em todas as listas criadas no conjunto de sites

{

    namespace Shared.CCPersonalEmail.OnListCreation
    {
        public class OnListCreation : SPListEventReceiver
        {
           public override void ListAdded(SPListEventProperties properties)
           {
                base.ListAdded(properties);
                SPWeb web = properties.Web;
                SPList List = web.Lists[properties.ListId];

                AlertTemplateSelector objSelectedAlertTemplate = new AlertTemplateSelector(web.Site);
                List.AlertTemplate = objSelectedAlertTemplate.SwapAlertTemplate(List.AlertTemplate.Name, true);
                List.Update();
           }
        }
    }

Serviço de limpeza

1 Durante a ativação do recurso

  • crie um campo PersonalEmail na lista de informações do usuário do rootweb

  • O código está incluído no receptor de evento ativado por recurso acima

2 Durante a desativação do recurso

  • PersonalEmail se torna conteúdo e não é removido após a desativação

Outras dicas

Se estiver isolado a apenas uma única lista, você poderá usar um fluxo de trabalho.Você pode criar uma lista de holding para rastrear o tipo de coisa para enviar e-mail e uma lista delimitada semicolon de endereços de e-mail.Quando um item é criado ou editado (seja qual for o seu alerta lógica, você procura a lista apropriada de endereços de e-mail e e-mail que agrupe o email higienizado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top