/// <summary> /// 接受邮件,处理所有正确存在邮件 /// </summary> public MailResult ReceiveMail(string asmName, string typeName, string methodName, bool delete, string stateText) { MailResult result = new MailResult(); result.StateText = stateText; string strPort = ""; if (strPort == "" || strPort == string.Empty) { strPort = "110"; } POPClient popClient = new POPClient(); try { popClient.Connect(PopServer, Convert.ToInt32(strPort)); popClient.Authenticate(UserName, Password); int count = popClient.GetMessageCount(); int resultCount = 0; for (int i = count; i >= 1; i--) { OpenPOP.MIMEParser.Message msg = popClient.GetMessage(i, false); if (msg != null) { resultCount++; //获取DLL所在路径: string dllPath = new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath; dllPath = Path.GetDirectoryName(dllPath); //依据所要执行类类型名,获取类实例: string asmNames = asmName;//程序集名称(*.dll) string dllFile = Path.Combine(dllPath, asmNames); Assembly asm = Assembly.LoadFrom(dllFile); //获取类方法并执行: object obj = asm.CreateInstance(typeName, false); Type type = obj.GetType(); //类名 MethodInfo method = type.GetMethod(methodName); //方法名称 //如果需要参数则依此行 object[] args = new object[] { (object)msg, (object)result }; //执行并调用方法 method.Invoke(obj, args); if (delete) { popClient.DeleteMessage(i); //邮件保存成功,删除服务器备份 } } } result.Count = resultCount; } catch (Exception ex) { throw ex; } finally { popClient.Disconnect(); } return(result); }
private void MessagedataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex == 0) { int size = (int)client.GetMessageSize(e.RowIndex + 1); if (size > 0) { progressBar1.Maximum = size; SizeLabel.Text = " bytes of " + size.ToString() + " read..";; AsyncCallback callback = new AsyncCallback(callbackmethod); client.BeginFetchMail(e.RowIndex + 1, callback, null); } } if (e.ColumnIndex == 1) { if (client.DeleteMessage(e.RowIndex + 1)) { MessageBox.Show(string.Format("Message {0} deleted.", e.RowIndex + 1), "Deleted", MessageBoxButtons.OK, MessageBoxIcon.Information); } } }
/// <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(); }
/// <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()."); }
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(); }
/// <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(); }