/// <summary> /// Loads exchange appointment from exchange, filtered by related <paramref name="activityMetadata"/> to /// activity unique identifier. /// </summary> /// <param name="activityMetadata">Activity instance synchronization metadata.</param> /// <returns>If appointment with activity id found, returns <see cref="Exchange.Appointment"/> instance. /// Otherwise returns null.</returns> private Exchange.Appointment GetAppointmentByLocalIdProperty(SysSyncMetaData activityMetadata) { var localId = activityMetadata.LocalId; var filters = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.And); var customPropSetFilter = new Exchange.SearchFilter.IsEqualTo(ExchangeUtilityImpl.LocalIdProperty, localId.ToString()); filters.Add(customPropSetFilter); foreach (var noteFolder in Folders) { Exchange.PropertySet idOnlyPropertySet = new Exchange.PropertySet(Exchange.BasePropertySet.IdOnly); var itemView = new Exchange.ItemView(1) { PropertySet = idOnlyPropertySet }; IEnumerable <Exchange.Item> itemCollection = GetCalendarItemsByFilter(noteFolder, filters, itemView); if (itemCollection == null) { continue; } foreach (Exchange.Item item in itemCollection) { Exchange.Appointment appointment = SafeBindItem <Exchange.Appointment>(Service, item.Id); if (appointment != null) { return(appointment); } } } return(null); }
/// <summary> /// Gets filters for Exchange data query. /// </summary> /// <returns>Filter instance.</returns> private Exchange.SearchFilter.SearchFilterCollection GetItemsSearchFilters() { var itemsFilter = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.And) { new Exchange.SearchFilter.IsEqualTo(Exchange.ItemSchema.ItemClass, ExchangeConsts.TaskItemClassName) }; DateTime lastSyncDateUtc = TimeZoneInfo.ConvertTimeToUtc(UserSettings.LastSyncDate, TimeZone); DateTime importActivitiesFromDate = UserSettings.ImportActivitiesFrom; if (UserSettings.ImportActivitiesFrom != DateTime.MinValue) { itemsFilter.Add(new Exchange.SearchFilter.IsGreaterThanOrEqualTo( Exchange.TaskSchema.LastModifiedTime, importActivitiesFromDate)); } if (UserSettings.LastSyncDate != DateTime.MinValue) { var lastSyncDateUtcFilter = new Exchange.SearchFilter.IsGreaterThan( Exchange.ItemSchema.LastModifiedTime, lastSyncDateUtc.ToLocalTime()); var filterCollection = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.Or); var customPropSetFilter = new Exchange.SearchFilter.Exists(ExchangeUtilityImpl.LocalIdProperty); var notCustomPropSetFilter = new Exchange.SearchFilter.Not(customPropSetFilter); filterCollection.AddRange(new List <Exchange.SearchFilter> { lastSyncDateUtcFilter, notCustomPropSetFilter }); itemsFilter.Add(filterCollection); } return(itemsFilter); }
/// <summary> /// <see cref="ExchangeSyncProvider.FillItemsFilterCollection"/> /// </summary> protected override void FillItemsFilterCollection() { _itemsFilterCollection = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.And); var draftFilter = new Exchange.SearchFilter.IsNotEqualTo(Exchange.ItemSchema.IsDraft, true); _itemsFilterCollection.Add(draftFilter); if (_userConnection.GetIsFeatureEnabled("SetEmailSynchronizedInExchange")) { var customPropSetFilter = new Exchange.SearchFilter.Exists(ExchangeUtilityImpl.LocalIdProperty); var notCustomPropSetFilter = new Exchange.SearchFilter.Not(customPropSetFilter); _itemsFilterCollection.Add(notCustomPropSetFilter); } DateTime loadEmailsFromDate = LoadEmailsFromDate != DateTime.MinValue ? LoadEmailsFromDate : UserSettings.LastSyncDate; LogError($"LoadEmailsFromDate = '{LoadEmailsFromDate}', LastSyncDate = '{UserSettings.LastSyncDate}', result = '{loadEmailsFromDate}'"); if (loadEmailsFromDate != DateTime.MinValue) { var localLastSyncDate = GetLastSyncDate(loadEmailsFromDate); var itemsFilter = new Exchange.SearchFilter.IsGreaterThan(Exchange.ItemSchema.LastModifiedTime, localLastSyncDate); _itemsFilterCollection.Add(itemsFilter); LogError($"LoadEmailsFromDate filter adedd, filter date '{localLastSyncDate}'"); } }
/// <summary> /// For each specified sahred mailbox, if the user has access to the mailbox, /// items matching the search term are sought-out. Each of the specified folders in the user's personal mailbox are also searched. /// </summary> /// <param name="credentials">The user credntials to impersonate in the mail system.</param> /// <param name="sharedMailBoxNames">The names of the shared mailboxes to search.</param> /// <param name="mailFolderNames">The names of the folders in the user's personal mail box to search.</param> /// <param name="searchTerm">The term that results must contain. This is case insensitive.</param> /// <returns>Mail items that match the search term or an empty result (i.e. never null).</returns> public IEnumerable<MailItem> FindItems(MailBoxCredentials credentials, MailSearchContainerNameList sharedMailBoxNames, MailSearchContainerNameList mailFolderNames, string searchTerm) { if (credentials == null || String.IsNullOrEmpty(credentials.UserName)) { throw new UnauthorizedAccessException("No user to impersonate specified."); } var result = new List<MailItem>(); if (String.IsNullOrEmpty(searchTerm) || ((sharedMailBoxNames == null || sharedMailBoxNames.Count <= 0) && (mailFolderNames == null || mailFolderNames.Count <= 0))) { return result; } var ewsURL = configuration.EWSURL; var networkDomain = configuration.EWSNetworkDomain; var networkUserName = configuration.EWSNetworkUserName; var networkPassword = configuration.EWSNetworkPassword; var mailDomain = configuration.MailDomain; var searchFilters = new Microsoft.Exchange.WebServices.Data.SearchFilter.SearchFilterCollection (LogicalOperator.Or, new SearchFilter[5]{new SearchFilter.ContainsSubstring(EmailMessageSchema.Body, searchTerm), new SearchFilter.ContainsSubstring(EmailMessageSchema.Subject, searchTerm), new SearchFilter.ContainsSubstring(EmailMessageSchema.Sender, searchTerm), new SearchFilter.ContainsSubstring(EmailMessageSchema.ToRecipients, searchTerm), new SearchFilter.ContainsSubstring(EmailMessageSchema.Attachments, searchTerm) }); var service = ConfigureMSExchangeService(networkUserName, networkPassword, networkDomain, ewsURL, credentials); var iv = new ItemView(VIEW_SIZE); iv.PropertySet = new PropertySet(BasePropertySet.IdOnly, ItemSchema.Subject, ItemSchema.DateTimeReceived); var shareMailBoxMatches = SearchSharedMailBoxes(service, iv, searchFilters, sharedMailBoxNames, configuration.MailDomain, searchTerm); if (sharedMailBoxNames != null) result.AddRange(shareMailBoxMatches); var mailFolderMatches = SearchMailFolders(service, iv, searchFilters, mailFolderNames, searchTerm); if (mailFolderMatches != null) result.AddRange(mailFolderMatches); return result; }
public List <ExchangeMailFolder> GetMailboxFolders(string mailServerId, string mailboxName, string mailboxPassword, string senderEmailAddress, string folderClassName) { if (string.IsNullOrEmpty(mailboxPassword)) { mailboxPassword = GetExistingMailboxPassword(senderEmailAddress, UserConnection); } var credentials = new Mail.Credentials { UserName = mailboxName, UserPassword = mailboxPassword, ServerId = Guid.Parse(mailServerId), UseOAuth = GetSettingsHasOauth(senderEmailAddress, UserConnection) }; SetServerCertificateValidation(); var exchangeUtility = new ExchangeUtilityImpl(); Exchange.ExchangeService service = exchangeUtility.CreateExchangeService(UserConnection, credentials, senderEmailAddress, true); var filterCollection = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.Or); var filter = new Exchange.SearchFilter.IsEqualTo(Exchange.FolderSchema.FolderClass, folderClassName); var nullfilter = new Exchange.SearchFilter.Exists(Exchange.FolderSchema.FolderClass); filterCollection.Add(filter); filterCollection.Add(new Exchange.SearchFilter.Not(nullfilter)); string[] selectedFolders = null; var idPropertySet = new Exchange.PropertySet(Exchange.BasePropertySet.IdOnly); Exchange.Folder draftFolder = null; if (folderClassName == ExchangeConsts.NoteFolderClassName) { Exchange.Folder inboxFolder = Exchange.Folder.Bind(service, Exchange.WellKnownFolderName.Inbox, idPropertySet); if (inboxFolder != null) { selectedFolders = new[] { inboxFolder.Id.UniqueId }; } draftFolder = Exchange.Folder.Bind(service, Exchange.WellKnownFolderName.Drafts, idPropertySet); } List <ExchangeMailFolder> folders = exchangeUtility.GetHierarhicalFolderList(service, Exchange.WellKnownFolderName.MsgFolderRoot, filterCollection, selectedFolders); if (folders != null && folders.Any()) { folders[0] = new ExchangeMailFolder { Id = folders[0].Id, Name = mailboxName, ParentId = string.Empty, Path = string.Empty, Selected = false }; if (draftFolder != null) { folders.Remove(folders.FirstOrDefault(e => e.Path == draftFolder.Id.UniqueId)); } } return(folders); }
/// <summary> /// Get folder filters. /// </summary> /// <returns>Folder filters.</returns> private Exchange.SearchFilter getFolderFilters() { var filterCollection = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.Or); var filter = new Exchange.SearchFilter.IsEqualTo(Exchange.FolderSchema.FolderClass, ExchangeConsts.NoteFolderClassName); var nullfilter = new Exchange.SearchFilter.Exists(Exchange.FolderSchema.FolderClass); filterCollection.Add(filter); filterCollection.Add(new Exchange.SearchFilter.Not(nullfilter)); return(filterCollection); }
/// <summary> /// Gets filters for Exchange data query. /// </summary> /// <returns>Filter instance.</returns> private Exchange.SearchFilter GetItemsSearchFilters(SyncContext context = null) { Exchange.SearchFilter filter = null; DateTime lastSyncDateUtc = TimeZoneInfo.ConvertTimeToUtc(UserSettings.LastSyncDate, TimeZone); DateTime importActivitiesFromDate = UserSettings.ImportActivitiesFrom; context?.LogInfo(SyncAction.None, SyncDirection.Download, "lastSyncDateUtc = {0}, importActivitiesFromDate = {1}", lastSyncDateUtc, importActivitiesFromDate); if (lastSyncDateUtc != DateTime.MinValue && UserSettings.ImportActivitiesFrom != DateTime.MinValue) { var lastSyncDateUtcFilter = new Exchange.SearchFilter.IsGreaterThan( Exchange.ItemSchema.LastModifiedTime, lastSyncDateUtc.ToLocalTime()); var filterCollection = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.Or); var customPropSetFilter = new Exchange.SearchFilter.Exists(ExchangeUtilityImpl.LocalIdProperty); var notCustomPropSetFilter = new Exchange.SearchFilter.Not(customPropSetFilter); filterCollection.AddRange(new List <Exchange.SearchFilter> { lastSyncDateUtcFilter, notCustomPropSetFilter }); if (context != null && GetExchangeRecurringAppointmentsSupported(context.UserConnection)) { return(filterCollection); } var allFilterCollection = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.And); var importActivitiesFromDateFilter = new Exchange.SearchFilter.IsGreaterThanOrEqualTo( Exchange.AppointmentSchema.Start, importActivitiesFromDate); allFilterCollection.AddRange(new List <Exchange.SearchFilter> { importActivitiesFromDateFilter, filterCollection }); filter = allFilterCollection; } else if (lastSyncDateUtc != DateTime.MinValue && UserSettings.ImportActivitiesFrom == DateTime.MinValue) { filter = new Exchange.SearchFilter.IsGreaterThan( Exchange.ItemSchema.LastModifiedTime, lastSyncDateUtc.ToLocalTime()); } else if (lastSyncDateUtc == DateTime.MinValue && UserSettings.ImportActivitiesFrom != DateTime.MinValue) { filter = new Exchange.SearchFilter.IsGreaterThanOrEqualTo( Exchange.AppointmentSchema.Start, importActivitiesFromDate); } return(filter); }
public Exchange.SearchFilter GetContactsFilters() { if (UserSettings.LastSyncDate != DateTime.MinValue) { DateTime lastSyncDateUtc = TimeZoneInfo.ConvertTimeToUtc(UserSettings.LastSyncDate, TimeZone); var lastSyncDateUtcFilter = new Exchange.SearchFilter.IsGreaterThan( Exchange.ItemSchema.LastModifiedTime, lastSyncDateUtc.ToLocalTime()); var filterCollection = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.Or); var customPropSetFilter = new Exchange.SearchFilter.Exists(ExchangeUtilityImpl.LocalIdProperty); var notCustomPropSetFilter = new Exchange.SearchFilter.Not(customPropSetFilter); filterCollection.AddRange(new List <Exchange.SearchFilter> { lastSyncDateUtcFilter, notCustomPropSetFilter }); return(filterCollection); } return(null); }
/// <summary> /// Gets Items from <see cref="folder"/> by <see cref="filterCollection"/> /// </summary> /// <param name="folder">Exchange folder.</param> /// <param name="filterCollection">Filter collection.</param> /// <param name="itemView">Represents the view settings in a folder search operation.</param> /// <returns>Search result collection.</returns> public virtual IEnumerable <Exchange.Item> GetCalendarItemsByFilter(Exchange.Folder folder, Exchange.SearchFilter.SearchFilterCollection filterCollection, Exchange.ItemView itemView) { return(GetFolderItemsByFilter(folder, filterCollection, itemView)); }
private static webServiceData.Appointment searchAppointmentByFilter(SchedulingInfo schedulingInfo, webServiceData.ExchangeService service, string appointmentID) { RvLogger.DebugWrite("enter searchAppointmentByFilter=============="); List<webServiceData.SearchFilter> searchORFilterCollection = new List<webServiceData.SearchFilter>(); if (null != appointmentID) searchORFilterCollection.Add(new webServiceData.SearchFilter.IsEqualTo(webServiceData.EmailMessageSchema.Id, new webServiceData.ItemId(appointmentID))); else { searchORFilterCollection.Add(new webServiceData.SearchFilter.IsEqualTo(webServiceData.EmailMessageSchema.Subject, schedulingInfo.subject)); searchORFilterCollection.Add(new webServiceData.SearchFilter.IsEqualTo(webServiceData.EmailMessageSchema.From, schedulingInfo.delegatorEmailAddr)); searchORFilterCollection.Add(new webServiceData.SearchFilter.IsGreaterThan(webServiceData.EmailMessageSchema.LastModifiedTime, DateTime.UtcNow.AddHours(-25))); if (!string.IsNullOrEmpty(schedulingInfo.storeEntryId)) searchORFilterCollection.Add(new webServiceData.SearchFilter.IsEqualTo(webServiceData.EmailMessageSchema.StoreEntryId, schedulingInfo.storeEntryId)); if (!string.IsNullOrEmpty(schedulingInfo.conversationKey)) searchORFilterCollection.Add(new webServiceData.SearchFilter.IsEqualTo(webServiceData.EmailMessageSchema.ConversationId, schedulingInfo.conversationKey)); } RvLogger.DebugWrite("enter searchAppointmentByFilter==============1"); webServiceData.SearchFilter searchFilter = new webServiceData.SearchFilter.SearchFilterCollection(webServiceData.LogicalOperator.And, searchORFilterCollection.ToArray()); RvLogger.DebugWrite("enter searchAppointmentByFilter==============2 " + schedulingInfo.delegatorEmailAddr); webServiceData.Mailbox mailBox = new webServiceData.Mailbox(schedulingInfo.delegatorEmailAddr); RvLogger.DebugWrite("enter searchAppointmentByFilter==============3"); webServiceData.FolderId folderID = new webServiceData.FolderId(webServiceData.WellKnownFolderName.Calendar, mailBox); //No need to set mail since the service already know it. //webServiceData.FolderId folderID = new webServiceData.FolderId(webServiceData.WellKnownFolderName.Calendar); RvLogger.DebugWrite("enter searchAppointmentByFilter==============4"); webServiceData.FindItemsResults<webServiceData.Item> results = service.FindItems( folderID, searchFilter, new webServiceData.ItemView(100)); RvLogger.DebugWrite("enter searchAppointmentByFilter==============5"); RvLogger.DebugWrite("results searchAppointmentByFilter==============" + (null == results.Items ? "0" : "" + results.Items.Count)); foreach (webServiceData.Item item in results) { try { webServiceData.Appointment appointment = (webServiceData.Appointment)item; if (string.IsNullOrEmpty(schedulingInfo.location)) schedulingInfo.location = ""; if (string.IsNullOrEmpty(appointment.Location)) appointment.Location = ""; if (schedulingInfo.location == appointment.Location && schedulingInfo.startDate.ToUniversalTime().Equals(appointment.Start.ToUniversalTime()) && schedulingInfo.endDate.ToUniversalTime().Equals(appointment.End.ToUniversalTime())) { RvLogger.DebugWrite("lastModifiedTime1===================" + appointment.LastModifiedTime); return appointment; } } catch (ScopiaMeetingAddInException ex) { throw ex; } } return null; }
public IEnumerable <IRemoteItem> EnumerateChangesOld(SyncContext context) { base.EnumerateChanges(context); var result = new List <IRemoteItem>(); var folders = new List <Exchange.Folder>(); if (UserSettings.LoadAll) { Exchange.Folder rootFolder = Exchange.Folder.Bind(Service, Exchange.WellKnownFolderName.MsgFolderRoot); var filter = new Exchange.SearchFilter.IsEqualTo( Exchange.FolderSchema.FolderClass, ExchangeConsts.NoteFolderClassName); folders.GetAllFoldersByFilter(rootFolder, filter); } else { folders = SafeBindFolders(Service, UserSettings.RemoteFolderUIds.Keys, context); } var itemsFilterCollection = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.And); var draftFilter = new Exchange.SearchFilter.IsNotEqualTo(Exchange.ItemSchema.IsDraft, true); itemsFilterCollection.Add(draftFilter); DateTime loadEmailsFromDate = LoadEmailsFromDate != DateTime.MinValue ? LoadEmailsFromDate : UserSettings.LastSyncDate; if (loadEmailsFromDate != DateTime.MinValue) { var localLastSyncDate = GetLastSyncDate(loadEmailsFromDate); var itemsFilter = new Exchange.SearchFilter.IsGreaterThan(Exchange.ItemSchema.LastModifiedTime, localLastSyncDate); _itemsFilterCollection.Add(itemsFilter); } FilterDeprecatedFolders(ref folders); foreach (var noteFolder in folders) { var activityFolderIds = new List <Guid>(); if (UserSettings.RootFolderId != Guid.Empty) { activityFolderIds.Add(UserSettings.RootFolderId); } var folderId = GetFolderId(noteFolder); if (UserSettings.RemoteFolderUIds.ContainsKey(folderId)) { activityFolderIds.Add(UserSettings.RemoteFolderUIds[folderId]); } Exchange.PropertySet idOnlyPropertySet = new Exchange.PropertySet(Exchange.BasePropertySet.IdOnly); var itemView = new Exchange.ItemView(PageItemCount) { PropertySet = idOnlyPropertySet }; Exchange.FindItemsResults <Exchange.Item> itemCollection; do { itemCollection = GetFolderItemsByFilter(noteFolder, itemsFilterCollection, itemView); if (itemCollection == null) { break; } result.AddRange(GetEmailsFromCollection(itemCollection, activityFolderIds)); } while (itemCollection.MoreAvailable); } return(result); }
/// <summary> /// Gets Items from <see cref="folder"/> by <see cref="filterCollection"/> /// </summary> /// <param name="folder">Exchange folder.</param> /// <param name="filterCollection">Filter collection.</param> /// <param name="itemView">Represents the view settings in a folder search operation.</param> /// <returns></returns> public virtual Exchange.FindItemsResults <Exchange.Item> GetFolderItemsByFilter(Exchange.Folder folder, Exchange.SearchFilter.SearchFilterCollection filterCollection, Exchange.ItemView itemView) { return(folder.ReadItems(filterCollection, itemView)); }