/// <summary> /// Searches using an S22 Imap client /// </summary> /// <param name="searchCriteria"></param> /// <param name="processMessages"></param> /// <returns></returns> public IEnumerable<IEmail> Search(EmailSearchCriteria searchCriteria, bool processMessages = true) { // create client var imapClient = new ImapClient(_host, _port, _useSsl); // log in imapClient.Login(_userName, _password, AuthMethod.Auto); // search for messages var messageIds = imapClient.Search(GetSearchCondition(searchCriteria), searchCriteria.Folder); // no messages found - return empty collection if (messageIds == null || messageIds.Length == 0) return new List<IEmail>(); // get messages var messages = imapClient.GetMessages(messageIds, FetchOptions.TextOnly, true, searchCriteria.Folder); // check if messages downloaded properly if (messages == null || messages.Length == 0) throw new ImapMessageDownloadException(_host, _port, _userName, searchCriteria.Folder, messageIds); // create as S22ImapMessages return messages.Select(m => new S22ImapMessage(m)); }
/// <summary> /// Searches using an S22 Imap client /// </summary> /// <param name="searchCriteria"></param> /// <param name="processMessages"></param> /// <returns></returns> public IEnumerable <IEmail> Search(EmailSearchCriteria searchCriteria, bool processMessages = true) { // create client var imapClient = new ImapClient(_host, _port, _useSsl); // log in imapClient.Login(_userName, _password, AuthMethod.Auto); // search for messages var messageIds = imapClient.Search(GetSearchCondition(searchCriteria), searchCriteria.Folder); // no messages found - return empty collection if (messageIds == null || messageIds.Length == 0) { return(new List <IEmail>()); } // get messages var messages = imapClient.GetMessages(messageIds, FetchOptions.TextOnly, true, searchCriteria.Folder); // check if messages downloaded properly if (messages == null || messages.Length == 0) { throw new ImapMessageDownloadException(_host, _port, _userName, searchCriteria.Folder, messageIds); } // create as S22ImapMessages return(messages.Select(m => new S22ImapMessage(m))); }
/// <summary> /// Searches a folder /// </summary> /// <param name="folder"></param> /// <param name="searchCriteria"></param> /// <returns></returns> private static IEnumerable <IEmail> SearchFolder(Folder folder, EmailSearchCriteria searchCriteria) { // create query var searchQuery = BuildSearch(searchCriteria); // if query was created, run it and return results return(!string.IsNullOrWhiteSpace(searchQuery) ? folder.Search(searchQuery, false).Select(m => new ImapXMessage(m)) : folder.Messages.Select(m => new ImapXMessage(m))); }
/// <summary> /// Searches the ac /// </summary> /// <param name="searchCriteria"></param> /// <param name="processMessages"></param> /// <returns></returns> public IEnumerable <IEmail> Search(EmailSearchCriteria searchCriteria, bool processMessages = true) { // create client var client = new ImapClient(_host, _port, _useSsl); // connect to host if (!client.Connection()) { throw new ImapException(string.Format("Failed to connect to server {0}", _host)); } // create result list var results = new List <IEmail>(); try { // try to log in if (!client.LogIn(_userName, _password)) { throw new LogInException(_host, _userName); } // search either a single folder or all folders var folders = string.IsNullOrWhiteSpace(searchCriteria.Folder) ? (IEnumerable <Folder>)client.Folders : new[] { client.Folders[searchCriteria.Folder] }; // search folders foreach (var folder in folders) { // if folder is null, it was specified by name and not found if (folder == null) { throw new FolderNotFoundException(_host, _userName, searchCriteria.Folder); } // add results of search results.AddRange(SearchFolder(folder, searchCriteria)); } // download messages if indicated if (processMessages) { results.ForEach(m => m.Download()); } } finally { // disconnect after search is done client.Disconnect(); } return(results); }
/// <summary> /// Retrieves emails based on search criteria /// </summary> /// <param name="searchCriteria"></param> private void RetrieveEmails(EmailSearchCriteria searchCriteria) { // perform search var newEmails = _emailManager.Search(searchCriteria); var newEmailList = newEmails as IList <IEmail> ?? newEmails.ToList(); // set polling time using (var repository = _marketDataRepositoryFactory.CreateRepository()) _lastPolled = repository.UpdateEmailFeedLastPolled(_emailFeedConfiguration.ID); // if any new emails were found, raise event if (newEmailList.Count > 0) { RaiseNewEmailsFound(newEmailList); } }
/// <summary> /// Searches the ac /// </summary> /// <param name="searchCriteria"></param> /// <param name="processMessages"></param> /// <returns></returns> public IEnumerable<IEmail> Search(EmailSearchCriteria searchCriteria, bool processMessages = true) { // create client var client = new ImapClient(_host, _port, _useSsl); // connect to host if (!client.Connection()) throw new ImapException(string.Format("Failed to connect to server {0}", _host)); // create result list var results = new List<IEmail>(); try { // try to log in if (!client.LogIn(_userName, _password)) throw new LogInException(_host, _userName); // search either a single folder or all folders var folders = string.IsNullOrWhiteSpace(searchCriteria.Folder) ? (IEnumerable<Folder>)client.Folders : new[] {client.Folders[searchCriteria.Folder]}; // search folders foreach (var folder in folders) { // if folder is null, it was specified by name and not found if (folder == null) throw new FolderNotFoundException(_host, _userName, searchCriteria.Folder); // add results of search results.AddRange(SearchFolder(folder, searchCriteria)); } // download messages if indicated if (processMessages) results.ForEach(m => m.Download()); } finally { // disconnect after search is done client.Disconnect(); } return results; }
/// <summary> /// Creates a <see cref="SearchCondition"/> object from a <see cref="EmailSearchCriteria"/> /// </summary> /// <param name="searchCriteria"></param> /// <returns></returns> private SearchCondition GetSearchCondition(EmailSearchCriteria searchCriteria) { var searchCondition = new SearchCondition(); if (!string.IsNullOrWhiteSpace(searchCriteria.From)) { searchCondition = searchCondition.And(SearchCondition.From(searchCriteria.From)); } if (searchCriteria.After.HasValue) { searchCondition = searchCondition.And(SearchCondition.SentBefore(searchCriteria.After.Value)); } if (searchCriteria.Since.HasValue) { searchCondition = searchCondition.And(SearchCondition.SentSince(searchCriteria.Since.Value)); } if (searchCriteria.Unread.HasValue) { searchCondition = searchCondition.And(searchCriteria.Unread.Value ? SearchCondition.Unseen() : SearchCondition.Seen()); } if (searchCriteria.SubjectKeywords != null && searchCriteria.SubjectKeywords.Any()) { searchCondition = searchCondition.And( searchCriteria.SubjectKeywords.Select(SearchCondition.Subject).Aggregate((sc1, sc2) => sc1.Or(sc2))); } if (searchCriteria.BodyKeywords != null && searchCriteria.BodyKeywords.Any()) { searchCondition = searchCondition.And( searchCriteria.BodyKeywords.Select(SearchCondition.Body).Aggregate((sc1, sc2) => sc1.Or(sc2))); } return(searchCondition); }
/// <summary> /// Checks if a message matches the search criteria /// </summary> /// <param name="searchCriteria"></param> /// <returns></returns> private static string BuildSearch(EmailSearchCriteria searchCriteria) { var clauses = new List <string>(); if (!string.IsNullOrWhiteSpace(searchCriteria.From)) { clauses.Add(string.Format("FROM \"{0}\"", searchCriteria.From)); } if (searchCriteria.After.HasValue) { clauses.Add(string.Format("BEFORE \"{0}\"", searchCriteria.After.Value)); } if (searchCriteria.Since.HasValue) { clauses.Add(string.Format("SINCE \"{0}\"", searchCriteria.Since.Value)); } if (searchCriteria.Unread.HasValue) { clauses.Add(searchCriteria.Unread.Value ? "UNSEEN" : "SEEN"); } if (searchCriteria.SubjectKeywords != null && searchCriteria.SubjectKeywords.Any()) { clauses.Add(string.Format("OR \"{0}\"", string.Join(" ", searchCriteria.SubjectKeywords.Select(k => string.Format("SUBJECT {0}", k))))); } if (searchCriteria.BodyKeywords != null && searchCriteria.BodyKeywords.Any()) { clauses.Add(string.Format("OR \"{0}\"", string.Join(" ", searchCriteria.BodyKeywords.Select(k => string.Format("BODY {0}", k))))); } return(clauses.Count > 0 ? string.Join(" ", clauses) : string.Empty); }
/// <summary> /// Creates a <see cref="SearchCondition"/> object from a <see cref="EmailSearchCriteria"/> /// </summary> /// <param name="searchCriteria"></param> /// <returns></returns> private SearchCondition GetSearchCondition(EmailSearchCriteria searchCriteria) { var searchCondition = new SearchCondition(); if (!string.IsNullOrWhiteSpace(searchCriteria.From)) searchCondition = searchCondition.And(SearchCondition.From(searchCriteria.From)); if (searchCriteria.After.HasValue) searchCondition = searchCondition.And(SearchCondition.SentBefore(searchCriteria.After.Value)); if (searchCriteria.Since.HasValue) searchCondition = searchCondition.And(SearchCondition.SentSince(searchCriteria.Since.Value)); if (searchCriteria.Unread.HasValue) searchCondition = searchCondition.And(searchCriteria.Unread.Value ? SearchCondition.Unseen() : SearchCondition.Seen()); if (searchCriteria.SubjectKeywords != null && searchCriteria.SubjectKeywords.Any()) searchCondition = searchCondition.And( searchCriteria.SubjectKeywords.Select(SearchCondition.Subject).Aggregate((sc1, sc2) => sc1.Or(sc2))); if (searchCriteria.BodyKeywords != null && searchCriteria.BodyKeywords.Any()) searchCondition = searchCondition.And( searchCriteria.BodyKeywords.Select(SearchCondition.Body).Aggregate((sc1, sc2) => sc1.Or(sc2))); return searchCondition; }
/// <summary> /// Checks if a message matches the search criteria /// </summary> /// <param name="searchCriteria"></param> /// <returns></returns> private static string BuildSearch(EmailSearchCriteria searchCriteria) { var clauses = new List<string>(); if (!string.IsNullOrWhiteSpace(searchCriteria.From)) clauses.Add(string.Format("FROM \"{0}\"", searchCriteria.From)); if (searchCriteria.After.HasValue) clauses.Add(string.Format("BEFORE \"{0}\"", searchCriteria.After.Value)); if (searchCriteria.Since.HasValue) clauses.Add(string.Format("SINCE \"{0}\"", searchCriteria.Since.Value)); if (searchCriteria.Unread.HasValue) clauses.Add(searchCriteria.Unread.Value ? "UNSEEN" : "SEEN"); if (searchCriteria.SubjectKeywords != null && searchCriteria.SubjectKeywords.Any()) clauses.Add(string.Format("OR \"{0}\"", string.Join(" ", searchCriteria.SubjectKeywords.Select(k => string.Format("SUBJECT {0}", k))))); if (searchCriteria.BodyKeywords != null && searchCriteria.BodyKeywords.Any()) clauses.Add(string.Format("OR \"{0}\"", string.Join(" ", searchCriteria.BodyKeywords.Select(k => string.Format("BODY {0}", k))))); return clauses.Count > 0 ? string.Join(" ", clauses) : string.Empty; }
/// <summary> /// Searches a folder /// </summary> /// <param name="folder"></param> /// <param name="searchCriteria"></param> /// <returns></returns> private static IEnumerable<IEmail> SearchFolder(Folder folder, EmailSearchCriteria searchCriteria) { // create query var searchQuery = BuildSearch(searchCriteria); // if query was created, run it and return results return !string.IsNullOrWhiteSpace(searchQuery) ? folder.Search(searchQuery, false).Select(m => new ImapXMessage(m)) : folder.Messages.Select(m => new ImapXMessage(m)); }