防止通过插件发送电子邮件和显示消息

时间:2012-08-06 02:43:56

标签: plugins dynamics-crm-2011

我正在使用“发送”Pre_operation消息在“电子邮件”实体中编写crm2011插件。我想要做的是当我点击电子邮件实体中的“发送”按钮时,我会在发送之前进行必要的检查。如果检查不正确,我想阻止和停止发送电子邮件并显示“警报消息”并停止第二个插件(此插件发送电子邮件并创建关联实体以转换“案例”)。请给我一些关于该插件的建议? 我应该使用预验证阶段还是Pre_operation状态?我怎么能返回false来停止插件。

  public void Execute(IServiceProvider serviceProvider)
    {
        try
        {
            string message = null;
            _serviceProvider = serviceProvider;
            _context = (IPluginExecutionContext)
                                         serviceProvider.GetService(typeof(IPluginExecutionContext));

            _serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            _currentUser = _context.UserId;
            message = _context.MessageName.ToLower();
            if (message == "send")
            {
                if (_context.InputParameters != null && _context.InputParameters.Contains("EmailId"))
                {
                    object objEmailId = _context.InputParameters["EmailId"];
                    if (objEmailId != null)
                    {
                        _emailId = new Guid(objEmailId.ToString());
                        FindEmailInfo();
                        if (_email != null)
                        {
                            if (_email.Attributes.Contains("description") && _email.Attributes["description"] != null)//Email descritpion is not null
                            {
                                string emaildescription = StripHTML();

                                //Find KB Article prefix no in system config entity
                                serviceguideprefix = "ServiceGuidesPrefix";
                                QueryByAttribute query = new QueryByAttribute("ppp_systemconfig");
                                query.ColumnSet = new ColumnSet(true);
                                query.AddAttributeValue(sysconfig_name, serviceguideprefix);
                                EntityCollection sysconfig = _service.RetrieveMultiple(query);
                                if (sysconfig.Entities.Count > 0)
                                {
                                    Entity e = sysconfig.Entities[0];
                                    if (e.Attributes.Contains("ppp_value"))
                                    {
                                        ppp_value = e.Attributes["ppp_value"].ToString();
                                    }
                                }
                                if (ppp_value != null && ppp_value != string.Empty)
                                {
                                    //var matches = Regex.Matches(emaildescription, @"KBA-\d*-\w*").Cast<Match>().ToArray();
                                    var matches = Regex.Matches(emaildescription, ppp_value + @"-\d*-\w*").Cast<Match>().ToArray();
                                    //ReadKBNo(emaildescription);
                                    foreach (Match kbnumber in matches)
                                    {
                                        EntityCollection kbarticlecol = FindKBArticleIds(kbnumber.ToString());
                                        if (kbarticlecol.Entities.Count > 0)
                                        {
                                            Entity kbariticle = kbarticlecol.Entities[0];
                                            if (kbariticle.Attributes.Contains("mom_internalkm"))
                                            {
                                                bool internalserviceguide = (bool)kbariticle.Attributes["mom_internalkm"];
                                                if (internalserviceguide) found = true;
                                                else found = false;
                                            }
                                            else found = false;
                                        }
                                    }
                                }
                                if (found)
                                {
                                    //-----
                                }
                            }
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw new InvalidPluginExecutionException(ex.Message, ex);
        }
    }

2 个答案:

答案 0 :(得分:4)

很好地停止插件很简单,只需抛出InvalidPluginException,您提供的消息将在警报窗口中显示给用户。您必须在发送前执行此操作。在这种情况下,我认为如果它的预验证或预操作不重要。

编辑:

是的,即使代码中没有发生异常,也应抛出InvalidPluginException。我接受这不是我们通常会做的事情,而是它的工作方式。 Msdn有更多详细信息:http://msdn.microsoft.com/en-us/library/gg334685.aspx

因此,例如代码看起来像:

public void Execute(IServiceProvider serviceProvider)
{
    try    
    {
        //This is where we validate the email send
        if(emailIsOkay)
        {
            //Do something
        }
        else if(emailIsNotOkay)
        {
            //Throw and exception that will stop the plugin and the message will be shown to the user (if its synchronous)
            throw new InvalidPluginExecutionException("Hello user, your email is not correct!!");
        }
    }
    catch (InvalidPluginExecutionException invalid)
    {
        //We dont to catch exception for InvalidPluginExecution, so just throw them on
        throw; 
    }
    catch (Exception ex)
    {
        //This exception catches if something goes wrong in the code, or some other process.
        throw new InvalidPluginExecutionException(ex.Message, ex);
    }
}

答案 1 :(得分:-4)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Crm;
using Microsoft.Xrm.Sdk;
using System.ServiceModel;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Crm.Sdk.Messages;
using System.Text.RegularExpressions;
using System.Xml.Linq;

namespace SendEmail
{
    public class Email : IPlugin
    {
        public void Execute(IServiceProvider serviceprovider)
        {

            IPluginExecutionContext context = (IPluginExecutionContext)serviceprovider.GetService(typeof(IPluginExecutionContext));
            if (!(context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity))
                return;

            //entity
            Entity ent = (Entity)context.InputParameters["Target"];
            if (ent.LogicalName != "entityName")//EntityName
                throw new InvalidPluginExecutionException("Not a Service Request record! ");

            //service
            IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceprovider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService _service = serviceFactory.CreateOrganizationService(context.UserId);
             string Email="";

            if (ent.Contains("emailidfiled"))
               Email = (string)ent["emailidfiled"];



            #region email template
            QueryExpression query = new QueryExpression()
            {
                EntityName = "template",
                Criteria = new FilterExpression(LogicalOperator.And),
                ColumnSet = new ColumnSet(true)
            };
            query.Criteria.AddCondition("title", ConditionOperator.Equal, "templateName");

            EntityCollection _coll = _service.RetrieveMultiple(query);
            if (_coll.Entities.Count == 0)
                throw new InvalidPluginExecutionException("Unable to find the template!");
            if (_coll.Entities.Count > 1)
                throw new InvalidPluginExecutionException("More than one template found!");

            var subjectTemplate = "";
            if (_coll[0].Contains("subject"))
            {
                subjectTemplate = GetDataFromXml(_coll[0]["subject"].ToString(), "match");
            }
            var bodyTemplate = "";
            if (_coll[0].Contains("body"))
            {
                bodyTemplate = GetDataFromXml(_coll[0]["body"].ToString(), "match");
            }
            #endregion



            #region email prep
            Entity email = new Entity("email");
            Entity entTo = new Entity("activityparty");
            entTo["addressused"] =Email;
            Entity entFrom = new Entity("activityparty");
            entFrom["partyid"] = "admin@admin.com";
            email["to"] = new Entity[] { entTo };
            email["from"] = new Entity[] { entFrom };
            email["regardingobjectid"] = new EntityReference(ent.LogicalName, ent.Id);
            email["subject"] = subjectTemplate;
            email["description"] = bodyTemplate;
            #endregion

            #region email creation & sending
            try
            {
                var emailid = _service.Create(email);
                SendEmailRequest req = new SendEmailRequest();
                req.EmailId = emailid;
                req.IssueSend = true;
                GetTrackingTokenEmailRequest wod_GetTrackingTokenEmailRequest = new GetTrackingTokenEmailRequest();
                GetTrackingTokenEmailResponse wod_GetTrackingTokenEmailResponse = (GetTrackingTokenEmailResponse)
                                                                 _service.Execute(wod_GetTrackingTokenEmailRequest);
                req.TrackingToken = wod_GetTrackingTokenEmailResponse.TrackingToken;
                _service.Execute(req);
            }
            catch (Exception ex)
            {
                throw new InvalidPluginExecutionException("Email can't be saved / sent." + Environment.NewLine + "Details: " + ex.Message);
            }
            #endregion



        }


        private static string GetDataFromXml(string value, string attributeName)
        {
            if (string.IsNullOrEmpty(value))
            {
                return string.Empty;
            }

            XDocument document = XDocument.Parse(value);
            // get the Element with the attribute name specified
            XElement element = document.Descendants().Where(ele => ele.Attributes().Any(attr => attr.Name == attributeName)).FirstOrDefault();
            return element == null ? string.Empty : element.Value;
        }
    }
}