using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Mail; using System.Net; using System.Xml; using System.Windows.Forms; using sharpknife.Data; using sharpknife.Utils; using sharpknife.Engines; using System.Collections.Specialized; namespace sharpknife.Commands { public class CheckMailCommand : Command { private List mailBoxes = new List(); public CheckMailCommand() { Group = "Mail"; Timeout = 120; string machineName = Environment.MachineName.ToLowerInvariant(); using (databaseEntities context = new databaseEntities()) { var query = (from m in context.MailBox where (m.AllowedHost == "*" || m.AllowedHost == machineName) select m).ToList(); mailBoxes = query; } } public override void Execute() { Debug = "Executing"; base.Execute(); foreach (MailBox mailBox in mailBoxes) { PopClient client = new PopClient(mailBox.Host, mailBox.Port.Value, mailBox.Username, mailBox.Password); client.Connect(); int messages = client.Messages; int newMessages = 0; Debug = string.Format("Found messages: {0}", messages); for (int i = 0; i < messages; i++) { Debug = string.Format("Processing {0}/{1}", i + 1, messages); string message = client.Retrieve(i + 1); Queue lines = MailUtils.SplitLines(message); NameValueCollection headers = MailUtils.ParseHeaders(lines); string boundary = string.Empty; if (StringUtils.Contains(message, "boundary")) { boundary = StringUtils.GetTokens(message, "{}boundary={}\r\n{}")[1]; } DateTime date = DateTime.Parse(headers["date"]); string messageId = headers["message-id"]; string subject = headers["subject"]; string from = headers["from"]; string to = headers["to"]; List parts = MailUtils.ParseBody(lines, boundary); string body = string.Empty; if (parts.Count > 1) { foreach (MimePart part in parts) { //Content-Type: text/html; charset=iso-8859-1 if (StringUtils.Contains(part.headers["content-type"], "text/html")) { body = part.body; break; } } } else if (string.IsNullOrEmpty(body) || parts.Count == 1) { body = parts[0].body; } if (!Mail.Exists(messageId)) { Mail mail = new Mail() { From = from, To = to, Subject = subject, Body = body, MailNumber = i + 1, MessageId = messageId, Date = date, MailBoxId = mailBox.MailBoxId }; mail.Save(); newMessages++; } else { using (databaseEntities context = new databaseEntities()) { Mail mail = (from m in context.Mail where m.MessageId == messageId select m).FirstOrDefault(); mail.MailNumber = i + 1; mail.MailBoxId = mailBox.MailBoxId; mail.Save(); } } } client.Disconnect(); Debug = string.Format("New messages: {0}/{1}", newMessages, messages); } Status = StatusCode.Completed; } } }