public IEnumerable <MailContactData> GetContactsByContactInfo(ContactInfoType infoType, String data, bool?isPrimary) { var exp = new FullFilterContactsExp(TenantId, Username, data, infoType: infoType, isPrimary: isPrimary); var contacts = MailEngineFactory.ContactEngine.GetContactCards(exp); return(contacts.ToMailContactDataList()); }
private static void SaveFrequentlyContactedAddress(int tenant, string user, MimeMessage mimeMessage, string scheme) { var recipients = new List <MailboxAddress>(); recipients.AddRange(mimeMessage.To.Mailboxes); recipients.AddRange(mimeMessage.Cc.Mailboxes); recipients.AddRange(mimeMessage.Bcc.Mailboxes); var treatedAddresses = new List <string>(); foreach (var recipient in recipients) { var email = recipient.Address; if (treatedAddresses.Contains(email)) { continue; } var engine = new EngineFactory(tenant, user); var exp = new FullFilterContactsExp(tenant, user, searchTerm: email, infoType: ContactInfoType.Email); var contacts = engine.ContactEngine.GetContactCards(exp); if (!contacts.Any()) { var emails = engine.ContactEngine.SearchEmails(tenant, user, email, 1, scheme); if (!emails.Any()) { var contactCard = new ContactCard(0, tenant, user, recipient.Name, "", ContactType.FrequentlyContacted, new[] { email }); engine.ContactEngine.SaveContactCard(contactCard); } } treatedAddresses.Add(email); } }
/// <summary> /// Search emails in Accounts, Mail, CRM, Peaople Contact System /// </summary> /// <param name="tenant">Tenant id</param> /// <param name="userName">User id</param> /// <param name="term">Search word</param> /// <param name="maxCountPerSystem">limit result per Contact System</param> /// <param name="timeout">Timeout in milliseconds</param> /// <param name="httpContextScheme"></param> /// <returns></returns> public List <string> SearchEmails(int tenant, string userName, string term, int maxCountPerSystem, string httpContextScheme, int timeout = -1) { var equality = new ContactEqualityComparer(); var contacts = new List <string>(); var userGuid = new Guid(userName); var watch = new Stopwatch(); watch.Start(); var apiHelper = new ApiHelper(httpContextScheme); var taskList = new List <Task <List <string> > >() { Task.Run(() => { CoreContext.TenantManager.SetCurrentTenant(tenant); SecurityContext.AuthenticateMe(userGuid); var engine = new EngineFactory(tenant, userName); var exp = new FullFilterContactsExp(tenant, userName, term, infoType: ContactInfoType.Email, orderAsc: true, limit: maxCountPerSystem); var contactCards = engine.ContactEngine.GetContactCards(exp); return((from contactCard in contactCards from contactItem in contactCard.ContactItems select string.IsNullOrEmpty(contactCard.ContactInfo.ContactName) ? contactItem.Data : MailUtil.CreateFullEmail(contactCard.ContactInfo.ContactName, contactItem.Data)) .ToList()); }), Task.Run(() => { CoreContext.TenantManager.SetCurrentTenant(tenant); SecurityContext.AuthenticateMe(userGuid); var engine = new EngineFactory(tenant, userGuid.ToString()); return(engine.AccountEngine.SearchAccountEmails(term)); }), Task.Run(() => { CoreContext.TenantManager.SetCurrentTenant(tenant); SecurityContext.AuthenticateMe(userGuid); return(WebItemSecurity.IsAvailableForMe(WebItemManager.CRMProductID) ? apiHelper.SearchCrmEmails(term, maxCountPerSystem) : new List <string>()); }), Task.Run(() => { CoreContext.TenantManager.SetCurrentTenant(tenant); SecurityContext.AuthenticateMe(userGuid); return(WebItemSecurity.IsAvailableForMe(WebItemManager.PeopleProductID) ? apiHelper.SearchPeopleEmails(term, 0, maxCountPerSystem) : new List <string>()); }) }; try { var taskArray = taskList.ToArray <Task>(); Task.WaitAll(taskArray, timeout); watch.Stop(); } catch (AggregateException e) { watch.Stop(); var errorText = new StringBuilder("SearchEmails: \nThe following exceptions have been thrown by WaitAll():"); foreach (var t in e.InnerExceptions) { errorText .AppendFormat("\n-------------------------------------------------\n{0}", t); } Log.Error(errorText.ToString()); } contacts = taskList.Aggregate(contacts, (current, task) => !task.IsFaulted && task.IsCompleted && !task.IsCanceled ? current.Concat(task.Result).ToList() : current) .Distinct(equality) .ToList(); Log.DebugFormat("SearchEmails (term = '{0}'): {1} sec / {2} items", term, watch.Elapsed.TotalSeconds, contacts.Count); return(contacts); }