public async Task Authentification(ServerAccount mailServer)
        {
            mailServer.ServerStatus = GoodState;
            string token = "";
            HttpResponseMessage response;

            //#1 try connect to server
            try
            {
                //go to login page
                response = await client.GetAsync("http://" + mailServer.Server + "/webmail/");

                var responseContent = await response.Content.ReadAsStringAsync();

                //try get token from answer
                token = GetToken(responseContent);
                if (token == "")
                {
                    var err = "Can't find token in server answer. Work with server unpossible";
                    mailServer.ServerStatus = err;
                    throw new Exception(err);
                }
            }
            catch (Exception ex)
            {
                mailServer.ServerStatus = ex.Message;
                throw ex;
            }
            //#2 try authentificate user on server
            try
            {
                //set auth param for url
                var data = new StringContent(
                    $"_token={token}&_task=login&_action=login&_timezone=Europe%2FMoscow&_url=" +
                    $"&_user={HttpUtility.UrlEncode(mailServer.Login)}" +
                    $"&_pass={HttpUtility.UrlEncode(mailServer.Pass)}",
                    Encoding.UTF8,
                    "application/x-www-form-urlencoded"
                    );
                //auth request
                response = await client.PostAsync($"http://{mailServer.Server}/webmail/?_task=login", data);

                var responseContent = await response.Content.ReadAsStringAsync();

                //check success authorization
                if (responseContent.Contains("mbox=INBOX"))
                {
                    mailServer.AccountStatus = GoodState;
                    return;
                }
                //try understand what happand with authorization
                CheckAuthorizStatus(responseContent, response, mailServer);
            }
            catch (Exception ex)
            {
                mailServer.AccountStatus = ex.Message;
                throw ex;
            }
        }
 public async Task CheckAuth(ServerAccount account)
 {
     //if auth will fale this method return exception and write error to account's status field
     try
     {
         await _sendService.Authentification(account);
     }
     catch (Exception ex)
     {
         Console.WriteLine(ex.Message);
     }
 }
        //this method can accept null hidden value and convert it to empty string
        public async Task SendMail(ServerAccount account, Receiver receiver, Receiver hiddenReceiver, Letter letter)
        {
            try
            {
                Validator.ChekParams(receiver, hiddenReceiver, letter);
                //if exist some problem we will write errors to status of instance
                await _sendService.SendAsync(account, receiver.EmailAddress, hiddenReceiver?.Status ?? "",
                                             letter.Subject, letter.Text);

                //if some error exist it write to server's status
            }catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
        public async Task SendAsync(ServerAccount mailServer, string receiver, string hiddenReceiver, string subject, string mailText)
        {
            //go to compose mail
            var response = await client.GetAsync($"http://{mailServer.Server}/webmail/?_task=mail&_action=compose");

            var responseContent = await response.Content.ReadAsStringAsync();

            //check auth
            //session can live only limit time and sometimes we should make authorization again
            if (responseContent.Contains("task=login"))
            {
                await Authentification(mailServer);

                response = await client.GetAsync($"http://{mailServer.Server}/webmail/?_task=mail&_action=compose");

                responseContent = await response.Content.ReadAsStringAsync();

                if (responseContent.Contains("task=login"))
                {
                    mailServer.ServerStatus = $"Can't compose letter status code {response.StatusCode.ToString()}";
                    throw new Exception(mailServer.ServerStatus);
                }
            }


            //Set all parametrs to post request
            string id    = GetId(responseContent);
            string token = GetToken(responseContent);

            StringContent fieldsData = new StringContent(
                $"_token={token}" +
                $"&_task=mail&_action=send&_id={id}" +
                $"&_attachments=&_from=1&_to={receiver}" +
                $"&_cc={hiddenReceiver}" +
                $"&_bcc={hiddenReceiver}" +
                "&_replyto=&_followupto=" +
                $"&_subject={subject}" +
                "&editorSelector=plain&_priority=0&_store_target=Sent&_draft_saveid=&_draft=&_is_html=0&_framed=1" +
                $"&_message={mailText}",
                Encoding.UTF8,
                "application/x-www-form-urlencoded");


            // send  requiest
            response = await client.PostAsync("http://" + mailServer.Server + "/webmail/?_task=mail&_unlock=loading" + TUnix.Timestamp().ToString() + "&_framed=1&_lang=en_US", fieldsData);

            if (response.StatusCode != HttpStatusCode.OK)
            {
                mailServer.ServerStatus = $"Sending error to email: {receiver}, server answer status:{response.StatusCode.ToString()}";
                throw new Exception(mailServer.ServerStatus);
            }
            responseContent = await response.Content.ReadAsStringAsync();

            //check success send message from server
            if (responseContent.Contains("sent_successfully"))
            {
                mailServer.ServerStatus = GoodState;
            }
            else
            {
                Regex rgx   = new Regex("(?<=display_message\\().*?(?=\\);)");
                var   match = rgx.Match(responseContent);
                if (match.Success)
                {
                    mailServer.ServerStatus =
                        $"Sending error to email: {receiver}, server answer:{match.Value}";
                }
                else
                {
                    mailServer.ServerStatus = $"Sending error to email: {receiver}";
                }
                throw new Exception(mailServer.ServerStatus);
            }
        }
 private void CheckAuthorizStatus(string responseContent, HttpResponseMessage response, ServerAccount account)
 {
     //wrong credy
     if (responseContent.Contains("task=login"))
     {
         throw new Exception("Can't authorize: wrong login or password");
     }
     //server's error
     if (response.StatusCode == HttpStatusCode.InternalServerError)
     {
         throw new Exception("Server's internal error");
     }
     //unknown problem
     throw new Exception(response.StatusCode.ToString());
 }