Question

Dans notre entreprise, nous avons des informations confidentielles stockées dans SharePoint.Certains politiquement efficace des personnes sont en train de pousser pour avoir des Alertes envoyés à leurs adresses e-mail externes.Comment puis-je envoyer des Alertes emails personnalisées avec le contenu de courriels et les Alertes sans contenu à des adresses e-mail externes?

Était-ce utile?

La solution

Créer une nouvelle Alerte Modèles

1 Créer une copie de la sortie de la boîte de modèles, de changer le nom, l'id, et ajouter l'appel au gestionnaire personnalisé pour chacun.

  • Rendre les modèles personnalisés ont un “.Ext” à la fin de leur nom.

  • La coutume dispose également d'appel personnalisé NotificationHandlerAssembly

    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();
                    }
                }
            }
    
        }
    }
    

Personnalisé Notification du Gestionnaire de l'assemblée

1 La classe CCPersonalClass met en œuvre la IAlertNotifyHandler interface qui contient la méthode définie OnNotification

  • Les tentatives d'envoi de l'alerte personnalisée (si elle ne parvient pas envoyer normale d'alerte.)

  • Alerte personnalisée:

    • Obtient le PersonalEmail données de terrain à partir de la Liste des Informations Utilisateur

    • Si le Courriel Personnel est vide, il envoie juste normal d'alerte

    • Si le courriel personnel est rempli

      • Envoyer normale de messagerie pour courrier interne

      • Envoyer réduit courriel à l'adresse externe

      • Remplacer http:// avec http://ext-

      • Si l'envoi d'e-mails externes supprimer tous les enregistrements de détail et il suffit de laisser les en-têtes.

{

    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"];
                }
            }
        }
    }

Définir les alertes d'utiliser le modèle externe

1 le contenu est mis à jour avec la Fonction de récepteur d'événements:

  • Les alertes existantes:

    • Site.allwebs.les alertes sont retournés sur le même nom de modèle qu'ils avaient avec .ext ajouté
  • Les Listes Actuelles:

    • Site.allwebs.listes renversé le joint alerttemplates à leur .ext homologue

{

    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;
                        }
                    }
                }
            }
        }
    }

Le code suivant est utilisé par la fonction d'activer, de désactiver et de la OnListCreation gestionnaire d'événements

{

    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 l'Avenir des sites web et de leur Avenir listes

  • SPListEventReceiver ListAdded() événement fait tourner le modèle sur toutes les listes créées dans la collection 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();
           }
        }
    }

Ménage

1 Lors de l'activation de la fonctionnalité

  • créer un PersonalEmail champ sur la rootweb Liste des Informations Utilisateur du

  • Le Code est inclus dans l'événement d'activation du récepteur au-dessus de

2 Lors de la désactivation de la fonctionnalité

  • PersonalEmail devient contenu de sorte qu'il n'est pas supprimé lors de la désactivation

Autres conseils

Si c'est isolé à une seule liste, vous pourrez peut-être utiliser un flux de travail à la place.Vous pouvez créer une liste de maintien pour suivre le type de chose à envoyer par courrier électronique et une liste délimitée des adresses électroniques délimitées.Lorsqu'un élément est créé ou édité (quelle que soit la logique d'alerte), vous recherchez la liste des adresses électroniques appropriées et que vous avez envoyé par courrier électronique à la sanité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top