protected override void Do() { try { SetProgress((int?)MailOperationRemoveDomainProgress.Init, "Setup tenant and user"); CoreContext.TenantManager.SetCurrentTenant(CurrentTenant); try { SecurityContext.AuthenticateMe(CurrentUser); } catch { // User was removed SecurityContext.AuthenticateMe(ASC.Core.Configuration.Constants.CoreSystem); } SetProgress((int?)MailOperationRemoveDomainProgress.RemoveFromDb, "Remove domain from Db"); var tenant = CurrentTenant.TenantId; var mailboxes = new List <MailBoxData>(); var engine = new EngineFactory(tenant); using (var db = new DbManager(Defines.CONNECTION_STRING_NAME, Defines.RemoveDomainTimeout)) { var daoFactory = new DaoFactory(db); using (var tx = daoFactory.DbManager.BeginTransaction(IsolationLevel.ReadUncommitted)) { var serverGroupDao = daoFactory.CreateServerGroupDao(tenant); var serverAddressDao = daoFactory.CreateServerAddressDao(tenant); var groups = serverGroupDao.GetList(_domain.Id); foreach (var serverGroup in groups) { serverAddressDao.DeleteAddressesFromMailGroup(serverGroup.Id); serverAddressDao.Delete(serverGroup.AddressId); serverGroupDao.Delete(serverGroup.Id); } var serverAddresses = serverAddressDao.GetDomainAddresses(_domain.Id); var serverMailboxAddresses = serverAddresses.Where(a => a.MailboxId > -1 && !a.IsAlias); foreach (var serverMailboxAddress in serverMailboxAddresses) { var mailbox = engine.MailboxEngine.GetMailboxData( new ConcreteTenantServerMailboxExp(serverMailboxAddress.MailboxId, tenant, false)); if (mailbox == null) { continue; } mailboxes.Add(mailbox); engine.MailboxEngine.RemoveMailBox(daoFactory, mailbox, false); } serverAddressDao.Delete(serverAddresses.Select(a => a.Id).ToList()); var serverDomainDao = daoFactory.CreateServerDomainDao(tenant); serverDomainDao.Delete(_domain.Id); var serverDao = daoFactory.CreateServerDao(); var server = serverDao.Get(tenant); var serverEngine = new Server.Core.ServerEngine(server.Id, server.ConnectionString); serverEngine.RemoveDomain(_domain.Name); tx.Commit(); } } SetProgress((int?)MailOperationRemoveDomainProgress.ClearCache, "Clear accounts cache"); CacheEngine.ClearAll(); SetProgress((int?)MailOperationRemoveDomainProgress.RemoveIndex, "Remove Elastic Search index by messages"); foreach (var mailbox in mailboxes) { engine.IndexEngine.Remove(mailbox); } } catch (Exception e) { Logger.Error("Mail operation error -> Remove mailbox: {0}", e); Error = "InternalServerError"; } }