/// <summary>
        /// Gets server settings and binds them to this.
        /// </summary>
        private void Bind()
        {
            /* GetSettings <virtualServerID>
                  Responses:
                    +OK <sizeOfData>
                    <data>

                    -ERR <errorText>
            */

            // Call TCP GetSettings
            m_pVirtualServer.Server.Socket.WriteLine("GetSettings " + m_pVirtualServer.VirtualServerID);

            string response = m_pVirtualServer.Server.Socket.ReadLine();
            if(!response.ToUpper().StartsWith("+OK")){
                throw new Exception(response);
            }

            int sizeOfData = Convert.ToInt32(response.Split(new char[]{' '},2)[1]);
            MemoryStream ms = new MemoryStream();
            m_pVirtualServer.Server.Socket.ReadSpecifiedLength(sizeOfData,ms);
            ms.Position = 0;

            DataSet ds = new DataSet();
            CreateSettingsSchema(ds);
            ds.Clear();
            ds.ReadXml(ms);

            DataRow dr = ds.Tables["Settings"].Rows[0];
            //--- AUTH -------------------------------------------//
            m_pAuth = new Auth_Settings(
                this,
                (ServerAuthenticationType_enum)Convert.ToInt32(dr["ServerAuthenticationType"]),
                dr["ServerAuthWinDomain"].ToString()
            );
            //--- SMTP -------------------------------------------//
            // Get bindings
            BindInfo[] smtpBinds = new BindInfo[ds.Tables["SMTP_Bindings"].Rows.Count];
            for(int i=0;i<ds.Tables["SMTP_Bindings"].Rows.Count;i++){
                DataRow drBinding = ds.Tables["SMTP_Bindings"].Rows[i];
                byte[] certificate = null;
                if(ds.Tables["SMTP_Bindings"].Columns.Contains("SSL_Certificate") && drBinding["SSL_Certificate"] != null && !drBinding.IsNull("SSL_Certificate")){
                    if(((byte[])drBinding["SSL_Certificate"]).Length > 0){
                        certificate = (byte[])drBinding["SSL_Certificate"];
                    }
                }
                smtpBinds[i] = new BindInfo(
                    "TCP",
                    IPAddress.Parse(drBinding["IP"].ToString()),
                    Convert.ToInt32(drBinding["Port"]),
                    Convert.ToBoolean(drBinding["SSL"]),
                    certificate
                );
            }

            m_pSMTP = new SMTP_Settings(
                this,
                Convert.ToBoolean(dr["SMTP_Enabled"]),
                dr["SMTP_HostName"].ToString(),
                dr["SMTP_GreetingText"].ToString(),
                dr["SMTP_DefaultDomain"].ToString(),
                Convert.ToInt32(dr["SMTP_SessionIdleTimeOut"]),
                Convert.ToInt32(dr["SMTP_Threads"]),
                Convert.ToInt32(dr["SMTP_MaxConnectionsPerIP"]),
                Convert.ToInt32(dr["SMTP_MaxBadCommands"]),
                Convert.ToInt32(dr["MaxRecipients"]),
                Convert.ToInt32(dr["MaxMessageSize"]),
                Convert.ToBoolean(dr["SMTP_RequireAuth"]),
                smtpBinds
            );
            //--- POP3 ------------------------------------------//
            // Get bindings
            BindInfo[] pop3Binds = new BindInfo[ds.Tables["POP3_Bindings"].Rows.Count];
            for(int i=0;i<ds.Tables["POP3_Bindings"].Rows.Count;i++){
                DataRow drBinding = ds.Tables["POP3_Bindings"].Rows[i];
                byte[] certificate = null;
                if(ds.Tables["POP3_Bindings"].Columns.Contains("SSL_Certificate") && drBinding["SSL_Certificate"] != null && !drBinding.IsNull("SSL_Certificate")){
                    if(((byte[])drBinding["SSL_Certificate"]).Length > 0){
                        certificate = (byte[])drBinding["SSL_Certificate"];
                    }
                }
                pop3Binds[i] = new BindInfo(
                    "TCP",
                    IPAddress.Parse(drBinding["IP"].ToString()),
                    Convert.ToInt32(drBinding["Port"]),
                    Convert.ToBoolean(drBinding["SSL"]),
                    certificate
                );
            }

            m_pPOP3 = new POP3_Settings(
                this,
                Convert.ToBoolean(dr["POP3_Enabled"]),
                dr["POP3_HostName"].ToString(),
                dr["POP3_GreetingText"].ToString(),
                Convert.ToInt32(dr["POP3_SessionIdleTimeOut"]),
                Convert.ToInt32(dr["POP3_Threads"]),
                Convert.ToInt32(dr["POP3_MaxConnectionsPerIP"]),
                Convert.ToInt32(dr["POP3_MaxBadCommands"]),
                pop3Binds
            );
            //--- IMAP ------------------------------------------//
            // Get bindings
            BindInfo[] imapBinds = new BindInfo[ds.Tables["IMAP_Bindings"].Rows.Count];
            for(int i=0;i<ds.Tables["IMAP_Bindings"].Rows.Count;i++){
                DataRow drBinding = ds.Tables["IMAP_Bindings"].Rows[i];
                byte[] certificate = null;
                if(ds.Tables["IMAP_Bindings"].Columns.Contains("SSL_Certificate") && drBinding["SSL_Certificate"] != null && !drBinding.IsNull("SSL_Certificate")){
                    if(((byte[])drBinding["SSL_Certificate"]).Length > 0){
                        certificate = (byte[])drBinding["SSL_Certificate"];
                    }
                }
                imapBinds[i] = new BindInfo(
                    "TCP",
                    IPAddress.Parse(drBinding["IP"].ToString()),
                    Convert.ToInt32(drBinding["Port"]),
                    Convert.ToBoolean(drBinding["SSL"]),
                    certificate
                );
            }

            m_pIMAP = new IMAP_Settings(
                this,
                Convert.ToBoolean(dr["IMAP_Enabled"]),
                dr["IMAP_HostName"].ToString(),
                dr["IMAP_GreetingText"].ToString(),
                Convert.ToInt32(dr["IMAP_SessionIdleTimeOut"]),
                Convert.ToInt32(dr["IMAP_Threads"]),
                Convert.ToInt32(dr["IMAP_MaxConnectionsPerIP"]),
                Convert.ToInt32(dr["IMAP_MaxBadCommands"]),
                imapBinds
            );
            //--- Relay ----------------------------------------//
            m_pRelay = new Relay_Settings(
                this,
                Convert.ToBoolean(dr["UseSmartHost"]),
                dr["SmartHost"].ToString(),
                Convert.ToInt32(dr["SmartHostPort"]),
                Convert.ToBoolean(dr["Relay_SmartHost_UseSSL"]),
                dr["SmartHostUserName"].ToString(),
                dr["SmartHostPassword"].ToString(),
                dr["Dns1"].ToString(),
                dr["Dns2"].ToString(),
                dr["Relay_HostName"].ToString(),
                Convert.ToInt32(dr["Relay_SessionIdleTimeOut"]),
                Convert.ToInt32(dr["MaxRelayThreads"]),
                Convert.ToInt32(dr["Relay_MaxConnectionsPerIP"]),
                Convert.ToInt32(dr["RelayInterval"]),
                Convert.ToInt32(dr["RelayRetryInterval"]),
                Convert.ToInt32(dr["RelayUndeliveredWarning"]),
                Convert.ToInt32(dr["RelayUndelivered"]),
                Convert.ToBoolean(dr["StoreUndeliveredMessages"]),
                dr["RelayLocalIP"].ToString()
            );
            //--- Fetch messages ------------------------------//
            m_pFetchMessages = new FetchMessages_Settings(
                this,
                Convert.ToBoolean(dr["FetchPOP3_Enabled"]),
                Convert.ToInt32(dr["FetchPOP3_Interval"])
            );
            //--- SIP ----------------------------------------//
            // Get bindings
            BindInfo[] sipBinds = new BindInfo[ds.Tables["SIP_Bindings"].Rows.Count];
            for(int i=0;i<ds.Tables["SIP_Bindings"].Rows.Count;i++){
                DataRow drBinding = ds.Tables["SIP_Bindings"].Rows[i];
                byte[] certificate = null;
                if(ds.Tables["SIP_Bindings"].Columns.Contains("SSL_Certificate") && drBinding["SSL_Certificate"] != null && !drBinding.IsNull("SSL_Certificate")){
                    if(((byte[])drBinding["SSL_Certificate"]).Length > 0){
                        certificate = (byte[])drBinding["SSL_Certificate"];
                    }
                }
                sipBinds[i] = new BindInfo(
                    drBinding["Protocol"].ToString(),
                    IPAddress.Parse(drBinding["IP"].ToString()),
                    Convert.ToInt32(drBinding["Port"]),
                    Convert.ToBoolean(drBinding["SSL"]),
                    certificate
                );
            }

            m_pSIP = new SIP_Settings(
                this,
                Convert.ToBoolean(dr["SIP_Enabled"]),
                dr["SIP_HostName"].ToString(),
                Convert.ToInt32(dr["SIP_MinExpires"]),
                sipBinds
            );
            //--- Logging ------------------------------------//
            m_pLogging = new Logging_Settings(
                this,
                ConvertEx.ToBoolean(dr["LogSMTPCmds"],false),
                dr["SMTP_LogPath"].ToString(),
                ConvertEx.ToBoolean(dr["LogPOP3Cmds"],false),
                dr["POP3_LogPath"].ToString(),
                ConvertEx.ToBoolean(dr["LogIMAPCmds"],false),
                dr["IMAP_LogPath"].ToString(),
                ConvertEx.ToBoolean(dr["LogRelayCmds"],false),
                dr["Relay_LogPath"].ToString(),
                ConvertEx.ToBoolean(dr["LogFetchPOP3Cmds"],false),
                dr["FetchPOP3_LogPath"].ToString()
            );
            //--- Server return messages
            string delayedNotifyBodyRtf = "" +
            "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fnil\\fcharset0 Verdana;}{\\f1\\fnil\\fcharset186 Verdana;}{\\f2\\fswiss\\fcharset186{\\*\\fname Arial;}Arial Baltic;}{\\f3\\fnil\\fcharset0 Microsoft Sans Serif;}}\r\n" +
            "{\\colortbl ;\\red0\\green64\\blue128;\\red255\\green0\\blue0;\\red0\\green128\\blue0;}\r\n" +
            "\\viewkind4\\uc1\\pard\\f0\\fs20 This e-mail is generated by the Server(\\cf1 <#relay.hostname>\\cf0 )  to notify you, \\par\r\n" +
            "\\lang1061\\f1 that \\lang1033\\f0 your message to \\cf1 <#relay.to>\\cf0  dated \\b\\fs16 <#message.header[\"Date:\"]>\\b0  \\fs20 could not be sent at the first attempt.\\par\r\n" +
            "\\par\r\n" +
            "Recipient \\i <#relay.to>'\\i0 s Server (\\cf1 <#relay.session_hostname>\\cf0 ) returned the following response: \\cf2 <#relay.error>\\cf0\\par\r\n" +
            "\\par\r\n" +
            "\\par\r\n" +
            "Please note Server will attempt to deliver this message for \\b <#relay.undelivered_after>\\b0  hours.\\par\r\n" +
            "\\par\r\n" +
            "--------\\par\r\n" +
            "\\par\r\n" +
            "Your original message is attached to this e-mail (\\b data.eml\\b0 )\\par\r\n" +
            "\\par\r\n" +
            "\\fs16 The tracking number for this message is \\cf3 <#relay.session_messageid>\\cf0\\fs20\\par\r\n" +
            "\\lang1061\\f2\\par\r\n" +
            "\\pard\\lang1033\\f3\\fs17\\par\r\n" +
            "}\r\n";
            ServerReturnMessage delayedDeliveryWarning = new ServerReturnMessage("Delayed delivery notice: <#message.header[\"Subject:\"]>",delayedNotifyBodyRtf);
            string undeliveredNotifyBodyRtf = "" +
            "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fswiss\\fprq2\\fcharset0 Verdana;}{\\f1\\fswiss\\fprq2\\fcharset186 Verdana;}{\\f2\\fnil\\fcharset0 Verdana;}{\\f3\\fnil\\fcharset186 Verdana;}{\\f4\\fswiss\\fcharset0 Arial;}{\\f5\\fswiss\\fcharset186{\\*\\fname Arial;}Arial Baltic;}}\r\n" +
            "{\\colortbl ;\\red0\\green64\\blue128;\\red255\\green0\\blue0;\\red0\\green128\\blue0;}\r\n" +
            "\\viewkind4\\uc1\\pard\\f0\\fs20 Your message t\\lang1061\\f1 o \\cf1\\lang1033\\f2 <#relay.to>\\cf0\\f0 , dated \\b\\fs16 <#message.header[\"Date:\"]>\\b0\\fs20 , could not be delivered.\\par\r\n" +
            "\\par\r\n" +
            "Recipient \\i <#relay.to>'\\i0 s Server (\\cf1 <#relay.session_hostname>\\cf0 ) returned the following response: \\cf2 <#relay.error>\\cf0\\par\r\n" +
            "\\par\r\n" +
            "\\par\r\n" +
            "\\b * Server will not attempt to deliver this message anymore\\b0 .\\par\r\n" +
            "\\par\r\n" +
            "--------\\par\r\n" +
            "\\par\r\n" +
            "Your original message is attached to this e-mail (\\b data.eml\\b0 )\\par\r\n" +
            "\\par\r\n" +
            "\\fs16 The tracking number for this message is \\cf3 <#relay.session_messageid>\\cf0\\fs20\\par\r\n" +
            "\\lang1061\\f5\\par\r\n" +
            "\\lang1033\\f2\\par\r\n" +
            "}\r\n";
            ServerReturnMessage undelivered = new ServerReturnMessage("Undelivered notice: <#message.header[\"Subject:\"]>",undeliveredNotifyBodyRtf);
            if(ds.Tables.Contains("ServerReturnMessages")){
                foreach(DataRow dr1 in ds.Tables["ServerReturnMessages"].Rows){
                    if(dr1["MessageType"].ToString() == "delayed_delivery_warning"){
                        delayedDeliveryWarning = new ServerReturnMessage(dr1["Subject"].ToString(),dr1["BodyTextRtf"].ToString());
                    }
                    else if(dr1["MessageType"].ToString() == "undelivered"){
                        undelivered = new ServerReturnMessage(dr1["Subject"].ToString(),dr1["BodyTextRtf"].ToString());
                    }
                }
            }
            m_pReturnMessages = new ServerReturnMessages(
                this,
                delayedDeliveryWarning,
                undelivered
            );
        }
        /// <summary>
        /// Loads settings from DataSet.
        /// </summary>
        /// <param name="dsSettings">DataSet what contains settings.</param>
        internal void LoadSettings(DataSet dsSettings)
        {
            DataSet ds = new DataSet();
            CreateSettingsSchema(ds);
            ds.Clear();
            MemoryStream ms = new MemoryStream();
            dsSettings.WriteXml(ms);
            ms.Position = 0;
            ds.ReadXml(ms);

            DataRow dr = ds.Tables["Settings"].Rows[0];
            //--- AUTH -------------------------------------------//
            m_pAuth.AuthenticationType = (ServerAuthenticationType_enum)Convert.ToInt32(dr["ServerAuthenticationType"]);
            m_pAuth.WinDomain          = dr["ServerAuthWinDomain"].ToString();

            //--- SMTP -------------------------------------------//
            // Get bindings
            BindInfo[] smtpBinds = new BindInfo[ds.Tables["SMTP_Bindings"].Rows.Count];
            for(int i=0;i<ds.Tables["SMTP_Bindings"].Rows.Count;i++){
                DataRow drBinding = ds.Tables["SMTP_Bindings"].Rows[i];
                byte[] certificate = null;
                if(ds.Tables["SMTP_Bindings"].Columns.Contains("SSL_Certificate") && drBinding["SSL_Certificate"] != null && !drBinding.IsNull("SSL_Certificate")){
                    if(((byte[])drBinding["SSL_Certificate"]).Length > 0){
                        certificate = (byte[])drBinding["SSL_Certificate"];
                    }
                }
                smtpBinds[i] = new BindInfo(
                    "TCP",
                    IPAddress.Parse(drBinding["IP"].ToString()),
                    Convert.ToInt32(drBinding["Port"]),
                    Convert.ToBoolean(drBinding["SSL"]),
                    certificate
                );
            }

            m_pSMTP.Enabled                     = Convert.ToBoolean(dr["SMTP_Enabled"]);
            m_pSMTP.HostName                    = dr["SMTP_HostName"].ToString();
            m_pSMTP.GreetingText                = dr["SMTP_GreetingText"].ToString();
            m_pSMTP.DefaultDomain               = dr["SMTP_DefaultDomain"].ToString();
            m_pSMTP.SessionIdleTimeOut          = Convert.ToInt32(dr["SMTP_SessionIdleTimeOut"]);
            m_pSMTP.MaximumConnections          = Convert.ToInt32(dr["SMTP_Threads"]);
            m_pSMTP.MaximumConnectionsPerIP     = Convert.ToInt32(dr["SMTP_MaxConnectionsPerIP"]);
            m_pSMTP.MaximumBadCommands          = Convert.ToInt32(dr["SMTP_MaxBadCommands"]);
            m_pSMTP.MaximumRecipientsPerMessage = Convert.ToInt32(dr["MaxRecipients"]);
            m_pSMTP.MaximumMessageSize          = Convert.ToInt32(dr["MaxMessageSize"]);
            m_pSMTP.RequireAuthentication       = Convert.ToBoolean(dr["SMTP_RequireAuth"]);
            m_pSMTP.Binds                       = smtpBinds;

            //--- POP3 ------------------------------------------//
            // Get bindings
            BindInfo[] pop3Binds = new BindInfo[ds.Tables["POP3_Bindings"].Rows.Count];
            for(int i=0;i<ds.Tables["POP3_Bindings"].Rows.Count;i++){
                DataRow drBinding = ds.Tables["POP3_Bindings"].Rows[i];
                byte[] certificate = null;
                if(ds.Tables["POP3_Bindings"].Columns.Contains("SSL_Certificate") && drBinding["SSL_Certificate"] != null && !drBinding.IsNull("SSL_Certificate")){
                    if(((byte[])drBinding["SSL_Certificate"]).Length > 0){
                        certificate = (byte[])drBinding["SSL_Certificate"];
                    }
                }
                pop3Binds[i] = new BindInfo(
                    "TCP",
                    IPAddress.Parse(drBinding["IP"].ToString()),
                    Convert.ToInt32(drBinding["Port"]),
                    Convert.ToBoolean(drBinding["SSL"]),
                    certificate
                );
            }

            m_pPOP3.Enabled                 = Convert.ToBoolean(dr["POP3_Enabled"]);
            m_pPOP3.HostName                = dr["POP3_HostName"].ToString();
            m_pPOP3.GreetingText            = dr["POP3_GreetingText"].ToString();
            m_pPOP3.SessionIdleTimeOut      = Convert.ToInt32(dr["POP3_SessionIdleTimeOut"]);
            m_pPOP3.MaximumConnections      = Convert.ToInt32(dr["POP3_Threads"]);
            m_pPOP3.MaximumConnectionsPerIP = Convert.ToInt32(dr["POP3_MaxConnectionsPerIP"]);
            m_pPOP3.MaximumBadCommands      = Convert.ToInt32(dr["POP3_MaxBadCommands"]);
            m_pPOP3.Binds                   = pop3Binds;

            //--- IMAP ------------------------------------------//
            // Get bindings
            BindInfo[] imapBinds = new BindInfo[ds.Tables["IMAP_Bindings"].Rows.Count];
            for(int i=0;i<ds.Tables["IMAP_Bindings"].Rows.Count;i++){
                DataRow drBinding = ds.Tables["IMAP_Bindings"].Rows[i];
                byte[] certificate = null;
                if(ds.Tables["IMAP_Bindings"].Columns.Contains("SSL_Certificate") && drBinding["SSL_Certificate"] != null && !drBinding.IsNull("SSL_Certificate")){
                    if(((byte[])drBinding["SSL_Certificate"]).Length > 0){
                        certificate = (byte[])drBinding["SSL_Certificate"];
                    }
                }
                imapBinds[i] = new BindInfo(
                    "TCP",
                    IPAddress.Parse(drBinding["IP"].ToString()),
                    Convert.ToInt32(drBinding["Port"]),
                    Convert.ToBoolean(drBinding["SSL"]),
                    certificate
                );
            }

            m_pIMAP.Enabled                 = Convert.ToBoolean(dr["IMAP_Enabled"]);
            m_pIMAP.HostName                = dr["IMAP_HostName"].ToString();
            m_pIMAP.GreetingText            = dr["IMAP_GreetingText"].ToString();
            m_pIMAP.SessionIdleTimeOut      = Convert.ToInt32(dr["IMAP_SessionIdleTimeOut"]);
            m_pIMAP.MaximumConnections      = Convert.ToInt32(dr["IMAP_Threads"]);
            m_pIMAP.MaximumConnectionsPerIP = Convert.ToInt32(dr["IMAP_MaxConnectionsPerIP"]);
            m_pIMAP.MaximumBadCommands      = Convert.ToInt32(dr["IMAP_MaxBadCommands"]);
            m_pIMAP.Binds                   = imapBinds;

            //--- Relay ----------------------------------------//
            m_pRelay.UseSmartHost                = Convert.ToBoolean(dr["UseSmartHost"]);
            m_pRelay.SmartHost                   = dr["SmartHost"].ToString();
            m_pRelay.SmartHostPort               = Convert.ToInt32(dr["SmartHostPort"]);
            m_pRelay.SmartHostSsl                = Convert.ToBoolean(dr["Relay_SmartHost_UseSSL"]);
            m_pRelay.SmartHostUserName           = dr["SmartHostUserName"].ToString();
            m_pRelay.SmartHostPassword           = dr["SmartHostPassword"].ToString();
            m_pRelay.Dns1                        = dr["Dns1"].ToString();
            m_pRelay.Dns2                        = dr["Dns2"].ToString();
            m_pRelay.HostName                    = dr["Relay_HostName"].ToString();
            m_pRelay.SessionIdleTimeOut          = Convert.ToInt32(dr["Relay_SessionIdleTimeOut"]);
            m_pRelay.MaximumConnections          = Convert.ToInt32(dr["MaxRelayThreads"]);
            m_pRelay.MaximumConnectionsPerIP     = Convert.ToInt32(dr["Relay_MaxConnectionsPerIP"]);
            m_pRelay.RelayInterval               = Convert.ToInt32(dr["RelayInterval"]);
            m_pRelay.RelayRetryInterval          = Convert.ToInt32(dr["RelayRetryInterval"]);
            m_pRelay.SendUndeliveredWarningAfter = Convert.ToInt32(dr["RelayUndeliveredWarning"]);
            m_pRelay.SendUndeliveredAfter        = Convert.ToInt32(dr["RelayUndelivered"]);
            m_pRelay.StoreUndeliveredMessages    = Convert.ToBoolean(dr["StoreUndeliveredMessages"]);
            m_pRelay.BindIP                      = IPAddress.Parse(dr["RelayLocalIP"].ToString());

            //--- Fetch messages ------------------------------//
            m_pFetchMessages.Enabled       = Convert.ToBoolean(dr["FetchPOP3_Enabled"]);
            m_pFetchMessages.FetchInterval = Convert.ToInt32(dr["FetchPOP3_Interval"]);

            //--- SIP ----------------------------------------//
            m_pSIP.Enabled        = Convert.ToBoolean(dr["SIP_Enabled"]);
            m_pSIP.HostName       = dr["SIP_HostName"].ToString();
            m_pSIP.MinimumExpires = Convert.ToInt32(dr["SIP_MinExpires"]);

            // Get bindings
            BindInfo[] sipBinds = new BindInfo[ds.Tables["SIP_Bindings"].Rows.Count];
            for(int i=0;i<ds.Tables["SIP_Bindings"].Rows.Count;i++){
                DataRow drBinding = ds.Tables["SIP_Bindings"].Rows[i];
                byte[] certificate = null;
                if(ds.Tables["SIP_Bindings"].Columns.Contains("SSL_Certificate") && drBinding["SSL_Certificate"] != null && !drBinding.IsNull("SSL_Certificate")){
                    if(((byte[])drBinding["SSL_Certificate"]).Length > 0){
                        certificate = (byte[])drBinding["SSL_Certificate"];
                    }
                }
                sipBinds[i] = new BindInfo(
                    "TCP",
                    IPAddress.Parse(drBinding["IP"].ToString()),
                    Convert.ToInt32(drBinding["Port"]),
                    Convert.ToBoolean(drBinding["SSL"]),
                    certificate
                );
            }

            //--- Logging ------------------------------------//
            m_pLogging.LogSMTP               = ConvertEx.ToBoolean(dr["LogSMTPCmds"],false);
            m_pLogging.SmtpLogsPath          = dr["SMTP_LogPath"].ToString();
            m_pLogging.LogPOP3               = ConvertEx.ToBoolean(dr["LogPOP3Cmds"],false);
            m_pLogging.Pop3LogsPath          = dr["POP3_LogPath"].ToString();
            m_pLogging.LogIMAP               = ConvertEx.ToBoolean(dr["LogIMAPCmds"],false);
            m_pLogging.ImapLogsPath          = dr["IMAP_LogPath"].ToString();
            m_pLogging.LogRelay              = ConvertEx.ToBoolean(dr["LogRelayCmds"],false);
            m_pLogging.RelayLogsPath         = dr["Relay_LogPath"].ToString();
            m_pLogging.LogFetchMessages      = ConvertEx.ToBoolean(dr["LogFetchPOP3Cmds"],false);
            m_pLogging.FetchMessagesLogsPath = dr["FetchPOP3_LogPath"].ToString();

            //--- Server return messages
            string delayedNotifyBodyRtf = "" +
            "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fnil\\fcharset0 Verdana;}{\\f1\\fnil\\fcharset186 Verdana;}{\\f2\\fswiss\\fcharset186{\\*\\fname Arial;}Arial Baltic;}{\\f3\\fnil\\fcharset0 Microsoft Sans Serif;}}\r\n" +
            "{\\colortbl ;\\red0\\green64\\blue128;\\red255\\green0\\blue0;\\red0\\green128\\blue0;}\r\n" +
            "\\viewkind4\\uc1\\pard\\f0\\fs20 This e-mail is generated by the Server(\\cf1 <#relay.hostname>\\cf0 )  to notify you, \\par\r\n" +
            "\\lang1061\\f1 that \\lang1033\\f0 your message to \\cf1 <#relay.to>\\cf0  dated \\b\\fs16 <#message.header[\"Date:\"]>\\b0  \\fs20 could not be sent at the first attempt.\\par\r\n" +
            "\\par\r\n" +
            "Recipient \\i <#relay.to>'\\i0 s Server (\\cf1 <#relay.session_hostname>\\cf0 ) returned the following response: \\cf2 <#relay.error>\\cf0\\par\r\n" +
            "\\par\r\n" +
            "\\par\r\n" +
            "Please note Server will attempt to deliver this message for \\b <#relay.undelivered_after>\\b0  hours.\\par\r\n" +
            "\\par\r\n" +
            "--------\\par\r\n" +
            "\\par\r\n" +
            "Your original message is attached to this e-mail (\\b data.eml\\b0 )\\par\r\n" +
            "\\par\r\n" +
            "\\fs16 The tracking number for this message is \\cf3 <#relay.session_messageid>\\cf0\\fs20\\par\r\n" +
            "\\lang1061\\f2\\par\r\n" +
            "\\pard\\lang1033\\f3\\fs17\\par\r\n" +
            "}\r\n";
            ServerReturnMessage delayedDeliveryWarning = new ServerReturnMessage("Delayed delivery notice: <#message.header[\"Subject:\"]>",delayedNotifyBodyRtf);
            string undeliveredNotifyBodyRtf = "" +
            "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fswiss\\fprq2\\fcharset0 Verdana;}{\\f1\\fswiss\\fprq2\\fcharset186 Verdana;}{\\f2\\fnil\\fcharset0 Verdana;}{\\f3\\fnil\\fcharset186 Verdana;}{\\f4\\fswiss\\fcharset0 Arial;}{\\f5\\fswiss\\fcharset186{\\*\\fname Arial;}Arial Baltic;}}\r\n" +
            "{\\colortbl ;\\red0\\green64\\blue128;\\red255\\green0\\blue0;\\red0\\green128\\blue0;}\r\n" +
            "\\viewkind4\\uc1\\pard\\f0\\fs20 Your message t\\lang1061\\f1 o \\cf1\\lang1033\\f2 <#relay.to>\\cf0\\f0 , dated \\b\\fs16 <#message.header[\"Date:\"]>\\b0\\fs20 , could not be delivered.\\par\r\n" +
            "\\par\r\n" +
            "Recipient \\i <#relay.to>'\\i0 s Server (\\cf1 <#relay.session_hostname>\\cf0 ) returned the following response: \\cf2 <#relay.error>\\cf0\\par\r\n" +
            "\\par\r\n" +
            "\\par\r\n" +
            "\\b * Server will not attempt to deliver this message anymore\\b0 .\\par\r\n" +
            "\\par\r\n" +
            "--------\\par\r\n" +
            "\\par\r\n" +
            "Your original message is attached to this e-mail (\\b data.eml\\b0 )\\par\r\n" +
            "\\par\r\n" +
            "\\fs16 The tracking number for this message is \\cf3 <#relay.session_messageid>\\cf0\\fs20\\par\r\n" +
            "\\lang1061\\f5\\par\r\n" +
            "\\lang1033\\f2\\par\r\n" +
            "}\r\n";
            ServerReturnMessage undelivered = new ServerReturnMessage("Undelivered notice: <#message.header[\"Subject:\"]>",undeliveredNotifyBodyRtf);
            if(ds.Tables.Contains("ServerReturnMessages")){
                foreach(DataRow dr1 in ds.Tables["ServerReturnMessages"].Rows){
                    if(dr1["MessageType"].ToString() == "delayed_delivery_warning"){
                        delayedDeliveryWarning = new ServerReturnMessage(dr1["Subject"].ToString(),dr1["BodyTextRtf"].ToString());
                    }
                    else if(dr1["MessageType"].ToString() == "undelivered"){
                        undelivered = new ServerReturnMessage(dr1["Subject"].ToString(),dr1["BodyTextRtf"].ToString());
                    }
                }
            }
            m_pReturnMessages = new ServerReturnMessages(
                this,
                delayedDeliveryWarning,
                undelivered
            );
        }