Пример #1
1
        /// <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));
        }
Пример #2
0
        /// <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)));
        }
Пример #3
0
        /// <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)));
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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);
            }
        }
Пример #6
0
        /// <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;
        }
Пример #7
0
        /// <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);
        }
Пример #8
0
        /// <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);
        }
Пример #9
0
        /// <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;
        }
Пример #10
0
        /// <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;
        }
Пример #11
0
        /// <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));
        }