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);
                }
            }
        }
Exemple #2
0
        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);
                }
            }
        }