private void ClientOnGetMessage(object sender, MailClientMessageEventArgs mailClientMessageEventArgs) { var log = _log; Stopwatch watch = null; if (_tasksConfig.CollectStatistics) { watch = new Stopwatch(); watch.Start(); } var failed = false; var mailbox = mailClientMessageEventArgs.Mailbox; try { var mimeMessage = mailClientMessageEventArgs.Message; var uid = mailClientMessageEventArgs.MessageUid; var folder = mailClientMessageEventArgs.Folder; var unread = mailClientMessageEventArgs.Unread; log = mailClientMessageEventArgs.Logger; log.Debug("ClientOnGetMessage MailboxId = {0}, Address = '{1}'", mailbox.MailBoxId, mailbox.EMail); CoreContext.TenantManager.SetCurrentTenant(mailbox.TenantId); SecurityContext.AuthenticateMe(new Guid(mailbox.UserId)); var uidl = mailbox.Imap ? string.Format("{0}-{1}", uid, folder.FolderId) : uid; var message = MailRepository.Save(mailbox, mimeMessage, uidl, folder, unread, log); if (message != null && message.Id > 0) { log.Debug("DoOptionalOperations->START"); List <int> tagsIds = null; if (folder.Tags.Any()) { log.Debug("GetOrCreateTags()"); var manager = new MailBoxManager(log); tagsIds = manager.GetOrCreateTags(mailbox.TenantId, mailbox.UserId, folder.Tags); } DoOptionalOperations(message, mimeMessage, mailbox, tagsIds, log); } } catch (Exception ex) { log.Error("[ClientOnGetMessage] Exception:\r\n{0}\r\n", ex.ToString()); failed = true; } finally { if (_tasksConfig.CollectStatistics && watch != null) { watch.Stop(); LogStat(PROCESS_MESSAGE, mailbox, watch.Elapsed, failed); } } }
private void ClientOnGetMessage(object sender, MailClientMessageEventArgs mailClientMessageEventArgs) { var log = _log; Stopwatch watch = null; if (_tasksConfig.CollectStatistics) { watch = new Stopwatch(); watch.Start(); } var failed = false; var mailbox = mailClientMessageEventArgs.Mailbox; try { var mimeMessage = mailClientMessageEventArgs.Message; var uid = mailClientMessageEventArgs.MessageUid; var folder = mailClientMessageEventArgs.Folder; var unread = mailClientMessageEventArgs.Unread; log = mailClientMessageEventArgs.Logger; var uidl = mailbox.Imap ? string.Format("{0}-{1}", uid, (int)folder.Folder) : uid; log.InfoFormat("Found message (UIDL: '{0}', MailboxId = {1}, Address = '{2}')", uidl, mailbox.MailBoxId, mailbox.EMail); CoreContext.TenantManager.SetCurrentTenant(mailbox.TenantId); SecurityContext.AuthenticateMe(new Guid(mailbox.UserId)); var message = MessageEngine.Save(mailbox, mimeMessage, uidl, folder, null, unread, log); if (message == null || message.Id <= 0) { return; } log.InfoFormat("Message saved (id: {0}, From: '{1}', Subject: '{2}', Unread: {3})", message.Id, message.From, message.Subject, message.IsNew); log.Info("DoOptionalOperations->START"); DoOptionalOperations(message, mimeMessage, mailbox, folder, log); log.Info("DoOptionalOperations->END"); } catch (Exception ex) { log.ErrorFormat("[ClientOnGetMessage] Exception:\r\n{0}\r\n", ex.ToString()); failed = true; } finally { if (_tasksConfig.CollectStatistics && watch != null) { watch.Stop(); LogStat(PROCESS_MESSAGE, mailbox, watch.Elapsed, failed); } } }
private void ClientOnGetMessage(object sender, MailClientMessageEventArgs mailClientMessageEventArgs) { var log = _log; Stopwatch watch = null; if (_tasksConfig.CollectStatistics) { watch = new Stopwatch(); watch.Start(); } var failed = false; var mailbox = mailClientMessageEventArgs.Mailbox; try { var mimeMessage = mailClientMessageEventArgs.Message; var uid = mailClientMessageEventArgs.MessageUid; var folder = mailClientMessageEventArgs.Folder; var unread = mailClientMessageEventArgs.Unread; var fromEmail = mimeMessage.From.Mailboxes.FirstOrDefault(); log = mailClientMessageEventArgs.Logger; log.Debug("ClientOnGetMessage MailboxId = {0}, Address = '{1}'", mailbox.MailBoxId, mailbox.EMail); var manager = new MailBoxManager(log); var md5 = string.Format("{0}|{1}|{2}|{3}", mimeMessage.From.Mailboxes.Any() ? mimeMessage.From.Mailboxes.First().Address : "", mimeMessage.Subject, mimeMessage.Date.UtcDateTime, mimeMessage.MessageId).GetMd5(); var uidl = mailbox.Imap ? string.Format("{0}-{1}", uid, folder.FolderId) : uid; var fromThisMailBox = fromEmail != null && fromEmail.Address.ToLowerInvariant() .Equals(mailbox.EMail.Address.ToLowerInvariant()); var toThisMailBox = mimeMessage.To.Mailboxes.Select(addr => addr.Address.ToLowerInvariant()) .Contains(mailbox.EMail.Address.ToLowerInvariant()); log.Info( @"Message: Subject: '{1}' Date: {2} Unread: {5} FolderId: {3} ('{4}') MimeId: '{0}' Uidl: '{6}' Md5: '{7}' To->From: {8} From->To: {9}", mimeMessage.MessageId, mimeMessage.Subject, mimeMessage.Date, folder.FolderId, folder.Name, unread, uidl, md5, fromThisMailBox, toThisMailBox); List <int> tagsIds = null; if (folder.Tags.Any()) { log.Debug("GetOrCreateTags()"); tagsIds = manager.GetOrCreateTags(mailbox.TenantId, mailbox.UserId, folder.Tags); } log.Debug("SearchExistingMessagesAndUpdateIfNeeded()"); var found = manager.SearchExistingMessagesAndUpdateIfNeeded(mailbox, folder.FolderId, uidl, md5, mimeMessage.MessageId, fromThisMailBox, toThisMailBox, tagsIds); var needSave = !found; if (!needSave) { return; } log.Debug("DetectChainId()"); var chainId = manager.DetectChainId(mailbox, mimeMessage.MessageId, mimeMessage.InReplyTo, mimeMessage.Subject); var streamId = MailUtil.CreateStreamId(); log.Debug("Convert MimeMessage->MailMessage"); MailMessage message; try { message = mimeMessage.CreateMailMessage(folder.FolderId, unread, chainId, streamId, log); } catch (Exception ex) { log.Error("Convert MimeMessage->MailMessage: Exception: {0}", ex.ToString()); log.Debug("Creating fake message with original MimeMessage in attachments"); message = mimeMessage.CreateCorruptedMesage(folder.FolderId, unread, chainId, streamId); } log.Debug("TryStoreMailData()"); if (!TryStoreMailData(message, mailbox, log)) { failed = true; return; } var folderRestoreId = folder.FolderId == MailFolder.Ids.spam ? MailFolder.Ids.inbox : folder.FolderId; log.Debug("MailSave()"); var attempt = 1; while (attempt < 3) { try { message.Id = manager.MailSave(mailbox, message, 0, folder.FolderId, folderRestoreId, uidl, md5, true); break; } catch (MySqlException exSql) { if (!exSql.Message.StartsWith("Deadlock found")) { throw; } if (attempt > 2) { throw; } log.Warn("[DEADLOCK] MailSave() try again (attempt {0}/2)", attempt); attempt++; } } log.Debug("DoOptionalOperations()"); DoOptionalOperations(message, mimeMessage, mailbox, tagsIds, log); } catch (Exception ex) { log.Error("[ClientOnGetMessage] Exception:\r\n{0}\r\n", ex.ToString()); failed = true; } finally { if (_tasksConfig.CollectStatistics && watch != null) { watch.Stop(); LogStat(PROCESS_MESSAGE, mailbox, watch.Elapsed, failed); } } }
private void ClientOnGetMessage(object sender, MailClientMessageEventArgs mailClientMessageEventArgs) { var log = _log; try { var mimeMessage = mailClientMessageEventArgs.Message; var uid = mailClientMessageEventArgs.MessageUid; var folder = mailClientMessageEventArgs.Folder; var mailbox = mailClientMessageEventArgs.Mailbox; var unread = mailClientMessageEventArgs.Unread; var fromEmail = mimeMessage.From.Mailboxes.FirstOrDefault(); log = mailClientMessageEventArgs.Logger; var manager = new MailBoxManager(log); var md5 = string.Format("{0}|{1}|{2}|{3}", mimeMessage.From.Mailboxes.Any() ? mimeMessage.From.Mailboxes.First().Address : "", mimeMessage.Subject, mimeMessage.Date.UtcDateTime, mimeMessage.MessageId) .GetMd5(); var uidl = mailbox.Imap ? string.Format("{0}-{1}", uid, folder.FolderId) : uid; var fromThisMailBox = fromEmail != null && fromEmail.Address.ToLowerInvariant().Equals(mailbox.EMail.Address.ToLowerInvariant()); var toThisMailBox = mimeMessage.To.Mailboxes.Select(addr => addr.Address.ToLowerInvariant()) .Contains(mailbox.EMail.Address.ToLowerInvariant()); log.Info(@"Message: MimeId: '{0}' Subject: '{1}' Date: {2} FolderId: {3} ('{4}') Unread: {5} Uidl: '{6}' Md5: '{7}' To->From: {8} From->To: {9}", mimeMessage.MessageId, mimeMessage.Subject, mimeMessage.Date, folder.FolderId, folder.Name, unread, uidl, md5, fromThisMailBox, toThisMailBox); var tagsIds = folder.Tags.Any() ? manager.GetOrCreateTags(mailbox.TenantId, mailbox.UserId, folder.Tags) : null; var found = manager .SearchExistingMessagesAndUpdateIfNeeded( mailbox, folder.FolderId, uidl, md5, mimeMessage.MessageId, fromThisMailBox, toThisMailBox, tagsIds); var needSave = !found; if (!needSave) { return; } var chainId = manager.DetectChainId(mailbox, mimeMessage.MessageId, mimeMessage.InReplyTo, mimeMessage.Subject); var streamId = MailUtil.CreateStreamId(); log.Debug("MimeMessage->MailMessage"); var message = new MailMessage(mimeMessage, folder.FolderId, unread, chainId, streamId); if (!TryStoreMailData(message, mailbox, log)) { return; } log.Debug("MailSave()"); var folderRestoreId = folder.FolderId == MailFolder.Ids.spam ? MailFolder.Ids.inbox : folder.FolderId; message.Id = manager.MailSave(mailbox, message, 0, folder.FolderId, folderRestoreId, uidl, md5, true); log.Info("MailSave(Account:{0}) returned mailId = {1}\r\n", mailbox.EMail, message.Id); log.Debug("DoOptionalOperations()"); DoOptionalOperations(message, mimeMessage, mailbox, tagsIds, log); bool isMailboxRemoved; bool isMailboxDeactivated; DateTime beginDate; manager.GetMailBoxState(mailbox.MailBoxId, out isMailboxRemoved, out isMailboxDeactivated, out beginDate); if (mailbox.BeginDate != beginDate) { mailbox.BeginDateChanged = true; mailbox.BeginDate = beginDate; } var client = sender as MailClient; if (isMailboxRemoved) { if (client != null) { client.Cancel(); } manager.DeleteMessages( mailbox.TenantId, mailbox.UserId, new List <int> { (int)message.Id }); log.Info("MailBox with id={0} is removed.\r\n", mailbox.MailBoxId); } if (isMailboxDeactivated) { if (client != null) { client.Cancel(); } log.Info("MailBox with id={0} is deactivated.\r\n", mailbox.MailBoxId); } } catch (Exception ex) { log.Error("[ClientOnGetMessage] Exception:\r\n{0}\r\n", ex.ToString()); } }
private void ClientOnGetMessage(object sender, MailClientMessageEventArgs mailClientMessageEventArgs) { var log = _log; Stopwatch watch = null; if (_tasksConfig.CollectStatistics) { watch = new Stopwatch(); watch.Start(); } var failed = false; var mailbox = mailClientMessageEventArgs.Mailbox; try { var mimeMessage = mailClientMessageEventArgs.Message; var uid = mailClientMessageEventArgs.MessageUid; var folder = mailClientMessageEventArgs.Folder; var unread = mailClientMessageEventArgs.Unread; var fromEmail = mimeMessage.From.Mailboxes.FirstOrDefault(); log = mailClientMessageEventArgs.Logger; log.Debug("ClientOnGetMessage MailboxId = {0}, Address = '{1}'", mailbox.MailBoxId, mailbox.EMail); CoreContext.TenantManager.SetCurrentTenant(mailbox.TenantId); SecurityContext.AuthenticateMe(new Guid(mailbox.UserId)); var manager = new MailBoxManager(log); var md5 = string.Format("{0}|{1}|{2}|{3}", mimeMessage.From.Mailboxes.Any() ? mimeMessage.From.Mailboxes.First().Address : "", mimeMessage.Subject, mimeMessage.Date.UtcDateTime, mimeMessage.MessageId).GetMd5(); var uidl = mailbox.Imap ? string.Format("{0}-{1}", uid, folder.FolderId) : uid; var fromThisMailBox = fromEmail != null && fromEmail.Address.ToLowerInvariant() .Equals(mailbox.EMail.Address.ToLowerInvariant()); var toThisMailBox = mimeMessage.To.Mailboxes.Select(addr => addr.Address.ToLowerInvariant()) .Contains(mailbox.EMail.Address.ToLowerInvariant()); log.Info( @"Message: Subject: '{1}' Date: {2} Unread: {5} FolderId: {3} ('{4}') MimeId: '{0}' Uidl: '{6}' Md5: '{7}' To->From: {8} From->To: {9}", mimeMessage.MessageId, mimeMessage.Subject, mimeMessage.Date, folder.FolderId, folder.Name, unread, uidl, md5, fromThisMailBox, toThisMailBox); List <int> tagsIds = null; if (folder.Tags.Any()) { log.Debug("GetOrCreateTags()"); tagsIds = manager.GetOrCreateTags(mailbox.TenantId, mailbox.UserId, folder.Tags); } log.Debug("SearchExistingMessagesAndUpdateIfNeeded()"); var found = manager.SearchExistingMessagesAndUpdateIfNeeded(mailbox, folder.FolderId, uidl, md5, mimeMessage.MessageId, fromThisMailBox, toThisMailBox, tagsIds); var needSave = !found; if (!needSave) { return; } log.Debug("DetectChainId()"); var chainId = manager.DetectChainId(mailbox, mimeMessage.MessageId, mimeMessage.InReplyTo, mimeMessage.Subject); var streamId = MailUtil.CreateStreamId(); log.Debug("Convert MimeMessage->MailMessage"); var message = ConvertToMailMessage(mimeMessage, folder, unread, chainId, streamId, log); log.Debug("TryStoreMailData()"); if (!TryStoreMailData(message, mailbox, log)) { failed = true; return; } log.Debug("MailSave()"); if (TrySaveMail(manager, mailbox, message, folder, uidl, md5, log)) { log.Debug("DoOptionalOperations->START"); DoOptionalOperations(message, mimeMessage, mailbox, tagsIds, log); } else { failed = true; if (manager.TryRemoveMailDirectory(mailbox, message.StreamId)) { log.Info("Problem with mail proccessing(Account:{0}). Body and attachment have been deleted", mailbox.EMail); } else { throw new Exception("Can't delete mail folder with data"); } } } catch (Exception ex) { log.Error("[ClientOnGetMessage] Exception:\r\n{0}\r\n", ex.ToString()); failed = true; } finally { if (_tasksConfig.CollectStatistics && watch != null) { watch.Stop(); LogStat(PROCESS_MESSAGE, mailbox, watch.Elapsed, failed); } } }