Pages

Thursday, February 10, 2011

Exchange 2007: Mover elementos de un calendario a otro

Utilizando la API de Exchange para comunicarnos con los web services, es posible realizar muchas acciones. En particular podemos mover los elementos de un calendario a otro.

Esto es útil por ejemplo cuando realizamos una migración y las carpetas quedan cambiadas, es decir tenemos un "Calendar" y un "Calendario".



string usuario = "";
string pass = "";
string servidorCorreo = "";
string correoUsuario = "";
string dominio = "";
string origen = "Calendar"
string destino = "Calendario"
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
 service.Url = new Uri("https://" + servidorCorreo +"/ews/exchange.asmx");
 service.Credentials = new NetworkCredential(usuario, pass, dominio);
 service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, correoUsuario);

 FolderView view = new FolderView(200);
 view.Traversal = FolderTraversal.Deep;
 
 FindFoldersResults findFolderResults = service.FindFolders(WellKnownFolderName.Root, view);
 FolderId elid = null;
 FolderId idDestino = null;
 foreach (Folder myFolder in findFolderResults.Folders)
 {
     if (myFolder != null)
     {
         if (myFolder.DisplayName != null)
         {
             if (myFolder.DisplayName.CompareTo(origen) == 0)
                 elid = myFolder.Id;
             if (myFolder.DisplayName.CompareTo(destino) == 0)
             {
                 idDestino = myFolder.Id;
             }
         }

     }
 }
 FindItemsResults<Item> findResults = service.FindItems(elid, new ItemView(5000));
 IEnumerable<ItemId> itemIds = from item in findResults
                               select item.Id;
 Console.WriteLine("Moviendo items desde: " + origen + " " + destino);

 if (idDestino == null) //Si no se especifica un destino se toma el Calendario de sistema como destino
       service.MoveItems(itemIds, WellKnownFolderName.Calendar);
 else
       service.MoveItems(itemIds, idDestino);