Пример #1
0
        public IEnumerable <MailMessage> GetFilteredMessages(int?folder,
                                                             bool?unread,
                                                             bool?attachments,
                                                             long?period_from,
                                                             long?period_to,
                                                             bool?important,
                                                             string from_address,
                                                             string to_address,
                                                             int?mailbox_id,
                                                             IEnumerable <int> tags,
                                                             string search,
                                                             int?page,
                                                             int?page_size,
                                                             string sortorder,
                                                             bool?with_calendar,
                                                             int?user_folder_id)
        {
            var primaryFolder = user_folder_id.HasValue
                ? FolderType.UserFolder
                : folder.HasValue ? (FolderType)folder.Value : FolderType.Inbox;

            var filter = new MailSearchFilterData
            {
                PrimaryFolder = primaryFolder,
                Unread        = unread,
                Attachments   = attachments,
                PeriodFrom    = period_from,
                PeriodTo      = period_to,
                Important     = important,
                FromAddress   = from_address,
                ToAddress     = to_address,
                MailboxId     = mailbox_id,
                CustomLabels  = new List <int>(tags),
                SearchText    = search,
                PageSize      = page_size.GetValueOrDefault(25),
                Sort          = Defines.ORDER_BY_DATE_SENT,
                SortOrder     = sortorder,
                WithCalendar  = with_calendar,
                UserFolderId  = user_folder_id
            };

            if (page.HasValue)
            {
                filter.Page = page.Value > 0 ? page.Value - 1 : 0;
            }

            long totalMessages;

            var messages = MailEngineFactory.MessageEngine.GetFilteredMessages(filter, out totalMessages);

            _context.SetTotalCount(totalMessages);

            return(messages);
        }
Пример #2
0
        public long GetPrevNextMessageId(int id,
                                         string direction,
                                         int?folder,
                                         bool?unread,
                                         bool?attachments,
                                         long?period_from,
                                         long?period_to,
                                         bool?important,
                                         string from_address,
                                         string to_address,
                                         int?mailbox_id,
                                         IEnumerable <int> tags,
                                         string search,
                                         int?page_size,
                                         string sortorder,
                                         bool?with_calendar,
                                         int?user_folder_id)
        {
            // inverse sort order if prev message require
            if ("prev" == direction)
            {
                sortorder = Defines.ASCENDING == sortorder ? Defines.DESCENDING : Defines.ASCENDING;
            }

            var primaryFolder = folder.HasValue ? (FolderType)folder.Value : FolderType.Inbox;

            var filter = new MailSearchFilterData
            {
                PrimaryFolder = primaryFolder,
                Unread        = unread,
                Attachments   = attachments,
                PeriodFrom    = period_from,
                PeriodTo      = period_to,
                Important     = important,
                FromAddress   = from_address,
                ToAddress     = to_address,
                MailboxId     = mailbox_id,
                CustomLabels  = new List <int>(tags),
                SearchText    = search,
                Page          = null,
                PageSize      = 2,
                Sort          = Defines.ORDER_BY_DATE_SENT,
                SortOrder     = sortorder,
                WithCalendar  = with_calendar,
                UserFolderId  = user_folder_id
            };

            var nextId = MailEngineFactory.MessageEngine.GetNextFilteredMessageId(id, filter);

            return(nextId);
        }
Пример #3
0
        public void ReassignMailMessages(int folder, string email)
        {
            var filter = new MailSearchFilterData
            {
                PrimaryFolder = (FolderType)folder
            };

            if (filter.PrimaryFolder != FolderType.Draft && filter.PrimaryFolder != FolderType.Templates)
            {
                throw new InvalidOperationException("Only folders Templates and Drafts are allowed.");
            }

            long totalMessages;

            var messages = MailEngineFactory.MessageEngine.GetFilteredMessages(filter, out totalMessages);

            _context.SetTotalCount(totalMessages);

            for (var i = 0; i < messages.Count; i++)
            {
                var message = messages[i];

                if (message.Bcc == null)
                {
                    message.Bcc = "";
                }

                var to  = message.To.Split(',').ToList <string>();
                var cc  = message.Cc.Split(',').ToList <string>();
                var bcc = message.Bcc.Split(',').ToList <string>();

                if (filter.PrimaryFolder == FolderType.Draft)
                {
                    MailEngineFactory.DraftEngine.Save(message.Id, email, to, cc, bcc, message.MimeReplyToId, message.Important, message.Subject,
                                                       message.TagIds, message.HtmlBody, message.Attachments, message.CalendarEventIcs);
                }

                if (filter.PrimaryFolder == FolderType.Templates)
                {
                    MailEngineFactory.TemplateEngine.Save(message.Id, email, to, cc, bcc, message.MimeReplyToId, message.Important, message.Subject,
                                                          message.TagIds, message.HtmlBody, message.Attachments, message.CalendarEventIcs);
                }
            }
        }
        public FilterMessagesExp(List <int> ids, int tenant, string user, MailSearchFilterData filter)
        {
            Filter = filter;
            Tenant = tenant;
            User   = user;
            Ids    = ids;

            StartIndex = filter.Page.HasValue ? 0 : (int?)null;

            if (filter.Page.HasValue &&
                filter.Page.Value > 0 &&
                filter.PageSize.HasValue &&
                filter.PageSize.Value > 0)
            {
                StartIndex = filter.Page.Value * filter.PageSize;
            }

            Limit = Filter.PageSize;
        }
Пример #5
0
        public long GetNextConversationId(int id, MailSearchFilterData filter)
        {
            using (var daoFactory = new DaoFactory())
            {
                var daoMail = daoFactory.CreateMailDao(Tenant, User);

                var mail = daoMail.GetMail(new ConcreteUserMessageExp(id, Tenant, User));

                if (mail == null)
                {
                    return(0);
                }

                filter.FromDate    = mail.ChainDate;
                filter.FromMessage = id;
                filter.PageSize    = 1;

                bool hasMore;
                var  messages = GetFilteredConversations(daoFactory, filter, out hasMore);
                return(messages.Any() ? messages.First().Id : 0);
            }
        }
Пример #6
0
        public FilterMessagesExp(List <int> ids, int tenant, string user, MailSearchFilterData filter)
        {
            Filter = filter;
            Tenant = tenant;
            User   = user;
            Ids    = ids;

            StartIndex = filter.Page.HasValue ? 0 : (int?)null;

            if (filter.Page.HasValue &&
                filter.Page.Value > 0 &&
                filter.PageSize.HasValue &&
                filter.PageSize.Value > 0)
            {
                StartIndex = filter.Page.Value * filter.PageSize;
            }

            Limit = Filter.PageSize;

            OrderAsc = string.IsNullOrEmpty(Filter.SortOrder)
                    ? (bool?)null
                    : Filter.SortOrder == Defines.ASCENDING;
        }
        public static bool TryGetFullTextSearchIds(MailSearchFilterData filter, string user, out List <int> ids, out long total, DateTime?dateSend = null)
        {
            ids = new List <int>();

            if (!FactoryIndexer <MailWrapper> .Support)
            {
                total = 0;
                return(false);
            }

            if (filter.Page.HasValue && filter.Page.Value < 0)
            {
                total = 0;
                return(true);
            }

            var userId = new Guid(user);

            Selector <MailWrapper> selector = null;

            if (!string.IsNullOrEmpty(filter.SearchText))
            {
                selector = new Selector <MailWrapper>().MatchAll(filter.SearchText);
            }

            if (!string.IsNullOrEmpty(filter.FromAddress))
            {
                Selector <MailWrapper> tempSelector;

                if (filter.PrimaryFolder == FolderType.Sent || filter.PrimaryFolder == FolderType.Draft)
                {
                    tempSelector = new Selector <MailWrapper>().Match(s => s.ToText, filter.FromAddress);
                }
                else
                {
                    tempSelector = new Selector <MailWrapper>().Match(s => s.FromText, filter.FromAddress);
                }

                if (selector != null)
                {
                    selector &= tempSelector;
                }
                else
                {
                    selector = tempSelector;
                }
            }

            if (!string.IsNullOrEmpty(filter.ToAddress))
            {
                Selector <MailWrapper> tempSelector;

                if (filter.PrimaryFolder == FolderType.Sent || filter.PrimaryFolder == FolderType.Draft)
                {
                    tempSelector = new Selector <MailWrapper>().Match(s => s.FromText, filter.ToAddress);
                }
                else
                {
                    tempSelector = new Selector <MailWrapper>().Match(s => s.ToText, filter.ToAddress);
                }

                if (selector != null)
                {
                    selector &= tempSelector;
                }
                else
                {
                    selector = tempSelector;
                }
            }

            if (selector == null)
            {
                selector = new Selector <MailWrapper>();
            }

            selector.Where(r => r.Folder, (int)filter.PrimaryFolder);

            if (filter.MailboxId.HasValue)
            {
                selector.Where(s => s.MailboxId, filter.MailboxId.Value);
            }

            if (filter.Unread.HasValue)
            {
                selector.Where(s => s.Unread, filter.Unread.Value);
            }

            if (filter.Important.HasValue)
            {
                selector.Where(s => s.Importance, filter.Important.Value);
            }

            if (filter.Attachments.HasValue)
            {
                selector.Where(s => s.HasAttachments, filter.Attachments.Value);
            }

            if (filter.PrimaryFolder == FolderType.UserFolder && filter.UserFolderId.HasValue)
            {
                selector.InAll(s => s.UserFolders.Select(f => f.Id), new[] { filter.UserFolderId.Value });
            }

            if (filter.WithCalendar.HasValue)
            {
                selector.Where(m => m.WithCalendar, filter.WithCalendar.Value);
            }

            if (dateSend.HasValue)
            {
                if (filter.SortOrder == Defines.ASCENDING)
                {
                    selector.Ge(r => r.DateSent, dateSend.Value);
                }
                else
                {
                    selector.Le(r => r.DateSent, dateSend.Value);
                }
            }

            if (filter.CustomLabels != null && filter.CustomLabels.Any())
            {
                selector.InAll(r => r.Tags.Select(t => t.Id), filter.CustomLabels.ToArray());
            }

            if (filter.PeriodFrom.HasValue && filter.PeriodTo.HasValue)
            {
                var fromTs = TimeSpan.FromMilliseconds(filter.PeriodFrom.Value);
                var from   = Defines.BaseJsDateTime.Add(fromTs);

                var toTs = TimeSpan.FromMilliseconds(filter.PeriodTo.Value);
                var to   = Defines.BaseJsDateTime.Add(toTs);

                selector.Ge(s => s.DateSent, from);
                selector.Le(s => s.DateSent, to);
            }

            var pageSize = filter.PageSize.GetValueOrDefault(25);

            if (filter.Page.HasValue && filter.Page.Value > 0)
            {
                selector.Limit(filter.Page.Value * pageSize, pageSize);
            }
            else if (filter.PageSize.HasValue)
            {
                selector.Limit(0, pageSize);
            }

            selector.Where(r => r.UserId, userId)
            .Sort(r => r.DateSent, filter.SortOrder == Defines.ASCENDING);

            return(FactoryIndexer <MailWrapper> .TrySelectIds(s => selector, out ids, out total));
        }
Пример #8
0
 public FilterChainMessagesExp(MailSearchFilterData filter, int tenant, string user, List <int> ids = null)
     : base(ids ?? new List <int>(), tenant, user, filter)
 {
 }
Пример #9
0
 public FilterNextMessageExp(DateTime dateSent, int tenant, string user, MailSearchFilterData filter)
     : base(null, tenant, user, filter)
 {
     DateSent = dateSent;
 }
Пример #10
0
        private List <MailMessageData> GetFilteredConversations(IDaoFactory daoFactory, MailSearchFilterData filter, out bool hasMore)
        {
            var conversations = new List <MailMessageData>();
            var skipFlag      = false;
            var chunkIndex    = 0;

            if (filter.FromDate.HasValue && filter.FromMessage.HasValue && filter.FromMessage.Value > 0)
            {
                skipFlag = true;
            }

            var prevFlag   = filter.PrevFlag.GetValueOrDefault(false);
            var tenantInfo = CoreContext.TenantManager.GetTenant(Tenant);
            var utcNow     = DateTime.UtcNow;
            var pageSize   = filter.PageSize.GetValueOrDefault(25);

            var daoMailInfo = daoFactory.CreateMailInfoDao(Tenant, User);

            while (conversations.Count < pageSize + 1)
            {
                filter.PageSize = CHUNK_SIZE * pageSize;

                IMessagesExp exp = null;

                if (!filter.IsDefault() && FactoryIndexer <MailWrapper> .Support && FactoryIndexer.CheckState(false))
                {
                    filter.Page = chunkIndex * CHUNK_SIZE * pageSize; // Elastic Limit from {index of last message} to {count of messages}

                    List <MailWrapper> mailWrappers;
                    if (FilterChainMessagesExp.TryGetFullTextSearchChains(filter, User, out mailWrappers))
                    {
                        if (!mailWrappers.Any())
                        {
                            break;
                        }

                        var ids = mailWrappers.Select(c => c.Id).ToList();

                        var query = SimpleMessagesExp.CreateBuilder(Tenant, User)
                                    .SetMessageIds(ids)
                                    .SetOrderBy(filter.Sort);

                        if (prevFlag)
                        {
                            query.SetOrderAsc(!(filter.SortOrder == Defines.ASCENDING));
                        }
                        else
                        {
                            query.SetOrderAsc(filter.SortOrder == Defines.ASCENDING);
                        }

                        exp = query
                              .Build();
                    }
                }
                else
                {
                    filter.Page = chunkIndex; // MySQL Limit from {page by size} to {size}

                    exp = new FilterChainMessagesExp(filter, Tenant, User);
                }

                chunkIndex++;

                var listMessages = daoMailInfo.GetMailInfoList(exp, true)
                                   .ConvertAll(m => MessageEngine.ToMailMessage(m, tenantInfo, utcNow));

                if (0 == listMessages.Count)
                {
                    break;
                }

                if (skipFlag && filter.FromMessage.HasValue)
                {
                    var messageData = listMessages.FirstOrDefault(m => m.Id == filter.FromMessage.Value);

                    if (messageData != null)
                    {
                        // Skip chain messages by FromMessage.
                        listMessages =
                            listMessages.Where(
                                m => !(m.ChainId.Equals(messageData.ChainId) && m.MailboxId == messageData.MailboxId))
                            .ToList();
                    }

                    skipFlag = false;
                }

                foreach (var messageData in listMessages)
                {
                    var existingChainIndex =
                        conversations.FindIndex(
                            c => c.ChainId == messageData.ChainId && c.MailboxId == messageData.MailboxId);

                    if (existingChainIndex > -1)
                    {
                        if (conversations[existingChainIndex].Date < messageData.Date)
                        {
                            conversations[existingChainIndex] = messageData;
                        }
                    }
                    else
                    {
                        conversations.Add(messageData);
                    }
                }

                if (conversations.Count > pageSize)
                {
                    break;
                }
            }

            hasMore = conversations.Count > pageSize;

            if (hasMore)
            {
                conversations = conversations.Take(pageSize).ToList();
            }

            if (prevFlag)
            {
                conversations.Reverse();
            }

            return(conversations);
        }
Пример #11
0
        public List <MailMessageData> GetConversations(MailSearchFilterData filterData, out bool hasMore)
        {
            if (filterData == null)
            {
                throw new ArgumentNullException("filterData");
            }

            var filter = (MailSearchFilterData)filterData.Clone();

            if (filter.UserFolderId.HasValue && Factory.UserFolderEngine.Get((uint)filter.UserFolderId.Value) == null)
            {
                throw new ArgumentException("Folder not found");
            }

            using (var daoFactory = new DaoFactory())
            {
                var filteredConversations = GetFilteredConversations(daoFactory, filter, out hasMore);

                if (!filteredConversations.Any())
                {
                    return(filteredConversations);
                }

                var chainIds = new List <string>();
                filteredConversations.ForEach(x => chainIds.Add(x.ChainId));

                var daoChain = daoFactory.CreateChainDao(Tenant, User);

                var exp = SimpleConversationsExp.CreateBuilder(Tenant, User)
                          .SetChainIds(chainIds)
                          .SetFoldersIds(
                    filter.PrimaryFolder == FolderType.Inbox ||
                    filter.PrimaryFolder == FolderType.Sent
                            ? new List <int> {
                    (int)FolderType.Inbox, (int)FolderType.Sent
                }
                            : new List <int> {
                    (int)filter.PrimaryFolder
                })
                          .Build();

                var extendedInfo = daoChain.GetChains(exp);

                foreach (var chain in filteredConversations)
                {
                    var chainMessages = extendedInfo.FindAll(x => x.MailboxId == chain.MailboxId && x.Id == chain.ChainId);
                    if (!chainMessages.Any())
                    {
                        continue;
                    }
                    chain.IsNew          = chainMessages.Any(x => x.Unread);
                    chain.HasAttachments = chainMessages.Any(x => x.HasAttachments);
                    chain.Important      = chainMessages.Any(x => x.Importance);
                    chain.ChainLength    = chainMessages.Sum(x => x.Length);
                    var firstOrDefault = chainMessages.FirstOrDefault(x => !string.IsNullOrEmpty(x.Tags));
                    chain.LabelsString = firstOrDefault != null ? firstOrDefault.Tags : "";
                }

                return(filteredConversations);
            }
        }
Пример #12
0
        public IEnumerable <MailMessageData> GetFilteredConversations(int?folder,
                                                                      bool?unread,
                                                                      bool?attachments,
                                                                      long?period_from,
                                                                      long?period_to,
                                                                      bool?important,
                                                                      string from_address,
                                                                      string to_address,
                                                                      int?mailbox_id,
                                                                      IEnumerable <int> tags,
                                                                      string search,
                                                                      int?page_size,
                                                                      string sortorder,
                                                                      ApiDateTime from_date,
                                                                      int?from_message,
                                                                      bool?prev_flag,
                                                                      bool?with_calendar,
                                                                      int?user_folder_id)
        {
            var primaryFolder = user_folder_id.HasValue
                ? FolderType.UserFolder
                : folder.HasValue ? (FolderType)folder.Value : FolderType.Inbox;

            var filter = new MailSearchFilterData
            {
                PrimaryFolder = primaryFolder,
                Unread        = unread,
                Attachments   = attachments,
                PeriodFrom    = period_from,
                PeriodTo      = period_to,
                Important     = important,
                FromAddress   = from_address,
                ToAddress     = to_address,
                MailboxId     = mailbox_id,
                CustomLabels  = new List <int>(tags),
                SearchText    = search,
                PageSize      = page_size.GetValueOrDefault(25),
                Sort          = Defines.ORDER_BY_DATE_CHAIN,
                SortOrder     = sortorder,
                WithCalendar  = with_calendar,
                UserFolderId  = user_folder_id,
                FromDate      = from_date,
                FromMessage   = from_message.GetValueOrDefault(0),
                PrevFlag      = prev_flag.GetValueOrDefault(false)
            };

            bool hasMore;

            var conversations = MailEngineFactory.ChainEngine.GetConversations(filter, out hasMore);

            if (hasMore)
            {
                _context.SetTotalCount(page_size.GetValueOrDefault(25) + 1);
            }
            else
            {
                _context.SetTotalCount(conversations.Count);
            }

            return(conversations);
        }