private static void Main(string[] args)
        {
            var options = new Options();

            if (!CommandLine.Parser.Default.ParseArgumentsStrict(args, options,
                                                                 () => Console.WriteLine(@"Bad command line parameters.")))
            {
                ShowAnyKey();
                return;
            }

            try
            {
                var reloadList = new Dictionary <int, List <int> >();

                if (!string.IsNullOrEmpty(options.PathToJson) && File.Exists(options.PathToJson))
                {
                    using (var streamReader = new StreamReader(options.PathToJson))
                    {
                        using (var reader = new JsonTextReader(streamReader))
                        {
                            var jObject = JObject.Load(reader);

                            if (jObject["data"] == null || !jObject["data"].Any())
                            {
                                Console.WriteLine(@"[ERROR] json tasks not found. Array is empty.");

                                ShowAnyKey();
                                return;
                            }

                            var results = jObject["data"].ToList().GroupBy(
                                p => Convert.ToInt32(p["id_mailbox"]),
                                p => Convert.ToInt32(p["id"]),
                                (key, g) => new { MailboxId = key, Ids = g.ToList() });

                            foreach (var result in results)
                            {
                                if (reloadList.ContainsKey(result.MailboxId))
                                {
                                    continue;
                                }

                                reloadList.Add(result.MailboxId, result.Ids);
                            }
                        }
                    }
                }
                else
                {
                    if (options.MailboxId < 0)
                    {
                        Console.WriteLine(@"[ERROR] MailboxId invalid.");

                        ShowAnyKey();
                        return;
                    }

                    if (options.MessageId < 0)
                    {
                        Console.WriteLine(@"[ERROR] MailboxId invalid.");

                        ShowAnyKey();
                        return;
                    }


                    reloadList.Add(options.MailboxId, new List <int> {
                        options.MessageId
                    });
                }

                foreach (var reloadItem in reloadList)
                {
                    MailClient client = null;

                    try
                    {
                        var mailboxId = reloadItem.Key;

                        Console.WriteLine(@"Searching account with id {0}", mailboxId);

                        var mailbox = GetMailBox(mailboxId);

                        if (mailbox == null)
                        {
                            Console.WriteLine(@"[ERROR] Account not found.");
                            ShowAnyKey();
                            return;
                        }

                        var messageIds = reloadItem.Value;

                        foreach (var messageId in messageIds)
                        {
                            Console.WriteLine(@"Searching message with id {0}", messageId);

                            if (messageId < 0)
                            {
                                Console.WriteLine(@"[ERROR] MessageId not setup.");
                                continue;
                            }

                            var storedMessage = GetMail(mailbox, messageId);

                            if (storedMessage == null)
                            {
                                Console.WriteLine(@"[ERROR] Message not found.");
                                continue;
                            }

                            var messageUid = storedMessage.Uidl;

                            if (mailbox.Imap)
                            {
                                var uidlStucture = ParserImapUidl(messageUid);
                                if (uidlStucture.folderId != FolderType.Inbox)
                                {
                                    Console.WriteLine(@"Only inbox messages are supported for downloading.");
                                    continue;
                                }
                            }

                            var certificatePermit = ConfigurationManager.AppSettings["mail.certificate-permit"] !=
                                                    null &&
                                                    Convert.ToBoolean(
                                ConfigurationManager.AppSettings["mail.certificate-permit"]);

                            var log = new NullLog();

                            if (client == null)
                            {
                                client = new MailClient(mailbox, CancellationToken.None,
                                                        certificatePermit: certificatePermit);
                            }

                            MimeMessage mimeMessage;

                            try
                            {
                                mimeMessage = client.GetInboxMessage(messageUid);
                            }
                            catch (Exception e)
                            {
                                Console.WriteLine(@"[ERROR] Failed GetInboxMessage(""{0}"") Exception: {1}", messageUid, e);
                                continue;
                            }

                            MailMessageData message;

                            try
                            {
                                message = mimeMessage.ConvertToMailMessage(new MailFolder(FolderType.Inbox, ""),
                                                                           storedMessage.IsNew, storedMessage.ChainId, storedMessage.ChainDate,
                                                                           storedMessage.StreamId, mailboxId, false, log);
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine(@"[ERROR] Failed ConvertToMailMessage(""{0}"") Exception: {1}",
                                                  messageUid, ex);
                                continue;
                            }

                            if (!storedMessage.From.Equals(MailUtil.NormalizeStringForMySql(message.From)) ||
                                !storedMessage.To.Equals(MailUtil.NormalizeStringForMySql(message.To)) ||
                                !storedMessage.Subject.Equals(MailUtil.NormalizeStringForMySql(message.Subject)))
                            {
                                Console.WriteLine(@"storedMessage.From = '{0}'", storedMessage.From);
                                Console.WriteLine(@"message.From = '{0}'",
                                                  MailUtil.NormalizeStringForMySql(message.From));

                                Console.WriteLine(@"storedMessage.To = '{0}'", storedMessage.To);
                                Console.WriteLine(@"message.To = '{0}'",
                                                  MailUtil.NormalizeStringForMySql(message.To));

                                Console.WriteLine(@"storedMessage.Subject = '{0}'", storedMessage.Subject);
                                Console.WriteLine(@"message.Subject = '{0}'",
                                                  MailUtil.NormalizeStringForMySql(message.Subject));

                                Console.WriteLine(@"[ERROR] Stored message not equals to server message");
                                continue;
                            }

                            if (storedMessage.Attachments.Any() && message.Attachments.Any())
                            {
                                var newAttachments = new List <MailAttachmentData>();

                                foreach (var attachment in message.Attachments)
                                {
                                    var storedAttachment =
                                        storedMessage.Attachments.FirstOrDefault(
                                            a =>
                                            (!string.IsNullOrEmpty(a.fileName) &&
                                             a.fileName.Equals(attachment.fileName,
                                                               StringComparison.InvariantCultureIgnoreCase)) ||
                                            !string.IsNullOrEmpty(a.contentId) &&
                                            a.contentId.Equals(attachment.contentId,
                                                               StringComparison.InvariantCultureIgnoreCase) ||
                                            !string.IsNullOrEmpty(a.contentLocation) &&
                                            a.contentLocation.Equals(attachment.contentLocation,
                                                                     StringComparison.InvariantCultureIgnoreCase));

                                    if (storedAttachment == null)
                                    {
                                        continue;
                                    }

                                    attachment.fileName   = storedAttachment.fileName;
                                    attachment.storedName = storedAttachment.storedName;
                                    attachment.fileNumber = storedAttachment.fileNumber;
                                    attachment.streamId   = storedAttachment.streamId;
                                    attachment.mailboxId  = storedAttachment.mailboxId;
                                    attachment.tenant     = storedAttachment.tenant;
                                    attachment.user       = storedAttachment.user;

                                    newAttachments.Add(attachment);
                                }

                                message.Attachments = newAttachments;
                            }

                            if (!MessageEngine.TryStoreMailData(message, mailbox, log))
                            {
                                Console.WriteLine(@"[ERROR] Failed to store mail data");
                                continue;
                            }

                            Console.WriteLine(@"[SUCCESS] Mail ""{0}"" data was reloaded", messageId);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.ToString());
                    }
                    finally
                    {
                        if (client != null)
                        {
                            client.Dispose();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

            ShowAnyKey();
        }