0

Я пытаюсь написать плагин для электронной почты в Microsoft Dynamics CRM Online. Скажем, его называют «Sample_PlugIn».Microsoft Dynamics CRM - данные электронной почты получат данные - подключитесь

Я хочу, чтобы плагин получал отправителя электронной почты и записывал свой электронный адрес в поле (new_samplefield) письма.

Плагин также делает некоторые другие вещи (и все это работает), но эта часть кода является тем, что создает проблемы. (Моя ссылка обслуживающая организация называется «сервис».)

try     
{    
    Entity email = (Entity)context.InputParameters["Target"]; 

    EntityCollection fromCollection = (EntityCollection)email.Attributes["from"]; 

    if (fromCollection != null && fromCollection.Entities.Count > 0) 
    { 
     Entity sender = fromCollection[0]; 
     email["new_samplefield"] = (string)sender.Attributes["internalemailaddress"]; 
    } 

    service.Update(email); 
} 

Каждый раз, когда плагин выполняется, я получаю эту ошибку:

Unexpected exception from plug-in (Execute): Sample_PlugIn.Sample_PlugIn: System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.

Было бы здорово, если бы кто-нибудь мог помогите мне - большое спасибо!

ответ

2

Просто для полноты картины, это код, который работал на меня в конце концов. В этом случае отправитель имеет системный пользователь. (Я зарегистрировал этот плагин на «пост-операции» и «Обновить».)

try 
{ 
    Entity email = (Entity)context.InputParameters["Target"]; 

    // Post Entity Image (since the plug-in is registered on "Update") 
    Entity postImage = context.PostEntityImages["Image"]; 

    EntityCollection fromCollection = postImage.GetAttributeValue<EntityCollection>("from"); 

    if (fromCollection != null && fromCollection.Entities.Count > 0) 
    { 
     Entity sender = fromCollection[0]; 
     EntityReference partyId = sender.GetAttributeValue<EntityReference>("partyid"); 

     string entityType = partyId.LogicalName.ToString(); 

     if (entityType == "systemuser") 
      { 
       // Create query using querybyattribute 
       QueryByAttribute queryToSender = new QueryByAttribute("systemuser"); 
       queryToSender.ColumnSet = new ColumnSet("systemuserid", "internalemailaddress"); 

       // Attribute to query 
       queryToSender.Attributes.AddRange("systemuserid"); 

       // Value of queried attribute to return 
       queryToSender.Values.AddRange(partyId.Id); 

       EntityCollection retrievedFromSystemuser = service.RetrieveMultiple(queryToSender); 

       foreach (Entity systemuserE in retrievedFromSystemuser.Entities) 
        { 
         email["new_samplefield"] = (string)systemuserE.Attributes["internalemailaddress"];       
        } 
      }      
     } 

    service.Update(email); 
} 
5

Чтобы устранить проблему, вам нужно будет понять, как работают поля парлистов, а также роль Activity Party entity.

В принципе, поле «from» (оно также применяется для полей to, cc и cco в активности электронной почты) может содержать несколько ссылок на объекты с разными типами сущностей. Затем объект Activity Activity является «оберткой», которая позволяет обрабатывать все эти разные типы объектов как единое целое. Вы можете легко проверить это инспектирующий fromCollection объекта:

enter image description here

Если пойти дальше и проверить атрибуты этого объекта, вы обнаружите, что атрибуты не являются те, которые вы ожидаете и теперь довольно очевидно, что ошибка возникает из-за того, что атрибут internalemailaddress не существует в этом объекте (на самом деле этот атрибут существует только в объекте системного пользователя, поэтому ваш плагин не учитывает, что учетная запись/контакт/etc может быть отправителем тоже).

В атрибутах партизана вы найдете два атрибута, которые могут быть полезны. partyid - это фактическое значение EntityReference для записи (systemuser/contact/account/etc.), На которое ссылаются, поэтому вы можете использовать это для получения записи и получения требуемого поля. Если вам нужно только EmailAddress, вы можете использовать addressused атрибут, как в следующем примере:

 Entity email = (Entity)context.InputParameters["Target"]; 

     EntityCollection fromCollection = (EntityCollection)email.Attributes["from"]; 

     if (fromCollection != null && fromCollection.Entities.Count > 0) 
     { 
      Entity sender = fromCollection[0]; 
      string emailAddress = (string)sender.Attributes["addressused"]; 
     } 
+0

спасибо, это было полезно! Я не знал, что есть что-то вроде «Партийных списков». Однако, поскольку мне нужен адрес электронной почты от отправителя (который не «адресуется»), было немного сложнее фактически заставить его работать, но ваш ответ поставил меня на правильный путь! Я разместил свой код ради полноты ниже. – Nooyi

 Смежные вопросы

  • Нет связанных вопросов^_^