static UMail()
        {
            ItemAttributes ia = Config.DefaultService.ConfigAttributes;

            Mailer = new Mailer();

            Mailer.Templates.Add(MailTemplateE.ActivateAccount.ToString(), ia.ToString(AttributeE.ServiceTemplateEmailSubjectActivateAccount), ia.ToString(AttributeE.ServiceTemplateEmailBodyActivateAccount));
            Mailer.Templates.Add(MailTemplateE.ForgotPassword.ToString(), ia.ToString(AttributeE.ServiceTemplateEmailSubjectForgotPassword), ia.ToString(AttributeE.ServiceTemplateEmailBodyForgotPassword));

            Mailer.SmtpServer = ia.ToString(AttributeE.ServiceSmtpServer);
            Mailer.SmtpPort = ia.ToInt32(AttributeE.ServiceSmtpPort);
            Mailer.SmtpAuthenticate = ia.ToBool(AttributeE.ServiceSmtpAuthenticate);
            Mailer.SmtpUseSsl = ia.ToBool(AttributeE.ServiceSmtpUseSsl);
            Mailer.SmtpUserId = ia.ToString(AttributeE.ServiceSmtpUserId);
            Mailer.SmtpPassword = ia.ToString(AttributeE.ServiceSmtpPassword);
            Mailer.From = ia.ToString(AttributeE.ServiceSmtpFrom);
        }
        public MailVerifyResult DoVerify(Mailer mail)
        {
            this.mail = mail;
            host = Dns.Resolve(mail.SmtpServer);
            ourSmtp = new IPEndPoint(host.AddressList[0], mail.SmtpPort);
            socket = new Socket(ourSmtp.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            socket.Connect(ourSmtp);
            if (!CheckResponse(SmtpResponse.ConnectSuccess))
            {
                socket.Close();
                return MailVerifyResult.ConnectFailed;
            }

            // The SMTP HELO clause is the stage of the SMTP protocol 
            // where a SMTP server introduce them selves to each other. 
            // The sending server will identify who it is and the receiving 
            // server will (as per RFC) accept any given name. There is no 
            // requirement to give the correct information at this stage. 
            SendData(string.Format("HELO {0}" + Environment.NewLine, Dns.GetHostName()));
            if (!CheckResponse(SmtpResponse.GenericSuccess))
            {
                socket.Close();
                return MailVerifyResult.HeloFailed;
            }

            // The SMTP MAIL clause defines the sender of the mail message. 
            // There is no requirement for this address to be the same as 
            // the address given in the From clause of the message itself.
            SendData(string.Format("MAIL From: {0}" + Environment.NewLine, mail.From));
            if (!CheckResponse(SmtpResponse.GenericSuccess))
            {
                socket.Close();
                return MailVerifyResult.MailFailed;
            }

            if (!VerifyAddress(mail.To))
            {
                socket.Close();
                return MailVerifyResult.ToFailed;
            }

            if (!VerifyAddress(mail.Cc))
            {
                socket.Close();
                return MailVerifyResult.CcFailed;
            }

            if (!VerifyAddress(mail.Bcc))
            {
                socket.Close();
                return MailVerifyResult.BccFailed;
            }

            if (MailVerifyLevel == MailVerifyLevel.Address)
            {
                return MailVerifyResult.Ok;
            }

            #region Create Message
            StringBuilder msg = new StringBuilder();

            msg.Append("From: " + mail.From + Environment.NewLine);
            AddRecipent(msg, mail.To, RecipentType.To);
            AddRecipent(msg, mail.Cc, RecipentType.Cc);
            AddRecipent(msg, mail.Bcc, RecipentType.Bcc);
            msg.Append("Date: ");
            msg.Append(DateTime.Now.ToString("ddd, d M y H:m:s z"));
            msg.Append(Environment.NewLine);
            msg.Append("Subject: " + mail.Subject + Environment.NewLine);
            msg.Append("X-Mailer: SMTPDirect v1" + Environment.NewLine);
            AppendBody(msg);
            #endregion

            SendData(("DATA" + Environment.NewLine));
            if (!CheckResponse(SmtpResponse.DataSuccess))
            {
                socket.Close();
                return MailVerifyResult.DataFailed;
            }

            SendData(msg.ToString());
            if (!CheckResponse(SmtpResponse.GenericSuccess))
            {
                socket.Close();
                return MailVerifyResult.SendFailed;
            }

            SendData("QUIT" + Environment.NewLine);
            if (!CheckResponse(SmtpResponse.QuitSuccess))
            {
                socket.Close();
                return MailVerifyResult.QuitFailed;
            }
            else
            {
                socket.Close();
                return MailVerifyResult.Ok;
            }
        }
        public MailVerifyResult Verify(Mailer mail)
        {
            if (level == MailVerifyLevel.None)
            {
                return MailVerifyResult.Ok;
            }

            MailVerifyResult result = MailVerifyResult.Failed;

            MailVerifier v = new MailVerifier();

            try
            {
                result = v.DoVerify(mail);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return result;
        }