public void UpdateDomain(MailDomain domain)
		{
			try
			{
				// load original domain
				MailDomain origDomain = GetDomain(domain.Name);

				svcDomainAdmin domains = new svcDomainAdmin();
				PrepareProxy(domains);

				GenericResult result = domains.UpdateDomain(AdminUsername, AdminPassword,
					domain.Name,
					origDomain.ServerIP,
					domain.ImapPort,
					domain.PopPort,
					domain.SmtpPort,
					domain.MaxAliases,
					domain.MaxDomainSizeInMB,
					domain.MaxDomainUsers,
					domain.MaxMailboxSizeInMB,
					domain.MaxMessageSize,
					domain.MaxRecipients,
					domain.MaxDomainAliases,
					domain.MaxLists,
					domain.ShowDomainAliasMenu, // ShowDomainAliasMenu
					domain.ShowContentFilteringMenu, // ShowContentFilteringMenu
					domain.ShowSpamMenu, // ShowSpamMenu
					domain.ShowsStatsMenu, // this parameter is no longer used in SM5
					origDomain.RequireSmtpAuthentication,
					domain.ShowListMenu, // Showlistmenu
					origDomain.ListCommandAddress);

				if (!result.Result)
					throw new Exception(result.Message);

				// update catch-all group
				UpdateDomainCatchAllGroup(domain.Name, domain.CatchAllAccount);


				// update additional settings
				result = domains.SetRequestedDomainSettings(AdminUsername, AdminPassword, domain.Name,
					new string[] {
                        "isenabled=" + domain.Enabled,
                        "catchall=" + (!String.IsNullOrEmpty(domain.CatchAllAccount) ? SYSTEM_CATCH_ALL : ""),
                        "altsmtpport=" + domain.SmtpPortAlt,
                        "ldapport=" + domain.LdapPort,
                        "sharedcalendar=" + domain.SharedCalendars,
                        "sharedcontact=" + domain.SharedContacts,
                        "sharedfolder=" + domain.SharedFolders,
                        "sharednotes=" + domain.SharedNotes,
                        "sharedtasks=" + domain.SharedTasks,
                        "sharedgal=" + domain.IsGlobalAddressList,
                        "enablecatchalls=" + domain[MailDomain.SMARTERMAIL5_CATCHALLS_ENABLED],
                        "bypassforwardblacklist=" + domain.BypassForwardBlackList,
						"showdomainreports=" + domain[MailDomain.SMARTERMAIL5_SHOW_DOMAIN_REPORTS],
						"maxmessagesperhour=" + domain[MailDomain.SMARTERMAIL5_MESSAGES_PER_HOUR],
					    "maxmessagesperhourenabled=" + domain[MailDomain.SMARTERMAIL5_MESSAGES_PER_HOUR_ENABLED],
					    "maxsmtpoutbandwidthperhour=" + domain[MailDomain.SMARTERMAIL5_BANDWIDTH_PER_HOUR],
					    "maxsmtpoutbandwidthperhourenabled=" + domain[MailDomain.SMARTERMAIL5_BANDWIDTH_PER_HOUR_ENABLED],
                        "enablepopretrieval=" + domain[MailDomain.SMARTERMAIL5_POP_RETREIVAL_ENABLED],
						"maxpopretrievalaccounts=" + domain[MailDomain.SMARTERMAIL5_POP_RETREIVAL_ACCOUNTS],
						"maxbouncesreceivedperhour=" + domain[MailDomain.SMARTERMAIL5_BOUNCES_PER_HOUR],
						"maxbouncesreceivedperhourenabled=" + domain[MailDomain.SMARTERMAIL5_BOUNCES_PER_HOUR_ENABLED],
                        "enableimapretrieval=" + domain[MailDomain.SMARTERMAIL6_IMAP_RETREIVAL_ENABLED],
                        "enablemailsigning=" + domain[MailDomain.SMARTERMAIL6_MAIL_SIGNING_ENABLED],
                        "enableemailreports=" + domain[MailDomain.SMARTERMAIL6_EMAIL_REPORTS_ENABLED],
                        "syncml=" + domain[MailDomain.SMARTERMAIL6_SYNCML_ENABLED]
				});

				/*
                                          
				string[] requestedSettings = new string[]
					{
						"maxmessagesperhour",
						"maxmessagesperhourenabled",
						"maxsmtpoutbandwidthperhour",
						"maxsmtpoutbandwidthperhourenabled"
					};

				SettingsRequestResult addResult =
					domains.GetRequestedDomainSettings(AdminUsername, AdminPassword, domain.Name, requestedSettings);
				*/

				if (!result.Result)
					throw new Exception(result.Message);
			}
			catch (Exception ex)
			{
				throw new Exception("Could not update mail domain", ex);
			}
		}
		public void DeleteDomain(string domainName)
		{
			try
			{
				svcDomainAdmin domains = new svcDomainAdmin();
				PrepareProxy(domains);

				GenericResult result = domains.DeleteDomain(AdminUsername, AdminPassword,
					domainName,
					true // delete files
					);

				if (!result.Result)
					throw new Exception(result.Message);
			}
			catch (Exception ex)
			{
				throw new Exception("Could not delete mail domain", ex);
			}
		}
		public void CreateDomain(MailDomain domain)
		{
			try
			{

				svcDomainAdmin domains = new svcDomainAdmin();
				PrepareProxy(domains);

				DomainSettingsResult defaultDomainSettings = domains.GetDomainDefaults(AdminUsername, AdminPassword);

				SettingsRequestResult defaultRequestedSettings =
					domains.GetRequestedDomainDefaults(AdminUsername, AdminPassword, new string[]
                                                                                         {
                                                                                             "defaultaltsmtpport",
                                                                                             "defaultaltsmtpportenabled",
                                                                                             "defaultautoresponderrestriction",
                                                                                             "defaultbypassgreylisting",
                                                                                             "defaultenablecatchalls",
                                                                                             "defaultenabledomainkeys",
                                                                                             "defaultenableemailreports",
                                                                                             "defaultenablepopretrieval",
                                                                                             "defaultmaxmessagesperhour",
                                                                                             "defaultmaxmessagesperhourenabled",
                                                                                             "defaultmaxsmtpoutbandwidthperhour",
                                                                                             "defaultmaxsmtpoutbandwidthperhourenabled",
                                                                                             "defaultmaxbouncesreceivedperhour",
                                                                                             "defaultmaxbouncesreceivedperhourenabled",
                                                                                             "defaultmaxpopretrievalaccounts",
                                                                                             "defaultsharedcalendar",
                                                                                             "defaultsharedcontact",
                                                                                             "defaultsharedfolder",
                                                                                             "defaultsharedgal",
                                                                                             "defaultsharednotes",
                                                                                             "defaultsharedtasks",
                                                                                             "defaultshowcalendar",
                                                                                             "defaultshowcontacts",
                                                                                             "defaultshowcontentfilteringmenu",
                                                                                             "defaultshowdomainaliasmenu",
                                                                                             "defaultshowdomainreports",
                                                                                             "defaultshowlistmenu",
                                                                                             "defaultshownotes",
                                                                                             "defaultshowspammenu",
                                                                                             "defaultshowtasks",
                                                                                             "defaultshowuserreports",
                                                                                             "defaultskin",
                                                                                             "defaultspamresponderoption",
                                                                                             "defaultspamforwardoption"
                                                                                         });

				string[] requestedDomainDefaults = defaultRequestedSettings.settingValues;

				//domain Path is taken from WebsitePanel Service settings

				GenericResult result = null;

				if (!InheritDomainDefaultLimits)
				{
					result = domains.AddDomain(AdminUsername,
											   AdminPassword,
											   domain.Name,
											   Path.Combine(DomainsPath, domain.Name),
											   SYSTEM_DOMAIN_ADMIN, // admin username
											   Guid.NewGuid().ToString("P"), // admin password
											   "Domain", // admin first name
											   "Administrator", // admin last name
											   ServerIP,
											   defaultDomainSettings.ImapPort,
											   defaultDomainSettings.PopPort,
											   defaultDomainSettings.SmtpPort,
											   domain.MaxAliases,
											   domain.MaxDomainSizeInMB,
											   domain.MaxDomainUsers,
											   domain.MaxMailboxSizeInMB,
											   domain.MaxMessageSize,
											   domain.MaxRecipients,
											   domain.MaxDomainAliases,
											   domain.MaxLists,
											   defaultDomainSettings.ShowDomainAliasMenu,
						// ShowDomainAliasMenu
											   defaultDomainSettings.ShowContentFilteringMenu,
						// ShowContentFilteringMenu
											   defaultDomainSettings.ShowSpamMenu, // ShowSpamMenu
											   defaultDomainSettings.ShowStatsMenu, // ShowStatsMenu
											   defaultDomainSettings.RequireSmtpAuthentication,
											   defaultDomainSettings.ShowListMenu, // ShowListMenu
											   defaultDomainSettings.ListCommandAddress);
				}
				else
				{
					result = domains.AddDomain(AdminUsername, AdminPassword,
											   domain.Name,
											   Path.Combine(DomainsPath, domain.Name),
											   SYSTEM_DOMAIN_ADMIN, // admin username
											   Guid.NewGuid().ToString("P"), // admin password
											   "Domain", // admin first name
											   "Administrator", // admin last name
											   ServerIP,
											   defaultDomainSettings.ImapPort,
											   defaultDomainSettings.PopPort,
											   defaultDomainSettings.SmtpPort,
											   defaultDomainSettings.MaxAliases,
											   defaultDomainSettings.MaxDomainSizeInMB,
											   defaultDomainSettings.MaxDomainUsers,
											   defaultDomainSettings.MaxMailboxSizeInMB,
											   defaultDomainSettings.MaxMessageSize,
											   defaultDomainSettings.MaxRecipients,
											   defaultDomainSettings.MaxDomainAliases,
											   defaultDomainSettings.MaxLists,
											   defaultDomainSettings.ShowDomainAliasMenu, // ShowDomainAliasMenu
											   defaultDomainSettings.ShowContentFilteringMenu, // ShowContentFilteringMenu
											   defaultDomainSettings.ShowSpamMenu, // ShowSpamMenu
											   defaultDomainSettings.ShowStatsMenu, // ShowStatsMenu
											   defaultDomainSettings.RequireSmtpAuthentication,
											   defaultDomainSettings.ShowListMenu, // ShowListMenu
											   defaultDomainSettings.ListCommandAddress);
				}
				if (!result.Result)
					throw new Exception(result.Message);


				// update additional settings
				result = domains.SetRequestedDomainSettings(AdminUsername, AdminPassword, domain.Name,
															SetMailDomainDefaultSettings(requestedDomainDefaults));

				if (!result.Result)
					throw new Exception(result.Message);
			}
			catch (Exception ex)
			{
				if (DomainExists(domain.Name))
				{
					DeleteDomain(domain.Name);
				}
				Log.WriteError(ex);
				throw new Exception("Could not create mail domain", ex);
			}
		}
		public MailDomain GetDomain(string domainName)
		{
			try
			{
				svcDomainAdmin domains = new svcDomainAdmin();
				PrepareProxy(domains);

				DomainSettingsResult result = domains.GetDomainSettings(AdminUsername, AdminPassword, domainName);
				if (!result.Result)
					throw new Exception(result.Message);

				// fill domain properties
				MailDomain domain = new MailDomain();
				domain.Name = domainName;
				domain.Path = result.Path;
				domain.ServerIP = result.ServerIP;
				domain.ImapPort = result.ImapPort;
				domain.SmtpPort = result.SmtpPort;
				domain.PopPort = result.PopPort;
				domain.MaxAliases = result.MaxAliases;
				domain.MaxDomainAliases = result.MaxDomainAliases;
				domain.MaxLists = result.MaxLists;
				domain.MaxDomainSizeInMB = result.MaxDomainSizeInMB;
				domain.MaxDomainUsers = result.MaxDomainUsers;
				domain.MaxMailboxSizeInMB = result.MaxMailboxSizeInMB;
				domain.MaxMessageSize = result.MaxMessageSize;
				domain.MaxRecipients = result.MaxRecipients;
				domain.RequireSmtpAuthentication = result.RequireSmtpAuthentication;
				domain.ListCommandAddress = result.ListCommandAddress;
				domain.ShowContentFilteringMenu = result.ShowContentFilteringMenu;
				domain.ShowDomainAliasMenu = result.ShowDomainAliasMenu;
				domain.ShowListMenu = result.ShowListMenu;
				domain.ShowSpamMenu = result.ShowSpamMenu;
				// get additional domain settings
				string[] requestedSettings = new string[]
                {
                    "catchall",
					"enablepopretrieval",
					"enablecatchalls",
                    "isenabled",
                    "ldapport",
                    "altsmtpport",
                    "sharedcalendar",
                    "sharedcontact",
                    "sharedfolder",
                    "sharednotes",
                    "sharedtasks",
                    "sharedgal",
                    "bypassforwardblacklist",
					"showdomainreports",
					"spamresponderoption",
					"spamforwardoption",
					"maxmessagesperhour",
					"maxmessagesperhourenabled",
					"maxsmtpoutbandwidthperhour",
					"maxsmtpoutbandwidthperhourenabled",
					"maxpopretrievalaccounts",
					"maxbouncesreceivedperhour",
					"maxbouncesreceivedperhourenabled",
                    "enableimapretrieval",
                    "enablemailsigning",
                    "enableemailreports",
                    "syncml"
				};

				SettingsRequestResult addResult = domains.GetRequestedDomainSettings(AdminUsername, AdminPassword, domainName, requestedSettings);
				if (!addResult.Result)
					throw new Exception(addResult.Message);

				FillMailDomainFields(domain, addResult);


				// get catch-all address
				if (!String.IsNullOrEmpty(domain.CatchAllAccount))
				{
					// get catch-all group
					string groupName = SYSTEM_CATCH_ALL + "@" + domain.Name;
					if (GroupExists(groupName))
					{
						// get the first member of this group
						MailGroup group = GetGroup(groupName);
						domain.CatchAllAccount = GetAccountName(group.Members[0]);
					}
				}


				svcServerAdmin serverAdmin = new svcServerAdmin();
				PrepareProxy(serverAdmin);

				EditionResult licenseType = serverAdmin.GetEdition(AdminUsername, AdminPassword);

				if (licenseType.Edition == "PRO")
				{
					domain[MailDomain.SMARTERMAIL_LICENSE_TYPE] = "PRO";
				}
				if (licenseType.Edition == "ENT")
				{
					domain[MailDomain.SMARTERMAIL_LICENSE_TYPE] = "ENT";
				}
				if (licenseType.Edition == "FREE")
				{
					domain[MailDomain.SMARTERMAIL_LICENSE_TYPE] = "FREE";
				}


				return domain;
			}
			catch (Exception ex)
			{
				throw new Exception("Could not get mail domain", ex);
			}
		}
		public string[] GetDomains()
		{
			try
			{
				svcDomainAdmin domains = new svcDomainAdmin();
				PrepareProxy(domains);

				DomainListResult result = domains.GetAllDomains(AdminUsername, AdminPassword);
				if (!result.Result)
					throw new Exception(result.Message);

				return result.DomainNames;
			}
			catch (Exception ex)
			{
				throw new Exception("Could not get the list of mail domains", ex);
			}
		}
		/// <summary>
		/// Checks whether the specified domain exists
		/// </summary>
		/// <param name="domainName">Domain name</param>
		/// <returns>true if the specified domain exists, otherwise false</returns>
		public bool DomainExists(string domainName)
		{
			try
			{
				svcDomainAdmin domains = new svcDomainAdmin();
				PrepareProxy(domains);

				DomainSettingsResult result = domains.GetDomainSettings(AdminUsername, AdminPassword, domainName);
				return result.Result;
			}
			catch (Exception ex)
			{
				throw new Exception("Could not check whether mail domain exists", ex);
			}
		}
		public DailyStatistics[] GetDailyStatistics(DateTime since, string maildomainName)
		{

			ArrayList days = new ArrayList();
			// read statistics
			DateTime now = DateTime.Now;
			DateTime date = since;

			try
			{
				while (date < now)
				{
					svcDomainAdmin domains = new svcDomainAdmin();
					PrepareProxy(domains);
					StatInfoResult result =
						domains.GetDomainStatistics(AdminUsername, AdminPassword, maildomainName, date, date);

					if (!result.Result)
						throw new Exception(result.Message);

					if (result.BytesReceived != 0 | result.BytesSent != 0)
					{
						DailyStatistics dailyStats = new DailyStatistics();
						dailyStats.Year = date.Year;
						dailyStats.Month = date.Month;
						dailyStats.Day = date.Day;
						dailyStats.BytesSent = result.BytesSent;
						dailyStats.BytesReceived = result.BytesReceived;
						days.Add(dailyStats);
					}

					// advance day
					date = date.AddDays(1);
				}
			}
			catch (Exception ex)
			{
				Log.WriteError("Could not get SmarterMail domain statistics", ex);
			}
			return (DailyStatistics[])days.ToArray(typeof(DailyStatistics));
		}