/// <summary>
        /// Download and process email messages from the POP3 server.
        /// </summary>
        /// <param name="server">POP3 server information</param>
        public static void DownloadMessages()
        {
            Trace.WriteLine("Entered DownloadMessages().");

            // Get POP3 server info
            PopServer server = GetPopServer();
            Trace.WriteLine("  Retrieved POP server info.");

            // connect to POP3 server and download messages
            //FoeDebug.Print("Connecting to POP3 server...");
            POPClient popClient = new POPClient();
            popClient.IsUsingSsl = server.SslEnabled;

            popClient.Disconnect();
            popClient.Connect(server.ServerName, server.Port);
            popClient.Authenticate(server.UserName, server.Password);

            Trace.WriteLine("  Connected to POP3.");

            // get mail count
            int count = popClient.GetMessageCount();
            Trace.WriteLine("  There are " + count.ToString() + " messages in inbox.");

            // go through each message, from newest to oldest
            for (int i = count; i >= 1; i -= 1)
            {
                Trace.WriteLine("  Opening message #" + i.ToString());

                OpenPOP.MIMEParser.Message msg = popClient.GetMessage(i, true);
                if (msg != null)
                {
                    string subject = msg.Subject;
                    string fromEmail = msg.FromEmail;

                    Trace.WriteLine("  Message came from " + msg.FromEmail + " with subject \"" + msg.Subject + "\"");

                    // Check if fromEmail is the same as processor's email on file
                    if (fromEmail.ToLower() == FoeClientRegistry.GetEntry("processoremail").Value.ToLower())
                    {
                        Trace.WriteLine("  Message came from the processor.");

                        // parse subject line
                        string[] tokens = subject.Trim().Split(new char[] { ' ' });

                        // There should be 5 or 6 tokens
                        if (tokens.Length == 5)
                        {
                            Trace.WriteLine("  There are 5 tokens.");

                            // Get the request ID for this reply
                            string requestId = tokens[2];

                            // Check if request ID matches any request the client sent
                            FoeClientRequestItem req = FoeClientRequest.Get(requestId);

                            if (req != null)
                            {
                                Trace.WriteLine("  Message Request ID matched.");

                                // Found the matching request
                                // Download the full reply
                                OpenPOP.MIMEParser.Message wholeMsg = popClient.GetMessage(i, false);
                                string msgBody = (string)wholeMsg.MessageBody[0];

                                Trace.WriteLine("  Downloaded full message body.");

                                try
                                {
                                    // decompress it
                                    byte[] compressedMsg = Convert.FromBase64String(msgBody);
                                    Trace.WriteLine("  Decoded Base64 message.");

                                    byte[] decompressedMsg = CompressionManager.Decompress(compressedMsg);
                                    Trace.WriteLine("  Decompressed message.");

                                    string foe = Encoding.UTF8.GetString(decompressedMsg);
                                    Trace.WriteLine("  Retrieved original FOE message.");

                                    // Check what is the original request type
                                    if (req.Type.ToLower() == "registe")
                                    {
                                        Trace.WriteLine("  Registration reply. Processing message.");
                                        ProcessRegistrationReply(foe);
                                        Trace.WriteLine("  Registration reply processed.");
                                    }
                                    else if (req.Type.ToLower() == "catalog")
                                    {
                                        Trace.WriteLine("  Catalog reply. Processing message.");
                                        ProcessCatalogReply(foe);
                                        Trace.WriteLine("  Catalog reply processed.");
                                    }
                                    else if (req.Type.ToLower() == "feed")
                                    {
                                        Trace.WriteLine("  feed reply. Processing message.");
                                        ProcessCatalogReply(foe);
                                        Trace.WriteLine("  feed reply processed.");
                                    }
                                }
                                catch (Exception except)
                                {
                                    // the message is likely malformed
                                    // so just ignore it
                                    Trace.WriteLine("  Exception detected: \r\n" + except.ToString());
                                }
                            }
                            else
                            {
                                Trace.WriteLine("  Message ID mismatched.");
                            }
                        }
                        //content request's reply
                        else if (tokens.Length == 6)
                        {
                            Trace.WriteLine("  There are 6 tokens.");

                            // Get the request ID for this reply
                            string catalog = tokens[1];
                            string requestId = tokens[3];

                            // Check if request ID matches any request the client sent
                            FoeClientRequestItem req = FoeClientRequest.Get(requestId);

                            if (req != null)
                            {
                                Trace.WriteLine("  Message Request ID matched.");

                                // Found the matching request
                                // Download the full reply
                                OpenPOP.MIMEParser.Message wholeMsg = popClient.GetMessage(i, false);
                                string msgBody = (string)wholeMsg.MessageBody[0];

                                Trace.WriteLine("  Downloaded full message body.");

                                try
                                {
                                    byte[] compressed = Convert.FromBase64String(msgBody);
                                    byte[] decompressed = CompressionManager.Decompress(compressed);
                                    string foe = Encoding.UTF8.GetString(decompressed);

                                    // Check what is the original request type
                                    if (req.Type.ToLower() == "content")
                                    {
                                        Trace.WriteLine("  Content reply. Processing message.");
                                        ProcessContentReply(catalog, foe);
                                        Trace.WriteLine("  Content reply processed.");
                                    }
                                }
                                catch (Exception except)
                                {
                                    // the message is likely malformed
                                    // so just ignore it
                                    Trace.WriteLine("  Exception detected: \r\n" + except.ToString());
                                }
                            }
                            else
                            {
                                Trace.WriteLine("  Message ID mismatched.");
                            }
                        }
                        else
                        {
                            Trace.WriteLine("  Message does not have 5 tokens.");
                        }
                    }
                    else
                    {
                        Trace.WriteLine("  Message did not come from processor.");
                    }
                }
                // Delete the current message
                popClient.DeleteMessage(i);
                Trace.WriteLine("  Deleted current message in inbox.");
            }
            popClient.Disconnect();
            Trace.WriteLine("  Disconnected from POP server.");

            Trace.WriteLine("  Exiting DownloadMessages().");
        }
        /// <summary>
        /// Download and process email messages from the POP3 server.
        /// </summary>
        /// <param name="server">POP3 server information</param>
        public static void DownloadMessages()
        {
            // Get POP3 server info
            PopServer server = GetPopServer();

            // connect to POP3 server and download messages
            //FoeDebug.Print("Connecting to POP3 server...");
            POPClient popClient = new POPClient();
            popClient.IsUsingSsl = server.SslEnabled;

            popClient.Disconnect();
            popClient.Connect(server.ServerName, server.Port);
            popClient.Authenticate(server.UserName, server.Password);

            FoeDebug.Print("Connected to POP3.");

            // get mail count
            int count = popClient.GetMessageCount();

            // go through each message, from newest to oldest
            for (int i = count; i >= 1; i -= 1)
            {
                OpenPOP.MIMEParser.Message msg = popClient.GetMessage(i, true);
                if (msg != null)
                {
                    string subject = msg.Subject;
                    string fromEmail = msg.FromEmail;

                    // Check if fromEmail is the same as processor's email on file
                    if (fromEmail.ToLower() == FoeClientRegistry.GetEntry("processoremail").Value.ToLower())
                    {
                        // parse subject line
                        string[] tokens = subject.Trim().Split(new char[] { ' ' });

                        // There should be 5 tokens
                        if (tokens.Length == 5)
                        {
                            // Get the request ID for this reply
                            string requestId = tokens[2];

                            // Check if request ID matches any request the client sent
                            FoeClientRequestItem req = FoeClientRequest.Get(requestId);
                            if (req != null)
                            {
                                // Found the matching request
                                // Download the full reply
                                OpenPOP.MIMEParser.Message wholeMsg = popClient.GetMessage(i, false);
                                string msgBody = (string)wholeMsg.MessageBody[0];

                                try
                                {
                                    // decompress it
                                    byte[] compressedMsg = Convert.FromBase64String(msgBody);
                                    byte[] decompressedMsg = CompressionManager.Decompress(compressedMsg);
                                    string foeXml = Encoding.UTF8.GetString(decompressedMsg);

                                    // Check what is the original request type
                                    if (req.Type.ToLower() == "reg")
                                    {
                                        ProcessRegistrationReply(foeXml);
                                    }
                                    else if (req.Type.ToLower() == "content")
                                    {
                                        ProcessContentReply(foeXml);
                                    }
                                    else if (req.Type.ToLower() == "catalog")
                                    {
                                        ProcessCatalogReply(foeXml);
                                    }
                                }
                                catch (Exception)
                                {
                                    // the message is likely malformed
                                    // so just ignore it
                                }
                            }
                        }
                    }
                }
                // Delete the current message
                popClient.DeleteMessage(i);
            }
            popClient.Disconnect();
        }
Beispiel #3
0
        private object[] PopMailScan()
        {
            POPClient currentPopClient = new POPClient();
            Message currentMessage;
            int msgNumber;
            int j = 0;
            object[] tmpObjectArray;

            try
            {
                Utils.MaMessage(String.Format(tsl.T("[POPSCANCONNECTING]"), DateTime.Now.ToString(TimeFormat), CurrentConfig.InputPopHost, CurrentConfig.InputPopPort));

                //Establishing connection to mail server
                currentPopClient.Connect(CurrentConfig.InputPopHost, CurrentConfig.InputPopPort);
                if (currentPopClient.Connected)
                {
                    // Retrieve credentials
                    Utils.MaMessage(String.Format(tsl.T("[POPSCANCONNECTED]"), DateTime.Now.ToString(TimeFormat), CurrentConfig.InputPopHost), Utils.maMessageLineType.WriteLine, Utils.maMessageOutput.ConsoleAndLog, CurrentConfig.LogFile);
                    GetCredentials(ref CurrentConfig.InputPopLogin, ref CurrentConfig.InputPopPassword, "[LOGININPUT]", "[PASSWORDINPUT]");
                    //Authenticate
                    currentPopClient.Authenticate(CurrentConfig.InputPopLogin, CurrentConfig.InputPopPassword);
                    // Get message Number
                    msgNumber = currentPopClient.GetMessageCount();
                    Utils.MaMessage(String.Format(tsl.T("[POPSCANFOUND]"), DateTime.Now.ToString(TimeFormat), msgNumber), Utils.maMessageLineType.WriteLine, Utils.maMessageOutput.ConsoleAndLog, CurrentConfig.LogFile);
                    //dimension array
                    tmpObjectArray = new object[msgNumber];

                    // Setting array
                    for (int i=0; i<msgNumber ; i++)
                    {
                       //Get message header
                        currentMessage = currentPopClient.GetMessageHeader(i + 1);
                        // If subject matches filter
                        if (currentMessage.Subject.Contains(CurrentConfig.InputPopFilter))
                        {
                            // Get message
                            Utils.MaMessage(String.Format(tsl.T("[POPSCANRETRIEVING]"), DateTime.Now.ToString(TimeFormat), i + 1, msgNumber));
                            currentMessage = currentPopClient.GetMessage(i + 1, false);
                            // If there is an attachment, store message and delete it
                            if (currentMessage.HasAttachment)
                            {
                                tmpObjectArray[j] = currentMessage;
                                if (CurrentConfig.InputPopDeleteMessages)
                                {
                                    currentPopClient.DeleteMessage(i + 1);
                                }
                                j++;
                            }
                            else
                                Utils.MaMessage(String.Format(tsl.T("[POPSCANNOATT]"), DateTime.Now.ToString(TimeFormat), i + 1, msgNumber));

                        }
                        else
                        {
                            Utils.MaMessage(String.Format(tsl.T("[POPSCANNOMATCH]"), DateTime.Now.ToString(TimeFormat), i + 1, msgNumber,CurrentConfig.InputPopFilter, currentMessage.Subject));

                        }
                    }
                    tmpObjectArray = Utils.ResizeObjectArray(tmpObjectArray, j);

                    currentPopClient.Disconnect();
                    return tmpObjectArray;
                }
                else
                {
                    throw new Exception(tsl.T("[POPSCANNOCONNECTION]"));
                }
            }
            catch (Exception e)
            {
                Utils.MaMessage(String.Format(tsl.T("[POPSCANERROR]"), DateTime.Now.ToString(TimeFormat), e.Message), Utils.maMessageLineType.WriteLine, Utils.maMessageOutput.ConsoleAndLog, CurrentConfig.LogFile);
                return null;
            }
        }
Beispiel #4
0
 static void CheckMail()
 {
     try
     {
         Console.WriteLine("Checking Mailbox");
         POPClient pop3 = new POPClient();
         pop3.Connect(settings.Default.EmailHost, 110, false);
         pop3.Authenticate(settings.Default.EmailUsername, settings.Default.EmailPassword);
         int i = 0;
         while (i <= pop3.GetMessageCount())
         {
             Console.WriteLine(pop3.GetMessageCount());
             var msg = pop3.GetMessage(i);
             if (msg != null && msg.MessageBody.Capacity > 0 && !string.IsNullOrEmpty(msg.MessageBody[0]) && msg.Headers.From.ToString() == settings.Default.EmailFromAddress)
             {
                 Console.WriteLine("Marking message for deletion..");
                 pop3.DeleteMessage(i);
                 string msgbody = msg.MessageBody[0].Replace("\n", " ");
                 msgbody = msgbody.Replace("\r", " ");
                 var msgsplit = new StringStream(msgbody);
                 msgbody = msgsplit.NextWord("=====");
                 BuildNotifier.Irc.CommandHandler.Msg(settings.Default.NotificationChannel, msgbody);
                 Console.WriteLine(msgbody);
             }
             i++;
         }
         Console.WriteLine("Closing connection, deleting messages");
         pop3.Disconnect();
     }
     catch (Exception e)
     {
         WriteErrorSystem.WriteError(null, e.Message + e.Data + e.Source + e.StackTrace);
     }
 }
        /// <summary>
        /// Download email messages from the POP3 server for a given Foe message processor.
        /// </summary>
        /// <param name="server">POP3 server information</param>
        /// <param name="processorEmail">The current Foe message processor's email address.</param>
        public static void DownloadMessages(PopServer server, string processorEmail)
        {
            // connect to POP3 server and download messages
            //FoeDebug.Print("Connecting to POP3 server...");
            POPClient popClient = new POPClient();
            popClient.IsUsingSsl = server.SslEnabled;

            popClient.Disconnect();
            popClient.Connect(server.ServerName, server.Port);
            popClient.Authenticate(server.UserName, server.Password);

            FoeDebug.Print("Connected to POP3.");

            // get mail count
            int count = popClient.GetMessageCount();

            FoeDebug.Print("Server reported " + count.ToString() + " messages.");

            // go through each message, from newest to oldest
            for (int i = count; i >= 1; i -= 1)
            {
                //FoeDebug.Print("Opening mail message...");

                OpenPOP.MIMEParser.Message msg = popClient.GetMessage(i, true);
                if (msg != null)
                {
                    // Get subject and verify sender identity
                    // Subject line in the mail header should look like one of the followings:
                    //
                    // Normal request (for news feed and content):
                    //   Subject: Request <Request ID> by <User ID>
                    //
                    // Registration request:
                    //   Subject: Register <Request ID> by Newbie
                    //
                    // where:
                    // Request ID is the request ID generated by the Foe client
                    // User ID is the user's ID as assigned by the server

                    //FoeDebug.Print("Message is not null. Getting message details.");

                    string subject = msg.Subject;
                    string fromEmail = msg.FromEmail;

                    //FoeDebug.Print("Subject: " + subject);
                    //FoeDebug.Print("From: " + fromEmail);

                    // parse subject line
                    string[] tokens = subject.Trim().Split(new char[] { ' ' });
                    if (tokens.Length == 4)
                    {
                        // check what type of request is it
                        string requestType = tokens[0].ToUpper();
                        string requestId = tokens[1];
                        string userId = tokens[3];

                        FoeServerLog.Add(_className + ".DownloadMessages", FoeServerLog.LogType.Message,
                                "subject: " + subject + "requestType: "+ requestType);
                        if (requestType.ToUpper().CompareTo("REGISTE") == 0)
                        {
                            //FoeDebug.Print("This is a registration message.");
                            // It's a registration request
                            SaveRegistrationRequest(requestId, fromEmail, processorEmail);

                            FoeServerLog.Add(_className + ".DownloadMessages", FoeServerLog.LogType.Message,
                                "Received registration request from " + fromEmail);
                        }
                        else if (requestType.ToUpper().CompareTo("CATALOG") == 0)
                        {
                            // get user info by email address
                            FoeUser user = FoeServerUser.GetUser(fromEmail);

                            // verify user's email against the user ID
                            if ((user != null) && (userId == user.UserId) && (processorEmail == user.ProcessorEmail))
                            {
                                FoeDebug.Print("User verified.");

                                // the user's identity is verified
                                SaveCatalogRequest(requestId, user.Email, processorEmail);

                            }
                            else
                            {
                                //FoeDebug.Print("User is not registered. Request not processed.");
                                FoeServerLog.Add(_className + ".DownloadMessages", FoeServerLog.LogType.Warning,
                                    "Received content request from unregistered user " + fromEmail);
                            }
                        }
                        else if (requestType.ToUpper().CompareTo("CONTENT") == 0)
                        {
                            //FoeDebug.Print("This is a content request message.");

                            // It's a content request.
                            // We need to verify the user's identify first.

                            //FoeDebug.Print("Verifying user identity...");

                            // get user info by email address
                            FoeUser user = FoeServerUser.GetUser(fromEmail);

                            // verify user's email against the user ID
                            if ((user != null) && (userId == user.UserId) && (processorEmail == user.ProcessorEmail))
                            {
                                FoeDebug.Print("User verified.");

                                // the user's identity is verified
                                // get the full message body
                                OpenPOP.MIMEParser.Message wholeMsg = popClient.GetMessage(i, false);
                                string msgBody = (string)wholeMsg.MessageBody[0];

                                try
                                {
                                    // decompress it
                                    byte[] compressedMsg = Convert.FromBase64String(msgBody);
                                    byte[] decompressedMsg = CompressionManager.Decompress(compressedMsg);
                                    string foe = Encoding.UTF8.GetString(decompressedMsg);

                                    string[] catalogs = foe.Trim().Split(new char[] { ',' });
                                    // save request
                                    if (catalogs.Length == 0)
                                    {
                                        return;
                                    }
                                    SaveContentRequest(requestId, user.Email, catalogs, processorEmail);

                                    //FoeDebug.Print("Request saved and pending processing.");
                                    FoeServerLog.Add(_className + ".DownloadMessages", FoeServerLog.LogType.Message,
                                        "Received content request from verified user " + fromEmail);
                                }
                                catch (Exception except)
                                {
                                    // the message is likely malformed
                                    // so just ignore it
                                    FoeServerLog.Add(_className + ".DownloadMessages", FoeServerLog.LogType.Warning,
                                        "Received malformed content request from verified user " + fromEmail + "\r\n" +
                                        except.ToString() +
                                        "Raw message:\r\n" + msgBody + "\r\n");

                                    //throw except;
                                }
                            }
                            else
                            {
                                //FoeDebug.Print("User is not registered. Request not processed.");
                                FoeServerLog.Add(_className + ".DownloadMessages", FoeServerLog.LogType.Warning,
                                    "Received content request from unregistered user " + fromEmail);
                            }
                        }
                        else if (requestType.ToUpper().CompareTo("FEED") == 0)
                        {
                            //FoeDebug.Print("This is a content request message.");

                            // It's a content request.
                            // We need to verify the user's identify first.

                            //FoeDebug.Print("Verifying user identity...");

                            // get user info by email address
                            FoeUser user = FoeServerUser.GetUser(fromEmail);

                            // verify user's email against the user ID
                            if ((user != null) && (userId == user.UserId) && (processorEmail == user.ProcessorEmail))
                            {
                                FoeDebug.Print("User verified.");

                                // the user's identity is verified
                                // get the full message body
                                OpenPOP.MIMEParser.Message wholeMsg = popClient.GetMessage(i, false);
                                string msgBody = (string)wholeMsg.MessageBody[0];

                                try
                                {
                                    // decompress it
                                    byte[] compressedMsg = Convert.FromBase64String(msgBody);
                                    byte[] decompressedMsg = CompressionManager.Decompress(compressedMsg);
                                    string foe = Encoding.UTF8.GetString(decompressedMsg);

                                    string[] array = foe.Trim().Split(new char[] { ',' });
                                    // save request
                                    if (array.Length == 0)
                                    {
                                        return;
                                    }
                                    SaveFeedRequest(requestId, user.Email, array, processorEmail);

                                    //FoeDebug.Print("Request saved and pending processing.");
                                    FoeServerLog.Add(_className + ".DownloadMessages", FoeServerLog.LogType.Message,
                                        "Received feed request from verified user " + fromEmail);
                                }
                                catch (Exception except)
                                {
                                    // the message is likely malformed
                                    // so just ignore it
                                    FoeServerLog.Add(_className + ".DownloadMessages", FoeServerLog.LogType.Warning,
                                        "Received malformed feed request from verified user " + fromEmail + "\r\n" +
                                        except.ToString() +
                                        "Raw message:\r\n" + msgBody + "\r\n");

                                    //throw except;
                                }
                            }
                            else
                            {
                                //FoeDebug.Print("User is not registered. Request not processed.");
                                FoeServerLog.Add(_className + ".DownloadMessages", FoeServerLog.LogType.Warning,
                                    "Received content request from unregistered user " + fromEmail);
                            }
                        }
                        else
                        {
                            // Non-Foe message
                            FoeServerLog.Add(_className + ".DownloadMessages", FoeServerLog.LogType.Message,
                                "Received non-Foe message from " + fromEmail);
                        }
                    }
                    else
                    {
                        // Non-Foe message
                        FoeServerLog.Add(_className + ".DownloadMessages", FoeServerLog.LogType.Message,
                            "Received non-Foe message from " + fromEmail);
                    }

                    // Delete the current message
                    popClient.DeleteMessage(i);
                }
            }
            popClient.Disconnect();
        }
        public void Execute(XmlNode node)
        {
            if (node.Attributes == null) return;

            XmlAttribute server = node.Attributes["Server"];
            XmlAttribute port = node.Attributes["Port"];
            XmlAttribute username = node.Attributes["Username"];
            XmlAttribute password = node.Attributes["Password"];
            XmlAttribute connectionStringName = node.Attributes["ConnectionStringName"];
            
            var popClient = new POPClient();
            popClient.Connect(server.Value, int.Parse(port.Value), false);
            popClient.Authenticate(username.Value, password.Value);
            int count = popClient.GetMessageCount();

            if (count <= 0)
            {
                popClient.Disconnect();
                using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings[connectionStringName.Value].ConnectionString))
                {
                    connection.Open();
                    List<Product> productsFromBase = GetRelatedProductsFromBase(connection);
                    List<Product> allHouseFlowers = GetFlowers(connection);
                    foreach (var product in allHouseFlowers)
                    {
                        string diam = GetDiametr(product.ShortDescription);
                        int diametr;
                        if (Int32.TryParse(diam, out diametr))
                        {
                            List<Product> neededRelatedProducts = GetNeededRelatedProducts(productsFromBase, diametr);
                            List<Product> existingRelatedProducts = GetExistingRelatedProducts(connection, product.Id);
                            foreach (var p in existingRelatedProducts)
                            {
                                neededRelatedProducts.RemoveAll(x => (x.Id == p.Id));
                            }

                            UpdateRelatedProducts(connection, neededRelatedProducts, product);
                        }
                    }
                }
                return;
            }

            for (int i = count; i >= 1; i -= 1)
            {
                using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings[connectionStringName.Value].ConnectionString))
                {
                    connection.Open();
                    Message message = popClient.GetMessage(i);
                    string[] rows = message.MessageBody[0].Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

                    foreach (string row in rows)
                    {
                        try
                        {
                            string[] cols = row.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
                            if (cols[2].Contains("."))
                                continue;
                            string sku = cols[0];
                            decimal price = decimal.Parse(cols[1]);
                            int quantity = int.Parse(cols[2]);

                            using (var command = new SqlCommand(UpdateProductVariantQuery, connection))
                            {
                                command.Parameters.Add(new SqlParameter("@Sku", sku));
                                command.Parameters.Add(new SqlParameter("@Price", price));
                                command.Parameters.Add(new SqlParameter("@StockQuantity", quantity));

                                command.ExecuteNonQuery();
                            }

                            if (cols.Length == 5)
                            {
                                int height;
                                int diameter;
                                bool heightParsed = int.TryParse(cols[3], out height);
                                bool diameterParsed = int.TryParse(cols[4], out diameter);

                                using (var command = new SqlCommand(UpdateProductVariantQuery, connection))
                                {
                                    command.Parameters.Add(new SqlParameter("@Sku", sku));
                                    Product product = null;

                                    int saoHeightId = 0;
                                    if (heightParsed && height != 0)
                                    {
                                        product = GetProduct(connection, sku);

                                        if (height < 11) saoHeightId = 54;
                                        else if (height >= 11 && height < 16) saoHeightId = 55;
                                        else if (height >= 16 && height < 21) saoHeightId = 56;
                                        else if (height >= 21 && height < 26) saoHeightId = 57;
                                        else if (height >= 26 && height < 31) saoHeightId = 58;
                                        else if (height >= 31 && height < 50) saoHeightId = 64;
                                        else if (height >= 50) saoHeightId = 60;

                                        if (product != null && !SaoExists(connection, product.Id, saoHeightId))
                                        {
                                            InsertSao(connection, product.Id, saoHeightId);
                                        }

                                    }

                                    int saoDiameterId = 0;
                                    if (diameterParsed && diameter != 0)
                                    {
                                        if (product == null)
                                            product = GetProduct(connection, sku);

                                        if (diameter < 11) saoDiameterId = 16;
                                        else if (diameter >= 11 && diameter < 16) saoDiameterId = 18;
                                        else if (diameter >= 16 && diameter < 21) saoDiameterId = 48;
                                        else if (diameter >= 21 && diameter < 26) saoDiameterId = 49;
                                        else if (diameter >= 26 && diameter < 31) saoDiameterId = 50;
                                        else if (diameter >= 31 && diameter < 50) saoDiameterId = 51;
                                        else if (diameter >= 50) saoDiameterId = 52;

                                        if (product != null && !SaoExists(connection, product.Id, saoDiameterId))
                                        {
                                            InsertSao(connection, product.Id, saoDiameterId);
                                        }
                                    }

                                    if (product != null)
                                    {
                                        string oldShortDescription = product.ShortDescription;
                                        string oldFullDescription = product.FullDescription;

                                        if (diameterParsed && heightParsed)
                                        {
                                            if (!product.ShortDescription.ToLower().Contains("(см)"))
                                                product.ShortDescription += (product.ShortDescription == string.Empty ? "" : "<br />") + string.Format("{0}X{1}(см)", height, diameter);
                                            if (!product.FullDescription.ToLower().Contains("высота"))
                                                product.FullDescription += (product.FullDescription == string.Empty ? "" : "<br />") + string.Format("Высота - {0} см", height);
                                            if (!product.FullDescription.ToLower().Contains("диаметр"))
                                                product.FullDescription += (product.FullDescription == string.Empty ? "" : "<br />") + string.Format("Диаметр - {0} см", diameter);
                                        }
                                        else if (heightParsed)
                                        {
                                            if (!product.ShortDescription.Contains(string.Format("{0}X-(см)", height)))
                                                product.ShortDescription += (product.ShortDescription == string.Empty ? "" : "<br />") + string.Format("{0}X-(см)", height);
                                            if (!product.FullDescription.ToLower().Contains("высота"))
                                                product.FullDescription += (product.FullDescription == string.Empty ? "" : "<br />") + string.Format("Высота - {0} см", height);
                                        }
                                        else if (diameterParsed)
                                        {
                                            if (!product.ShortDescription.Contains(string.Format("-X{0}(см)", diameter)))
                                                product.ShortDescription += (product.ShortDescription == string.Empty ? "" : "<br />") + string.Format("-X{0}(см)", diameter);
                                            if (!product.FullDescription.ToLower().Contains("диаметр"))
                                                product.FullDescription += (product.FullDescription == string.Empty ? "" : "<br />") + string.Format("Диаметр - {0} см", diameter);
                                        }

                                        
                                        if (oldShortDescription != product.ShortDescription || oldFullDescription != product.FullDescription)
                                            UpdateProduct(connection, product);                                     
                                    }
                                }
                            }
                        }
                        catch (Exception exc)
                        {
                            LogManager.InsertLog(LogTypeEnum.AdministrationArea, string.Format("Error while sync with 1C. The line is '{0}'.", row), exc);
                        }
                    }
                }

                popClient.DeleteMessage(i);
                popClient.Disconnect();
            }
            NopCache.Clear();
        }