9

como un "sistema de alerta temprana API administrada de novato", estoy teniendo algunos problemas para encontrar ejemplos y documentación sobre la creación y gestión de tareas.la creación de tareas para otros usuarios que utilizan servicios web de Exchange (EWS) API administrada

He conseguido crear una tarea para mí sin ningún problema. Sin embargo, realmente necesito poder hacer lo siguiente: si alguien pudiera darme algún consejo, realmente lo agradecería ...

  1. Crea una Tarea y asígnala a otro usuario.
  2. Ser capaz de interrogar el estado de esa tarea (porcentaje completado, etc.) mientras está asignado a ese usuario.
  3. Actualice las notas sobre la tarea en cualquier momento.

Gracias de antemano por cualquier punteros!

Respuesta

1

Desafortunadamente, no puede configurar la propiedad Task.DisplayTo. Sugeriría que sigue siendo el caso de que EWS no admita la asignación de tareas a otros (see post) y que, para obtener la funcionalidad que necesita, debe crear el elemento en la carpeta Tareas del usuario que usted desea asignarlo a (esto es diferente a la asignación, lo que haría desde su propia carpeta)

Si bien tengo esta funcionalidad trabajando con las clases de proxy, todavía no lo tengo trabajando con la API administrada. Supongo que puede usar el método FindFolder para recuperar la carpeta de tareas del asignado y luego crear el elemento allí, pero lo veré y actualizaré cuando tenga una versión en funcionamiento.

ver este espacio ;-)

+0

Gracias por mirar a este por mí - es muy apreciada! Espero con impaciencia su respuesta ... –

2

he estado echando un vistazo en esto, y no estoy seguro de que es posible utilizando la API administrada.

Tengo un sistema establecido por medio de cuatro carpetas de usuario de la muestra, y un usuario de administración central con acceso delegado a cada uno de los buzones de los usuarios. Cuando intento encontrar carpetas usando la API, solo puedo encontrar las carpetas de las credenciales del usuario que proporciono al crear el objeto de servicio.

También estoy usando los objetos proxy autogenerados (solo tomé la API para intentar ayudar), y utilizo el siguiente proceso para crear una tarea para otro usuario (esto funciona correctamente ...):

  1. Conectar con el servidor como la cuenta de administración central.
  2. Cree el objeto de tarea como lo haría para su propia cuenta.
  3. Cree una referencia a la carpeta Tareas del usuario al que desea enviar el elemento.
  4. crear un objeto CreateItemRequest para pasar al servidor, y añadir los dos artículos de los pasos 2 y 3 a la solicitud

Cuando la solicitud se envía, el elemento se crea en la carpeta del usuario de destino.

Tenía la esperanza de que esta secuencia podría ser posible en la API administrada, pero no se parece a trabajar.

Voy a seguir trabajando en él como tengo la oportunidad, pero tengo problemas con otras citas que estoy trabajando en también. Pensé que la secuencia podría ayudar a cualquier otra persona a mirar, en caso de que tuvieran más suerte.

Lo sentimos i cant proporcionar alguna información más en el momento

+0

Realmente agradezco su ayuda con esto. Agregaré una referencia web y también jugaré con ella. Te lo haré saber si llego a alguna parte? !! –

+0

un volcado de ejemplo de código sería útil ... incluso si está incompleto (con solo cubrir 2,3 y 4). – Seph

2

Otra opción se establece utilizar la propiedad ExchangeService ImpersonatedUserId para suplantar al usuario que se le asignó la tarea. Suplantar al usuario antes de crear la tarea y debe crearse en su carpeta Tareas.

3

El código en this post trabajó para mí

pegar código para la posteridad:

public string CreateTaskItem(string targetMailId) 
    { 

     string itemId = null; 

     task.Subject = "Amit: sample task created from SDE and EWS"; 

     task.Body = new BodyType(); 

     task.Body.BodyType1 = BodyTypeType.Text; 

     task.Body.Value = "Amit created task for you!"; 

     task.StartDate = DateTime.Now; 

     task.StartDateSpecified = true; 



     // Create the request to make a new task item. 

     CreateItemType createItemRequest = new CreateItemType(); 

     createItemRequest.Items = new NonEmptyArrayOfAllItemsType(); 

     createItemRequest.Items.Items = new ItemType[1]; 

     createItemRequest.Items.Items[0] = task; 

     /** code from create appointment **/ 

     DistinguishedFolderIdType defTasksFolder = new DistinguishedFolderIdType(); 

     defTasksFolder.Id = DistinguishedFolderIdNameType.tasks; 
     defTasksFolder.Mailbox = new EmailAddressType(); 

     defTasksFolder.Mailbox.EmailAddress = targetMailId; 

     TargetFolderIdType target = new TargetFolderIdType(); 

     target.Item = defTasksFolder; 



     createItemRequest.SavedItemFolderId = target; 


     try 

     { 

      // Send the request and get the response. 

      CreateItemResponseType createItemResponse = _esb.CreateItem(createItemRequest); 



      // Get the response messages. 

      ResponseMessageType[] rmta = createItemResponse.ResponseMessages.Items; 



      foreach (ResponseMessageType rmt in rmta) 

      { 

       ArrayOfRealItemsType itemArray = ((ItemInfoResponseMessageType)rmt).Items; 

       ItemType[] items = itemArray.Items; 


       // Get the item identifier and change key for each item. 

       foreach (ItemType item in items) 

       { 


//the task id 

        Console.WriteLine("Item identifier: " + item.ItemId.Id); 


//the change key for that task, would be used if you want to track changes ... 
        Console.WriteLine("Item change key: " + item.ItemId.ChangeKey); 

       } 

      } 

     } 

     catch (Exception e) 

     { 

      Console.WriteLine("Error Message: " + e.Message); 

     } 

     return itemId; 

    } 
0

he sido investigando esto más recientemente y tiene lo siguiente:

estoy corriendo una aplicación de consola que establecer una conexión de transmisión para comprobar si hay nuevos mensajes de correo electrónico que llegan al buzón para [email protected]

static void Main(string[] args) 
{ 
    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013); 
    WebCredentials wbcred = new WebCredentials("userone", "password", "mydomain"); 
    service.Credentials = wbcred; 

    Console.WriteLine("Attempting to autodiscover Url...");     
    service.AutodiscoverUrl("[email protected]", RedirectionUrlValidationCallback); 

    EWSConnection.SetStreamingNotifications(service); 

    Console.ReadKey(); 
    Environment.Exit(0); 
} 

Mi EWSConnection clase estática se ve vagamente como esto:

public static void SetStreamingNotifications(ExchangeService service) 
{ 
    _service = service; 

    try 
    {  var subscription = service.SubscribeToStreamingNotifications(
      new FolderId[] { WellKnownFolderName.Inbox }, 
      EventType.NewMail);  

     StreamingSubscriptionConnection connection = new StreamingSubscriptionConnection(service, 5); 

     connection.AddSubscription(subscription); 
     connection.OnNotificationEvent += new StreamingSubscriptionConnection.NotificationEventDelegate(OnEvent); 

     connection.Open(); 

     _subscription = subscription; 
     _subscriptionConnection = connection; 

     Console.WriteLine($"Connection Open:{connection.IsOpen}"); 
    } 

    catch (Exception ex) 
    { 
     Console.WriteLine(ex); 
    } 
} 

Con esto, puede ver que me he suscrito al OnNotificationEvent y, a su vez, se invocará mi método OnEvent cuando llegue un nuevo correo electrónico. Cuando llega un nuevo correo electrónico a este buzón, tengo la obligación de crear una tarea y asignarla a la persona relevante, según lo que sea la propiedad ToAddress.

private static void CreateTask(NotificationEvent notification, RecievedMail recievedMail) 
     { 
      try 
      { 
       Console.WriteLine("Attempting to create task"); 

       Microsoft.Exchange.WebServices.Data.Task task = new Microsoft.Exchange.WebServices.Data.Task(_service); 

       task.DueDate = DateTime.Now.AddDays(7); 
       task.Body = recievedMail.Body; 
       task.Subject = recievedMail.Subject; 

       string targetSharedEmailAddress = null; 

       if (recievedMail.ToAddress.ToString() == "humanresources <SMTP:[email protected]>") 
       { 
        targetSharedEmailAddress = "[email protected]";      
       }       

       task.Save(new FolderId(WellKnownFolderName.Tasks,targetSharedEmailAddress)); // 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex); 
      } 
     } 

Al principio se puede ver que he intentado añadir la persona que quería la tarea que se creará en el método task.Save, sin embargo una vez que fui a Outlook para interactuar con la tarea de nueva creación, el propietario era todavía userone, es decir, la persona cuyas credenciales se usaron para conectarse al servicio, esto fue un problema para mí, ya que necesito que el propietario de la tarea sea usertwo.

Esto se logró por dejar caer la variable targetSharedEmailAddress y en su lugar mediante la propiedad ImpersonatedUserId del objeto ExchangeServer.

if (recievedMail.ToAddress.ToString() == "humanresources <SMTP:[email protected]>") 
    { 
     _service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "[email protected]");   
    } 

https://msdn.microsoft.com/en-us/library/office/dd633680(v=exchg.80).aspx

Cuestiones relacionadas