Estamos usando ColdFusion 2016 y estamos usando la API de EWS para conectarnos a Exchange. Logré que el ejemplo de código de la siguiente publicación funcionara, pero no puedo averiguar cómo usar SearchFilter con el método findItems(). ¿Por qué nunca regresa la acción de obtener de cfexchangemail?
service = createObject("Java", "microsoft.exchange.webservices.data.ExchangeService"); service.init(); version = createObject("Java", "microsoft.exchange.webservices.data.ExchangeVersion"); service.init(version.Exchange2010); credentials = createObject("Java", "microsoft.exchange.webservices.data.WebCredentials"); credentials.init(yourusername, yourpassword); service.setCredentials(credentials); uri = createObject("Java", "java.net.URI"); uri.init("outlook webservices url"); service.setUrl(uri); WellKnownFolderName=createObject("Java","microsoft.exchange.webservices.data.WellKnownFolderName"); result = service.FindItems(service.WellKnownFolderName.Inbox, CreateObject("java", "microsoft.exchange.webservices.data.ItemView").init(100)); for(item in result.getItems(){ // ..loop through each field and store their value // in query object or something... }Entonces, básicamente, ¿es posible traducir este código Java a Coldfusion?
ItemView view = new ItemView(10); view.getOrderBy().add(ItemSchema.DateTimeReceived, SortDirection.Ascending); view.setPropertySet(new PropertySet(BasePropertySet.IdOnly, ItemSchema.Subject, ItemSchema.DateTimeReceived)); FindItemsResults<Item> findResults = service.findItems(WellKnownFolderName.Inbox, new SearchFilter.SearchFilterCollection( LogicalOperator.Or, new SearchFilter.ContainsSubstring(ItemSchema.Subject, "EWS"), new SearchFilter.ContainsSubstring(ItemSchema.Subject, "API")), view); service.loadPropertiesForItems(findResults, PropertySet.FirstClassProperties); System.out.println("Total number of items found: " + findResults.getTotalCount()); for (Item item : findResults) { System.out.println(item.getSubject()); System.out.println(item.getBody()); // Do something with the item. }Actualización de los comentarios:
No puedo averiguar cómo crear una instancia de SearchFilter o SearchFilterCollection . Intenté crear un objeto searchFilter, pero no tiene las propiedades para trabajar. Debo estar debiendo estar perdiendo algo.
CreateObject("java","microsoft.exchange.webservices.data.SearchFilter");El resultado final de trabajo fue:
folderName = createObject("java", "microsoft.exchange.webservices.data.WellKnownFolderName"); itemView = CreateObject("java","microsoft.exchange.webservices.data.ItemView").init(10,0); folderID = CreateObject("java","microsoft.exchange.webservices.data.FolderId").init( folderName.Inbox, mailBox ); sortDirection = CreateObject("java","microsoft.exchange.webservices.data.SortDirection"); basePropertySet = createObject("java", "microsoft.exchange.webservices.data.BasePropertySet"); propertyset = createObject("java", "microsoft.exchange.webservices.data.PropertySet"); itemSchema = createObject("java", "microsoft.exchange.webservices.data.ItemSchema"); searchFilterCollection = CreateObject("java","microsoft.exchange.webservices.data.SearchFilter$SearchFilterCollection"); logicalOperator = createObject("java", "microsoft.exchange.webservices.data.LogicalOperator"); subString1 = CreateObject("java","microsoft.exchange.webservices.data.SearchFilter$ContainsSubstring").init( itemSchema.Subject, "EWS" ); subString2 = CreateObject("java","microsoft.exchange.webservices.data.SearchFilter$ContainsSubstring").init( itemSchema.Subject, "API" ); searchFilterCollection.add(SubString1); searchFilterCollection.add(SubString2); searchFilterCollection.setLogicalOperator(LogicalOperator.Or); bodyType = createObject("java", "microsoft.exchange.webservices.data.BodyType"); propertyset.add(itemSchema.Subject); propertyset.add(itemSchema.DateTimeReceived); propertyset.setBasePropertySet(basePropertySet.IdOnly); propertyset.setRequestedBodyType(bodyType.HTML); itemView.getOrderBy().add(itemSchema.DateTimeReceived, sortDirection.Ascending); itemView.setPropertySet(propertyset); viewResults = service.findItems(folderID, searchFilterCollection, itemView);(No es una respuesta completa, pero es demasiado larga para comentarios)
No es de extrañar... eso es un montón de anidamiento. No tengo esa lib instalada, pero si fuera yo, comenzaría dividiéndola en declaraciones separadas, un new objeto por línea. Comience con el constructor más interno:
new SearchFilter.ContainsSubstring( ItemSchema.Subject , "API" ) Primero deberá crear una instancia de ItemSchema para tener acceso a la propiedad Subject . Mirando los documentos de C# (no hay javadocs disponibles), la ruta debería ser algo como esto:
ItemSchema = createObject("java", "microsoft.exchange.webservices.data.ItemSchema"); Después de eso, continúe con la creación del SearchFilter . Fíjate en el período . en el nombre de la clase? La palabra clave new seguida de un nombre de clase, que contiene un punto, generalmente significa que es una clase interna . Las clases internas requieren una sintaxis especial, es decir, ParentClass$InnerClass . Algo como esto debería funcionar:
APISubString = CreateObject("java","microsoft.exchange.webservices.data.SearchFilter$ContainsSubstring"); writeDump(APISubString ); Si funciona, agregue init() para inicializar el objeto:
APISubString = CreateObject("java","microsoft.exchange.webservices.data.SearchFilter.ContainsSubstring").init(ItemSchema.Subject, "API");Luego pasa al siguiente objeto más interno:
new SearchFilter.ContainsSubstring( ItemSchema.Subject , "EWS" )y haga espuma, enjuague, repita para los objetos restantes:
// ItemSchema.Subject is a static value and can be reused EWSSubString = CreateObject("java","microsoft.exchange.webservices.data.SearchFilter.ContainsSubstring").init(ItemSchema.Subject, "EWS");