/// <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(); }
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; } }
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(); }