Пример #1
0
        /// <summary>
        /// When folder removed and created again, its messages UIs counter clears, and starts from 0.
        /// Due to imap protocol realization, search method with "UId N:*" query allways returns last message index in folder.
        /// Theafore, when last message index UId is less then <see cref="CurrentMessageUidInFolder"/> value,
        /// we assume that folder was recreated.
        /// </summary>
        /// <param name="messageIndexCollection"><see cref="MessageIndexCollection"/> instance.</param>
        /// <returns><c>True</c> if folder was recreated in mailbox, <c>false</c> otherwise.</returns>
        private bool IsFolderWasRecreated(MessageIndexCollection messageIndexCollection)
        {
            List <long> messageIndexList = messageIndexCollection.Cast <long>().ToList();

            messageIndexList.Sort();
            return(messageIndexList.Count > 0 && messageIndexList.First() < long.Parse(CurrentMessageUidInFolder));
        }
        public void MoveMessageToFolder(string folderName, string messageTitle, string destenationFolder)
        {
            _client.SelectFolder(folderName);
            MessageIndexCollection uids = _client.Search(true, string.Format("SUBJECT {0}", messageTitle), null);

            if (uids.Count > 0)
            {
                _client.MoveMessages(uids.ToString(), true, destenationFolder);
            }
        }
        private void SyncMailMessagesInFolder(string crmFolder, string rawName, Func <MailMessage, Envelope, bool, string, bool> syncAction)
        {
            _log.Info(string.Format("------ [{0}] | Mail synchronization in folder {1} STARTED. ------", _currentMailboxName, rawName));
            bool getCurrentMailboxFoldersResult;

            _currentFolder = GetsCurrentMailboxFoldersCorrespondence(rawName, CurrentMailboxSettingsId.ToString(),
                                                                     out getCurrentMailboxFoldersResult);
            if (!getCurrentMailboxFoldersResult)
            {
                throw new ImapException(LocCanNotReadFolder.ToString());
            }
            MessageIndexCollection msgIndexes = Strategy.GetUnsyncedMsgIndexes(_client, rawName);

            _log.Info(string.Format("[{0}] - [{1}] Sync query {2} - found {3} unsynchronized messages headers for ActivityFolderId {4}",
                                    _currentMailboxName, rawName, Strategy.GetUnsyncMsgSearchQuery(), msgIndexes.Count, _currentFolder.ActivityFolderId));
            if (msgIndexes.Count > 0)
            {
                try {
                    var     remoteChangesCount = 0;
                    decimal totalSize          = 0m;
                    var     msgEnvelopes       = _client.DownloadEnvelopes(msgIndexes.ToString(), true);
                    _log.Info(string.Format("[{0}] - [{1}] | Load {2} unsynchronized messages", _currentMailboxName, rawName, msgEnvelopes.Count));
                    foreach (Envelope envelope in msgEnvelopes)
                    {
                        totalSize = SyncEnvelope(envelope, syncAction, crmFolder, totalSize);
                        remoteChangesCount++;
                    }
                    _log.Info(string.Format("[{0}] - [{1}] | Processed {2} messages", _currentMailboxName, rawName, msgEnvelopes.Count));
                    _remoteChangesCount = remoteChangesCount;
                } catch (Exception ex) {
                    _log.Error(string.Format("[{0}] - [{1}] | Error on folder sync: {2}", _currentMailboxName, rawName, ex.ToString()));
                }
            }
            List <long> messageIndexList = GetMsgIndexesList(msgIndexes);

            messageIndexList.Sort();
            if (_currentFolder != null && messageIndexList.Count > 0)
            {
                _currentFolder.UId = messageIndexList.Last().ToString();
                _log.Error($"[{_currentMailboxName}] - [{_currentFolder}] | Update folder UId '{_currentFolder.UId}' start." +
                           $"ActivityFolderId = '{_currentFolder.ActivityFolderId}'");
                SaveCurrentFolder(_currentFolder);
                _log.Error($"[{_currentMailboxName}] - [{_currentFolder}] | Update folder UId '{_currentFolder.UId}' end." +
                           $"ActivityFolderId = '{_currentFolder.ActivityFolderId}'");
            }
            _log.Info(string.Format("------ [{0}] | Mail synchronization in folder {1} COMPLETED. ------", _currentMailboxName, rawName));
        }
Пример #4
0
        /// <summary>
        /// Loads not synchronized messages indexes form selected folder.
        /// Selected folder must be specified in <paramref name="client"/>, using <see cref="ImapClient.SelectFolderForSyncronization"/> method.
        /// Due to imap protocol realization, search method with "UId N:*" query allways returns last message index in folder.
        /// Message index with <see cref="CurrentMessageUidInFolder"/> UId will be skipped.
        /// If current folder was removed and created again in mailbox, synchronization strategy will use new folder query string.
        /// </summary>
        /// <param name="client"><see cref="Imap"/> instance.</param>
        /// <returns><see cref="MessageIndexCollection"/> instance.</returns>
        private MessageIndexCollection GetNotSyncedMessageIndexes(Imap client)
        {
            MessageIndexCollection messageIndexCollection = GetUnsyncMsgIndexCollection(client);

            if (IsFolderWasRecreated(messageIndexCollection))
            {
                CurrentMessageUidInFolder = "0";
                messageIndexCollection    = GetUnsyncMsgIndexCollection(client);
            }
            List <long> messageIndexList = messageIndexCollection.Cast <long>().ToList();

            messageIndexList.Sort();
            if (messageIndexList.Count > 0 && messageIndexList.First().ToString() == CurrentMessageUidInFolder)
            {
                messageIndexCollection.RemoveAt(0);
            }
            return(messageIndexCollection);
        }
 /// <summary>
 /// Gets list mailbox indexes from <paramref name="msgIndexes"/>.
 /// </summary>
 /// <param name="msgIndexes"><see cref="MessageIndexCollection"/> instance.</param>
 /// <returns>List mailbox indexes.</returns>
 protected virtual List <long> GetMsgIndexesList(MessageIndexCollection msgIndexes)
 {
     return(msgIndexes.Cast <long>().ToList());
 }