static public bool Test(BaseProtocolClient ingoing_mail_client, MailServerSettings settings)
        {
            try
            {
                IAsyncResult async_res;
                switch (settings.EncryptionType)
                {
                    case EncryptionType.StartTLS:
                        async_res = ingoing_mail_client.BeginConnect(settings.Url, settings.Port, null);
                        break;
                    case EncryptionType.SSL:
                        async_res = ingoing_mail_client.BeginConnectSsl(settings.Url, settings.Port, null);
                        break;
                    default:
                        async_res = ingoing_mail_client.BeginConnect(settings.Url, settings.Port, null);
                        break;
                }

                if (!async_res.AsyncWaitHandle.WaitOne(WAIT_TIMEOUT))
                    throw new ImapConnectionTimeoutException();

                if (settings.EncryptionType == EncryptionType.StartTLS)
                {
                    ingoing_mail_client.StartTLS(settings.Url);
                }

                if (settings.AuthenticationType == SaslMechanism.Login)
                {
                    ingoing_mail_client.Login(settings.AccountName, settings.AccountPass, "");
                }
                else
                {
                    async_res = ingoing_mail_client.BeginAuthenticate(settings.AccountName, settings.AccountPass, settings.AuthenticationType, null);
                }

                if (!async_res.AsyncWaitHandle.WaitOne(WAIT_TIMEOUT))
                    throw new ImapConnectionTimeoutException();

                if (async_res.AsyncState == null)
                    throw new AuthenticationException("Auth failed. Check your settings.");

                string s_result = ingoing_mail_client.EndConnectSsl(async_res).ToLowerInvariant();

                if (s_result.IndexOf("success", StringComparison.Ordinal) == -1 &&
                    s_result.IndexOf("+", StringComparison.Ordinal) == -1 &&
                    s_result.IndexOf("ok", StringComparison.Ordinal) == -1)
                    throw new ImapConnectionException(s_result);

                return true;
            }
            finally
            {
                if (ingoing_mail_client.IsConnected)
                {
                    ingoing_mail_client.Disconnect();
                }
            }
        }
        public static bool Test(BaseProtocolClient ingoingMailClient, MailServerSettings settings)
        {
            try
            {
                var sResult = ingoingMailClient.Authorize(settings, settings.MailServerOperationTimeoutInMilliseconds);
                if (sResult.ToLower().IndexOf("success", StringComparison.Ordinal) == -1 &&
                    sResult.ToLower().IndexOf("+", StringComparison.Ordinal) == -1 &&
                    sResult.ToLower().IndexOf("ok", StringComparison.Ordinal) == -1)
                {
                    if (ingoingMailClient is Imap4Client)
                        throw new ImapConnectionException(sResult);
                    if(ingoingMailClient is Pop3Client)
                        throw new Pop3ConnectionException(sResult);
                    else
                        throw new SmtpConnectionException(sResult);
                }

                return true;
            }
            catch (TargetInvocationException exTarget)
            {
                if (ingoingMailClient is Imap4Client)
                        throw new ImapConnectionException(exTarget.InnerException.Message);
                    if(ingoingMailClient is Pop3Client)
                        throw new Pop3ConnectionException(exTarget.InnerException.Message);
                    else
                        throw new SmtpConnectionException(exTarget.InnerException.Message);
            }
            catch (TimeoutException)
            {
                if (ingoingMailClient is Imap4Client)
                    throw new ImapConnectionTimeoutException();
                if (ingoingMailClient is Pop3Client)
                    throw new Pop3ConnectionTimeoutException();
                else
                    throw new SmtpConnectionTimeoutException();
            }
            finally
            {
                if (ingoingMailClient.IsConnected)
                {
                    try
                    {
                        ingoingMailClient.Disconnect();
                    }
                    catch {}
                    
                }
            }
        }