9

Come "newbie API gestito da EWS", sto riscontrando alcuni problemi nel trovare esempi e documentazione sulla creazione e gestione di attività.Creazione di attività per altri utenti tramite l'API gestita da Servizi Web di Exchange (EWS)

Sono riuscito a creare un compito per me senza problemi. Tuttavia, ho davvero bisogno di essere in grado di fare quanto segue - se qualcuno potesse darmi qualche suggerimento lo apprezzerei davvero ...

  1. Creare un'attività e assegnarlo a un altro utente.
  2. Essere in grado di interrogare lo stato di tale attività (percentuale completa, ecc.) Mentre è assegnato a tale utente.
  3. Aggiornare le note sull'attività in qualsiasi momento.

Grazie in anticipo per eventuali suggerimenti!

risposta

1

Purtroppo, non è possibile impostare la proprietà Task.DisplayTo. Vorrei suggerire che EWS non supporta l'assegnazione di compiti ad altri (see post) e che, per ottenere la funzionalità richiesta, dovresti creare l'elemento nella cartella Attività dell'utente che voglio assegnarlo a (questo è diverso da assegnare, che si farebbe dalla propria cartella)

Mentre ho questa funzionalità che funziona con le classi proxy, non ho ancora farlo funzionare con l'API gestita. Suppongo che tu possa utilizzare il metodo FindFolder per recuperare la cartella delle attività dell'assegnatario, quindi creare l'elemento lì, ma avrò un aspetto e aggiornerò quando avrò una versione funzionante.

Guarda questo spazio ;-)

+0

Grazie per guardare in questo per me - è molto apprezzato! Attendo con impazienza la tua risposta ... –

2

Ho preso uno sguardo in questo, e io non sono sicuro che sia possibile utilizzando l'API gestita.

Ho un sistema configurato utilizzando quattro cartelle utente di esempio e un utente amministratore centrale con accesso delegato a ciascuna delle cassette postali di tali utenti. Quando cerco di trovare le cartelle usando l'API, posso solo trovare le cartelle dell'utente che sono le credenziali che fornisco quando creo l'oggetto servizio.

Sto anche utilizzando gli oggetti proxy generati automaticamente (ho scelto l'API solo per provare e aiutare) e utilizzo il seguente processo per creare un'attività per un altro utente (funziona correttamente ...):

  1. Connettersi al server come account di amministratore centrale.
  2. Creare l'oggetto compito come si farebbe per il proprio account.
  3. Creare un riferimento alla cartella Attività dell'utente a cui si desidera inviare l'elemento.
  4. Creare un oggetto CreateItemRequest di passare al server, e aggiungere i due elementi da punti 2 e 3 per la richiesta

Quando la richiesta viene inviata, l'elemento viene creato nella cartella dell'utente di destinazione.

Speravo che questa sequenza potesse essere possibile nell'API gestita, ma non sembra funzionare.

Continuerò a lavorarci mentre ne ho la possibilità, ma ho altri problemi con gli appuntamenti su cui sto lavorando. Ho pensato che la sequenza potesse aiutare chiunque altro a guardare, nel caso avessero più fortuna.

dispiace non posso fornire ulteriori informazioni al momento

+0

Apprezzo davvero il tuo aiuto con questo - aggiungerò un riferimento web e giocherò anch'io con esso. Ti farò sapere se vengo da nessuna parte? !! –

+0

un esempio di dump di esempio sarebbe utile ... anche se incompleto (con solo copertura 2,3 e 4). – Seph

2

Un'altra opzione è impostata utilizzare la proprietà ExchangeService ImpersonatedUserId per rappresentare l'utente che sarà assegnato il compito. Impersonare l'utente prima di creare l'attività e deve essere creato nella cartella Attività.

3

Il codice in this post ha lavorato per me

incollare il codice per i posteri:

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

Ive stato esaminando questo più recentemente e avere il seguente:

Sto facendo funzionare un'applicazione console che impostare una connessione di streaming per verificare la presenza di nuove e-mail che arrivano nella casella di posta per [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); 
} 

mio EWSConnection classe statica sembra vagamente simile a questo:

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 questo, è possibile vedere che ho sottoscritto lo OnNotificationEvent ea sua volta il mio metodo OnEvent verrà richiamato quando arriva una nuova email. Quando arriva una nuova e-mail a questa casella postale, ho l'obbligo di creare un'attività e assegnarla alla persona interessata, in base a quale sia la proprietà 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); 
      } 
     } 

In un primo momento si può vedere che ho provato ad aggiungere la persona che volevo il compito di essere creato per nel metodo task.Save, tuttavia, una volta sono andato a Outlook per interagire con l'operazione appena creata, il proprietario era ancora userone, ovvero la persona con cui sono state utilizzate le credenziali per connettersi al servizio, questo è stato un problema per me poiché ho bisogno che il proprietario dell'attività sia usertwo.

Ciò è stato ottenuto eliminando la variabile targetSharedEmailAddress e utilizzando invece la proprietà ImpersonatedUserId dell'oggetto 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