/// <summary> /// 从当前日期开始往前move /// </summary> /// <param name="date"></param> /// <param name="count"></param> public void MoveBeforeDateArchive(DateTime date, int count) { try { SearchFilter.IsLessThanOrEqualTo filter = new SearchFilter.IsLessThanOrEqualTo(ItemSchema.DateTimeReceived, date); SearchFilter.IsGreaterThanOrEqualTo filter2 = new SearchFilter.IsGreaterThanOrEqualTo(ItemSchema.DateTimeReceived, date.AddDays(-1)); SearchFilter.SearchFilterCollection searchFilterCollection = new SearchFilter.SearchFilterCollection(LogicalOperator.And, filter, filter2); if (_service != null) { FindFoldersResults aFolders = _service.FindFolders(WellKnownFolderName.MsgFolderRoot, new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "Archive"), new FolderView(10)); if (aFolders.Folders.Count == 1) { FolderId archiveFolderId = aFolders.Folders[0].Id; FindItemsResults <Item> findResults = _service.FindItems(WellKnownFolderName.Inbox, searchFilterCollection, new ItemView(count)); Console.WriteLine($"date: {date.ToShortDateString()}, count: {findResults.TotalCount}"); List <ItemId> itemids = new List <ItemId>(); foreach (var item in findResults) { itemids.Add(item.Id); } if (itemids.Count > 0) { _service.MoveItems(itemids, archiveFolderId); Console.WriteLine("move successful!"); } } } } catch (Exception ex) { Console.Write(ex.Message); throw; } }
/// <summary> ///从当前日期开始往后move /// </summary> /// <param name="date"></param> /// <param name="count"></param> public void MoveAfterDateArchive(DateTime date, int count, int days) { try { SearchFilter.IsLessThanOrEqualTo filter = new SearchFilter.IsLessThanOrEqualTo(ItemSchema.DateTimeReceived, date.AddDays(days)); SearchFilter.IsGreaterThanOrEqualTo filter2 = new SearchFilter.IsGreaterThanOrEqualTo(ItemSchema.DateTimeReceived, date); SearchFilter.SearchFilterCollection searchFilterCollection = new SearchFilter.SearchFilterCollection(LogicalOperator.And, filter, filter2); if (_service != null) { FindFoldersResults aFolders = _service.FindFolders(WellKnownFolderName.MsgFolderRoot, new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "Archive"), new FolderView(10)); if (aFolders.Folders.Count == 1) { FolderId archiveFolderId = aFolders.Folders[0].Id; FindItemsResults <Item> findResults = _service.FindItems(WellKnownFolderName.Inbox, searchFilterCollection, new ItemView(count)); Console.WriteLine($"date: {date.ToShortDateString()}, count: {findResults.TotalCount}"); List <ItemId> itemids = new List <ItemId>(); foreach (var item in findResults) { itemids.Add(item.Id); } if (itemids.Count > 0) { Console.WriteLine("moving ... ..."); Stopwatch sw = new Stopwatch(); sw.Start(); _service.MoveItems(itemids, archiveFolderId); sw.Stop(); //new Timer(new TimerCallback(timer_Elapsed), null, 0, 30000); Console.WriteLine($"move successful after {sw.ElapsedMilliseconds} ms, then sleep 10s ..."); System.Threading.Thread.Sleep(10000); //30s } } } } catch (ServiceRequestException ex) { Console.WriteLine(ex.Message); Console.WriteLine("try again..."); MoveAfterDateArchive(date, count, days); } catch (ServiceRemoteException ex) { Console.WriteLine(ex.Message); Console.WriteLine("sleep 120s ..."); System.Threading.Thread.Sleep(120000); //120s Console.WriteLine("try again..."); MoveAfterDateArchive(date, count, days); } catch (Exception) { throw; } }
public void MoveBeforeDateArchive(DateTime date, int count, int days) { try { SearchFilter.IsLessThanOrEqualTo beginfilter = new SearchFilter.IsLessThanOrEqualTo(ItemSchema.DateTimeReceived, date); SearchFilter.IsGreaterThanOrEqualTo endfilter = new SearchFilter.IsGreaterThanOrEqualTo(ItemSchema.DateTimeReceived, date.AddDays(-1 * days)); SearchFilter.SearchFilterCollection searchFilterCollection = new SearchFilter.SearchFilterCollection(LogicalOperator.And, beginfilter, endfilter); if (_service != null) { FindItemsResults <Item> findResults = _service.FindItems(WellKnownFolderName.Inbox, searchFilterCollection, new ItemView(count)); message = $"date: {date.ToShortDateString()}, count: {findResults.TotalCount}" + (findResults.TotalCount > 0 ? ", moving..." : ", skip..."); List <ItemId> itemids = new List <ItemId>(); foreach (var item in findResults) { itemids.Add(item.Id); } if (itemids.Count > 0) { _service.MoveItems(itemids, archiveFolderId); message = $"move successful, then sleep 10s ..."; Thread.Sleep(10000); //10s } else { Thread.Sleep(500); //1s } } else { message = "can't connect to server."; } } catch (ServiceRequestException ex) { message = ex.Message; message = "try again..."; MoveBeforeDateArchive(date, count, days); } catch (ServerBusyException ex) { message = ex.Message; message = "pause 120s ..."; Thread.Sleep(120000); //120s message = "try again..."; MoveBeforeDateArchive(date, count, days); } catch (Exception ex) { message = ex.Message; throw; } }
public void IsLessThanOrEqualTo() { SearchFilter filter = new SearchFilter.IsLessThanOrEqualTo( MailFolderObjectSchema.TotalItemCount, 5); Assert.AreEqual( filter.FilterOperator, FilterOperator.le); Assert.AreEqual( "$filter=TotalItemCount le 5" , filter.Query); }
/// <summary> /// 过滤器 /// </summary> /// <returns></returns> private static SearchFilter SetFilter() { List <SearchFilter> searchFilterCollection = new List <SearchFilter>(); //searchFilterCollection.Add(new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false)); //searchFilterCollection.Add(new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, true)); //筛选今天的邮件 SearchFilter start = new SearchFilter.IsGreaterThanOrEqualTo(EmailMessageSchema.DateTimeCreated, Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"))); SearchFilter end = new SearchFilter.IsLessThanOrEqualTo(EmailMessageSchema.DateTimeCreated, Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"))); searchFilterCollection.Add(start); searchFilterCollection.Add(end); SearchFilter filter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, searchFilterCollection.ToArray()); return(filter); }
public void TestSearchFilterCollection() { SearchFilter lessThanOrEqualTo = new SearchFilter.IsLessThanOrEqualTo( MailFolderObjectSchema.TotalItemCount, 5); SearchFilter greaterThan = new SearchFilter.IsGreaterThan( MessageObjectSchema.CreatedDateTime, new DateTimeOffset(new DateTime(2019, 2, 1))); SearchFilter notEqualTo = new SearchFilter.NotEqualTo( MessageObjectSchema.Body, "test body"); SearchFilter.SearchFilterCollection searchFilterCollection = new SearchFilter.SearchFilterCollection( FilterOperator.and, lessThanOrEqualTo, greaterThan, notEqualTo); Assert.AreEqual( FilterOperator.and, searchFilterCollection.FilterOperator); Assert.AreEqual( "$filter=TotalItemCount le 5 and CreatedDateTime gt 2019-02-01T12:00:00Z and Body ne 'test body'", searchFilterCollection.Query); Assert.ThrowsException <ArgumentException>(() => { searchFilterCollection = new SearchFilter.SearchFilterCollection(FilterOperator.ge); }); searchFilterCollection = new SearchFilter.SearchFilterCollection( FilterOperator.or, lessThanOrEqualTo, greaterThan, notEqualTo); Assert.AreEqual( FilterOperator.or, searchFilterCollection.FilterOperator); Assert.AreEqual( "$filter=TotalItemCount le 5 or CreatedDateTime gt 2019-02-01T12:00:00Z or Body ne 'test body'", searchFilterCollection.Query); }
public void ReceiveEmailByFindItems(DateTime date, int count) { SearchFilter.IsLessThanOrEqualTo filter = new SearchFilter.IsLessThanOrEqualTo(ItemSchema.DateTimeReceived, date); if (_service != null) { FindItemsResults <Item> findResults = _service.FindItems(WellKnownFolderName.Inbox, filter, new ItemView(count)); int countTemp = 1; if (findResults.TotalCount > 0) { foreach (Item item in findResults) { EmailMessage message = EmailMessage.Bind(_service, item.Id); Console.WriteLine(countTemp++ + ": creattime: " + message.DateTimeCreated + ": " + message.Subject + ", from: " + message.From); } } else { Console.WriteLine("no email."); } } }
public void GetMailsFromArchive(DateTime date, int count) { count = 10; SearchFilter.IsLessThanOrEqualTo filter = new SearchFilter.IsLessThanOrEqualTo(ItemSchema.DateTimeReceived, date); if (_service != null) { FindFoldersResults aFolders = _service.FindFolders(WellKnownFolderName.MsgFolderRoot, new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "Archive"), new FolderView(10)); if (aFolders.Folders.Count == 1) { FindItemsResults <Item> findResults = _service.FindItems(aFolders.Folders[0].Id, filter, new ItemView(count)); Console.WriteLine("count: " + findResults.TotalCount); int countTemp = 1; foreach (Item item in findResults) { //item.Move(WellKnownFolderName.ArchiveMsgFolderRoot); EmailMessage message = EmailMessage.Bind(_service, item.Id); Console.WriteLine(countTemp++ + "creattime: " + message.DateTimeCreated + ": " + message.Subject + ", from: " + message.From); //message.Move(WellKnownFolderName.ArchiveRoot); } } } }
/// <summary> /// Create a search filter for filtering items based on equality comparisons of property values. /// </summary> /// <param name="service">An ExchangeService object with credentials and the EWS URL.</param> private static void UseAnEqualitySearchFilter(ExchangeService service) { // The IsGreaterThan filter determines whether the value of a property is greater than a specific value. // This filter instance filters on the DateTimeReceived property, where the value is greater than a month ago. SearchFilter.IsGreaterThan isGreaterThan = new SearchFilter.IsGreaterThan(EmailMessageSchema.DateTimeReceived, DateTime.Now.AddMonths(-1)); // The IsGreaterThanOrEqualTo filter determines whether the value of a property is greater than or equal to a specific value. // This filter instance filters on the DateTimeCreated property, where the value is greater than or equal to a week ago. SearchFilter.IsGreaterThanOrEqualTo isGreaterThanOrEqualTo = new SearchFilter.IsGreaterThanOrEqualTo(EmailMessageSchema.DateTimeCreated, DateTime.Now.AddDays(-7)); // The IsLessThan filter determines whether the value of a property is less than a specific value. // This filter instance filters on the DateTimeReceived property, where the value is less than the time an hour ago. SearchFilter.IsLessThan isLessThan = new SearchFilter.IsLessThan(EmailMessageSchema.DateTimeReceived, DateTime.Now.AddHours(-1)); // The IsLessThanOrEqualTo filter determines whether the value of a property is less than or equal to a specific value. // This filter instance filters on the DateTimeCreated property, where the value is less than or equal to the time two days ago. SearchFilter.IsLessThanOrEqualTo isLessThanOrEqualTo = new SearchFilter.IsLessThanOrEqualTo(EmailMessageSchema.DateTimeCreated, DateTime.Now.AddDays(-2)); // The IsEqualTo filter determines whether the value of a property is equal to a specific value. // This filter instance filters on the Importance property where it is set to Normal. SearchFilter.IsEqualTo isEqualTo = new SearchFilter.IsEqualTo(EmailMessageSchema.Importance, Importance.Normal); // The IsNotEqualTo filter determines whether the value of a property is not equal to a specific value. // This filter instance filters on the IsRead property, where it is not set to true. SearchFilter.IsNotEqualTo isNotEqualTo = new SearchFilter.IsNotEqualTo(EmailMessageSchema.IsRead, true); // Create a search filter collection that will filter based on an item's Importance and IsRead flag. // Both conditions must pass for an item to be returned in a result set. SearchFilter.SearchFilterCollection secondLevelSearchFilterCollection1 = new SearchFilter.SearchFilterCollection(LogicalOperator.And, isEqualTo, isNotEqualTo); // Create a search filter collection that will filter based on an item's DateTimeCreated and DateTimeReceived properties. // All four conditions must pass for an item to be returned in a result set. SearchFilter.SearchFilterCollection secondLevelSearchFilterCollection2 = new SearchFilter.SearchFilterCollection(LogicalOperator.And, isGreaterThan, isGreaterThanOrEqualTo, isLessThan, isLessThanOrEqualTo); // The SearchFilterCollection contains a collection of search filter collections. Items must pass the search conditions // of either collection for an item to be returned in a result set. SearchFilter.SearchFilterCollection firstLevelSearchFilterCollection = new SearchFilter.SearchFilterCollection(LogicalOperator.Or, secondLevelSearchFilterCollection1, secondLevelSearchFilterCollection2); // Create a nonpaged view and add properties to the results set. ItemView view = new ItemView(10); view.PropertySet = new PropertySet(EmailMessageSchema.Subject, EmailMessageSchema.DateTimeCreated, EmailMessageSchema.DateTimeReceived, EmailMessageSchema.Importance, EmailMessageSchema.IsRead); try { // Search the Inbox based on the ItemView and the SearchFilterCollection. This results in a FindItem operation call // to EWS. FindItemsResults <Item> results = service.FindItems(WellKnownFolderName.Inbox, firstLevelSearchFilterCollection, view); foreach (Item item in results.Items) { Console.WriteLine("\r\nSubject:\t\t{0}", item.Subject); Console.WriteLine("DateTimeCreated:\t{0}", item.DateTimeCreated.ToShortDateString()); Console.WriteLine("DateTimeReceived:\t{0}", item.DateTimeReceived.ToShortDateString()); Console.WriteLine("Importance:\t\t{0}", item.Importance.ToString()); Console.WriteLine("IsRead:\t\t\t{0}", (item as EmailMessage).IsRead.ToString()); } } catch (Exception ex) { Console.WriteLine("Error: {0}", ex.Message); } }
/// <summary> /// This method creates and sets the search folder. /// </summary> private static SearchFolder CreateSearchFolder(ExchangeService service, Dictionary <PropertyDefinition, String> filters, String displayName) { if (service == null) { return(null); } SearchFilter.SearchFilterCollection filterCollection = new SearchFilter.SearchFilterCollection(LogicalOperator.And); // We only search the nearest 30 days emails. DateTime startDate = DateTime.Now.AddDays(-30); DateTime endDate = DateTime.Now; SearchFilter startDateFilter = new SearchFilter.IsGreaterThanOrEqualTo(EmailMessageSchema.DateTimeCreated, startDate); SearchFilter endDateFilter = new SearchFilter.IsLessThanOrEqualTo(EmailMessageSchema.DateTimeCreated, endDate); filterCollection.Add(startDateFilter); filterCollection.Add(endDateFilter); SearchFilter itemClassFilter = new SearchFilter.IsEqualTo(EmailMessageSchema.ItemClass, "IPM.Note"); filterCollection.Add(itemClassFilter); // Set the other filters. if (filters != null) { foreach (PropertyDefinition property in filters.Keys) { SearchFilter searchFilter = new SearchFilter.ContainsSubstring(property, filters[property]); filterCollection.Add(searchFilter); } } FolderId folderId = new FolderId(WellKnownFolderName.Inbox); Boolean isDuplicateFoler = true; SearchFilter duplicateFilter = new SearchFilter.IsEqualTo(FolderSchema.DisplayName, displayName); SearchFolder searchFolder = GetFolder(service, duplicateFilter, WellKnownFolderName.SearchFolders) as SearchFolder; // If there isn't the specific search folder, we create a new one. if (searchFolder == null) { searchFolder = new SearchFolder(service); isDuplicateFoler = false; } searchFolder.SearchParameters.RootFolderIds.Add(folderId); searchFolder.SearchParameters.Traversal = SearchFolderTraversal.Shallow; searchFolder.SearchParameters.SearchFilter = filterCollection; if (isDuplicateFoler) { searchFolder.Update(); } else { searchFolder.DisplayName = displayName; searchFolder.Save(WellKnownFolderName.SearchFolders); } return(searchFolder); }