Пример #1
0
        /// <summary>
        ///      SentSince = Date  = DateFrom
        ///      SentBefore = Date + 1 = DateTO
        /// </summary>
        /// <returns></returns>
        public SearchCondition SetSearchConditions()
        {
            SearchCondition result = SearchCondition.All();

            if (this.SearchByDateRange)
            {
                result = result.And(SearchCondition.SentBefore(new DateTime(DateTo.Year, DateTo.Month, DateTo.Day).AddDays(1))
                                    .And(SearchCondition.SentSince(new DateTime(DateFrom.Year, DateFrom.Month, DateFrom.Day))));
            }
            if (this.Unread)
            {
                result = result.And(SearchCondition.Unseen());
            }
            if (!string.IsNullOrEmpty(this.Sender))
            {
                result = result.And(SearchCondition.From(this.Sender));
            }
            if (!string.IsNullOrEmpty(this.Subject))
            {
                result = result.And(SearchCondition.Subject(this.Subject));
            }



            return(result);
        }
Пример #2
0
        public static List <MailMessage> SearchMessages(MailObj mObj, string searchFrom, string searchSubject, string searchText, string searchKeyword)
        {
            using (ImapClient Client = new ImapClient(mObj.ServerAddress, mObj.Port, mObj.MailAddress, mObj.MailAddressPassword, AuthMethod.Login, true))
            {
                List <SearchCondition> scList = new List <SearchCondition>();

                if (!string.IsNullOrWhiteSpace(searchFrom))
                {
                    scList.Add(SearchCondition.From(searchFrom));
                }
                if (!string.IsNullOrWhiteSpace(searchSubject))
                {
                    scList.Add(SearchCondition.Subject(searchSubject));
                }
                if (!string.IsNullOrWhiteSpace(searchText))
                {
                    scList.Add(SearchCondition.Text(searchText));
                }
                if (!string.IsNullOrWhiteSpace(searchKeyword))
                {
                    scList.Add(SearchCondition.Keyword(searchKeyword));
                }


                if (scList.Count > 0)
                {
                    SearchCondition allConditions = scList[0];
                    for (int i = 1; i < scList.Count; i++)
                    {
                        allConditions.And(scList[i]);
                    }

                    IEnumerable <uint> uids = Client.Search(allConditions);
                    return(Client.GetMessages(uids).ToList());
                }

                return(new List <MailMessage>());
            }
        }
Пример #3
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);
        }
Пример #4
0
        public void InitCredential()
        {
            _searchCondition = new SearchCondition();

            SearchCondition condition = null;

            if (!string.IsNullOrEmpty(Senders))
            {
                List <string> mSenders = Senders.Split(';').ToList();
                condition = SearchCondition.From(mSenders[0]);
                for (int i = 1; i < mSenders.Count; i++)
                {
                    string sender = mSenders[i];
                    if (string.IsNullOrEmpty(sender))
                    {
                        continue;
                    }

                    condition = condition.Or(SearchCondition.From(sender));
                }
            }

            SearchCondition conditionSubject = null;

            if (!string.IsNullOrEmpty(Subjects))
            {
                List <string> mSubjects = Subjects.Split(';').ToList();
                conditionSubject = SearchCondition.Subject(mSubjects[0]);
                for (int i = 1; i < mSubjects.Count; i++)
                {
                    string sub = mSubjects[i];
                    if (string.IsNullOrEmpty(sub))
                    {
                        continue;
                    }

                    conditionSubject = conditionSubject.Or(SearchCondition.Subject(sub));
                }
            }

            _searchCondition = SearchCondition.Unseen();

            if (condition != null)
            {
                _searchCondition = _searchCondition.And(condition);
            }

            if (conditionSubject != null)
            {
                _searchCondition = _searchCondition.And(conditionSubject);
            }

            try
            {
                if (_email != null)
                {
                    _email.Logout();
                }
            }
            catch
            {
            }

            try
            {
                if (!string.IsNullOrEmpty(Credential.UserName) && !string.IsNullOrEmpty(Credential.Host))
                {
                    _email = new ImapClient(Credential.Host, Credential.Port, Credential.UserName, Credential.Password, AuthMethod.Login, Credential.Ssl);
                }
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
                throw ex;
            }
        }
Пример #5
0
 public override void Initialise(List <MailFolder> folderList)
 {
     Status   = MessageProcessorStatus.Initialising;
     _folders = new List <ImapFolder>();
     try
     {
         _imapClient = new ImapClient(_server, _useSsl ? 993 : 143, _username, _password, AuthMethod.Login, _useSsl,
                                      delegate { return(true); });
         Logger.Debug("Logged into " + _server + " as " + _username);
         var folders = _imapClient.ListMailboxes();
         if (_startDate != null || _endDate != null)
         {
             // ok we need to do a search
             if (_startDate != null)
             {
                 _searchCondition = SearchCondition.Since((DateTime)_startDate);
             }
             if (_endDate != null)
             {
                 _searchCondition = _searchCondition == null
                     ? SearchCondition.Before((DateTime)_endDate)
                     : _searchCondition.And(SearchCondition.Before((DateTime)_endDate));
             }
             Logger.Debug("Only getting messages " + _searchCondition);
         }
         // Are we limiting the folder list?
         if (_limitFolderList != null)
         {
             var newFolders = new List <String>();
             foreach (var mailbox in _limitFolderList)
             {
                 var mailboxMatch = mailbox.ToLower().Replace('\\', '/');;
                 newFolders.AddRange(folders.Where(folder => folder.ToLower().Equals(mailboxMatch)));
             }
             folders = newFolders;
         }
         foreach (var folderPath in folders)
         {
             bool isPublicFolder    = false;
             var  destinationFolder = FolderMapping.ApplyMappings(folderPath, Provider);
             if (IncludePublicFolders && (String.Equals(destinationFolder, PublicFolderRoot) || destinationFolder.StartsWith(PublicFolderRoot + @"\")))
             {
                 isPublicFolder = true;
                 var start = PublicFolderRoot.Length + (destinationFolder.StartsWith(PublicFolderRoot + @"\") ? 1 : 0);
                 destinationFolder = destinationFolder.Substring(start, destinationFolder.Length - start);
             }
             if (!String.IsNullOrWhiteSpace(destinationFolder))
             {
                 try
                 {
                     var folder = _imapClient.GetMailboxInfo(folderPath);
                     if (folder.Messages == 0)
                     {
                         Logger.Debug("Skipping folder " + folderPath + ", no messages at all.");
                         continue;
                     }
                     int messageCount = 0;
                     if (_searchCondition != null)
                     {
                         var uids = _imapClient.Search(_searchCondition, folderPath);
                         messageCount = uids.Count();
                     }
                     else
                     {
                         messageCount = folder.Messages;
                     }
                     // Add it to our main folder list
                     _mainFolderList.Add(new MailFolder()
                     {
                         DestinationFolder = destinationFolder,
                         MessageCount      = FailedMessageCount,
                         SourceFolder      = folderPath
                     });
                     if (messageCount == 0)
                     {
                         Logger.Debug("Skipping folder " + folderPath + ", no messages within criteria.");
                         continue;
                     }
                     _folders.Add(new ImapFolder()
                     {
                         MappedDestination = destinationFolder,
                         FolderPath        = folder,
                         IsPublicFolder    = isPublicFolder
                     });
                     TotalMessages += !_testOnly ? messageCount : (messageCount > 20 ? 20 : messageCount);
                     Logger.Debug("Will process " + folderPath + " => " + (isPublicFolder ? "[PUBLIC FOLDER]/" : "") + destinationFolder + ", " + messageCount + " messages, " + TotalMessages + " messages total so far.");
                 }
                 catch (Exception ex)
                 {
                     Logger.Error("Failed to get Mailbox " + folderPath + ", skipping.", ex);
                 }
             }
             else
             {
                 Logger.Info("Ignoring folder " + folderPath + ", no destination specified.");
             }
         }
     }
     catch (InvalidCredentialsException ex)
     {
         Logger.Error("Imap Runner for " + _username + " [********] to " + _server + " failed : " + ex.Message, ex);
         throw new MessageProcessorException("Imap Runner for " + _username + " [********] to " + _server + " failed : " + ex.Message)
               {
                   Status = MessageProcessorStatus.SourceAuthFailure
               };
     }
     catch (SocketException ex)
     {
         Logger.Error("Imap Runner for " + _username + " [********] to " + _server + " failed : " + ex.Message, ex);
         throw new MessageProcessorException("Imap Runner for " + _username + " [********] to " + _server + " failed : " + ex.Message)
               {
                   Status = MessageProcessorStatus.ConnectionError
               };
     }
     NextReader.Initialise(_mainFolderList);
     Status = MessageProcessorStatus.Initialised;
     Logger.Info("ExchangeExporter Initialised");
 }