Ejemplo n.º 1
0
        private static bool HasGroupsInTo(MailBoxData account, MailMessage messageItem)
        {
            if (!account.IsTeamlab)
            {
                return(false);
            }

            if (account.Groups == null)
            {
                var engine = new EngineFactory(account.TenantId, account.UserId);
                account.Groups = engine.ServerEngine.GetGroups(account.MailBoxId);
            }

            foreach (var group in account.Groups)
            {
                if (messageItem.ToList.Any(
                        address =>
                        string.Equals(address.Address, group.Email, StringComparison.InvariantCultureIgnoreCase)))
                {
                    return(true);
                }

                if (messageItem.CcList.Any(
                        address =>
                        string.Equals(address.Address, group.Email, StringComparison.InvariantCultureIgnoreCase)))
                {
                    return(true);
                }
            }

            return(false);
        }
Ejemplo n.º 2
0
        private static string GetAutoreplyEmailInTo(MailBoxData account, MailMessage messageItem)
        {
            var autoreplyAddress = GetAddressInList(account, messageItem.ToList) ??
                                   GetAddressInList(account, messageItem.CcList);

            return(autoreplyAddress);
        }
Ejemplo n.º 3
0
        public void SaveAutoreplyHistory(MailBoxData account, MailMessage messageItem)
        {
            using (var daoFactory = new DaoFactory())
            {
                var autoReplyHistory = new MailboxAutoreplyHistory
                {
                    MailboxId    = account.MailBoxId,
                    SendingDate  = DateTime.UtcNow,
                    SendingEmail = new MailAddress(messageItem.To).Address,
                    Tenant       = account.TenantId
                };

                daoFactory.CreateMailboxAutoreplyHistoryDao(account.TenantId, account.UserId)
                .SaveAutoreplyHistory(autoReplyHistory);
            }
        }
Ejemplo n.º 4
0
        private static MailMessage CreateAutoreply(MailBoxData account, MailMessage messageItem, string autoreplyEmail)
        {
            var mailMessage   = new MailMessage();
            var stringBuilder = new StringBuilder(account.MailAutoreply.Subject);

            if (!string.IsNullOrEmpty(account.MailAutoreply.Subject))
            {
                stringBuilder.Append(" ");
            }

            mailMessage.Subject       = stringBuilder.AppendFormat("Re: {0}", messageItem.Subject).ToString();
            mailMessage.HtmlBody      = account.MailAutoreply.Html;
            mailMessage.MimeReplyToId = messageItem.MimeMessageId;
            mailMessage.To            = messageItem.From;
            mailMessage.From          = autoreplyEmail ?? account.EMail.ToString();

            if (account.MailSignature == null)
            {
                using (var daoFactory = new DaoFactory())
                {
                    var signature = daoFactory.CreateMailboxSignatureDao(account.TenantId, account.UserId).GetSignature(account.MailBoxId);

                    if (signature != null)
                    {
                        account.MailSignature = new MailSignatureData(signature.MailboxId, signature.Tenant, signature.Html,
                                                                      signature.IsActive);
                    }
                    else
                    {
                        account.MailSignature = new MailSignatureData(account.MailBoxId, account.TenantId, "", false);
                    }
                }
            }

            if (account.MailSignature != null && account.MailSignature.IsActive)
            {
                mailMessage.HtmlBody = new StringBuilder(mailMessage.HtmlBody).AppendFormat(
                    @"<div class='tlmail_signature' mailbox_id='{0}'
                         style='font-family:open sans,sans-serif; font-size:12px; margin:0px;'>
                         <div>{1}</div>
                      </div>",
                    account.MailBoxId, account.MailSignature.Html).ToString();
            }
            return(mailMessage);
        }
Ejemplo n.º 5
0
        public MailMessage GetTemplate()
        {
            var template = new MailMessage
            {
                Attachments   = new List <MailAttachmentData>(),
                Bcc           = "",
                Cc            = "",
                Subject       = "",
                From          = "",
                HtmlBody      = "",
                Important     = false,
                ReplyTo       = "",
                MimeMessageId = "",
                MimeReplyToId = "",
                To            = "",
                StreamId      = MailUtil.CreateStreamId()
            };

            return(template);
        }
Ejemplo n.º 6
0
        private static bool IsCurrentMailboxInFrom(MailBoxData account, MailMessage messageItem)
        {
            if (string.Equals(messageItem.FromEmail, account.EMail.Address, StringComparison.InvariantCultureIgnoreCase))
            {
                return(true);
            }

            if (!account.IsTeamlab)
            {
                return(false);
            }

            if (account.Aliases == null)
            {
                var engine = new EngineFactory(account.TenantId, account.UserId);
                account.Aliases = engine.ServerEngine.GetAliases(account.MailBoxId);
            }

            return
                (account.Aliases.Any(
                     alias =>
                     string.Equals(messageItem.FromEmail, alias.Email, StringComparison.InvariantCultureIgnoreCase)));
        }
Ejemplo n.º 7
0
        private void ReleaseSendingDraftOnSuccess(MailDraftData draft, MailMessage message)
        {
            var engine = new EngineFactory(draft.Mailbox.TenantId, draft.Mailbox.UserId);

            using (var daoFactory = new DaoFactory())
            {
                var db = daoFactory.DbManager;

                using (var tx = db.BeginTransaction(IsolationLevel.ReadUncommitted))
                {
                    // message was correctly send - lets update its chains id
                    var draftChainId = message.ChainId;
                    // before moving message from draft to sent folder - lets recalculate its correct chain id
                    var chainInfo = engine.MessageEngine.DetectChain(daoFactory, draft.Mailbox,
                                                                     message.MimeMessageId, message.MimeReplyToId, message.Subject);

                    message.ChainId = chainInfo.Id;

                    if (message.ChainId.Equals(message.MimeMessageId))
                    {
                        message.MimeReplyToId = null;
                    }

                    var daoMailInfo = daoFactory.CreateMailInfoDao(draft.Mailbox.TenantId, draft.Mailbox.UserId);

                    if (!draftChainId.Equals(message.ChainId))
                    {
                        daoMailInfo.SetFieldValue(
                            SimpleMessagesExp.CreateBuilder(Tenant, User)
                            .SetMessageId(message.Id)
                            .Build(),
                            MailTable.Columns.ChainId,
                            message.ChainId);

                        engine.ChainEngine.UpdateChain(daoFactory, draftChainId, FolderType.Sending, null, draft.Mailbox.MailBoxId,
                                                       draft.Mailbox.TenantId, draft.Mailbox.UserId);

                        var daoCrmLink = daoFactory.CreateCrmLinkDao(draft.Mailbox.TenantId, draft.Mailbox.UserId);

                        daoCrmLink.UpdateCrmLinkedChainId(draftChainId, draft.Mailbox.MailBoxId, message.ChainId);
                    }

                    engine.ChainEngine.UpdateChain(daoFactory, message.ChainId, FolderType.Sending, null, draft.Mailbox.MailBoxId,
                                                   draft.Mailbox.TenantId, draft.Mailbox.UserId);

                    var listObjects = engine.ChainEngine.GetChainedMessagesInfo(daoFactory, new List <int> {
                        draft.Id
                    });

                    if (!listObjects.Any())
                    {
                        return;
                    }

                    engine.MessageEngine.SetFolder(daoFactory, listObjects, FolderType.Sent);

                    daoMailInfo.SetFieldValue(
                        SimpleMessagesExp.CreateBuilder(Tenant, User)
                        .SetMessageId(draft.Id)
                        .Build(),
                        MailTable.Columns.FolderRestore,
                        FolderType.Sent);

                    tx.Commit();
                }
            }
        }
Ejemplo n.º 8
0
        public void SendAutoreply(MailBoxData account, MailMessage message, string httpContextScheme, ILog log)
        {
            try
            {
                if (message.Folder != FolderType.Inbox ||
                    account.MailAutoreply == null ||
                    !account.MailAutoreply.TurnOn)
                {
                    return;
                }

                var utcNow = DateTime.UtcNow.Date;

                if (account.MailAutoreply.TurnOnToDate &&
                    account.MailAutoreply.ToDate != DateTime.MinValue &&
                    account.MailAutoreply.ToDate < utcNow)
                {
                    log.InfoFormat("DisableAutoreply(MailboxId = {0}) -> time is over", account.MailBoxId);

                    EnableAutoreply(account, false);

                    return;
                }

                if (account.MailAutoreply.FromDate > utcNow)
                {
                    log.Info("Skip MailAutoreply: FromDate > utcNow");
                    return;
                }

                if (account.MailAutoreply.FromDate > message.Date)
                {
                    log.Info("Skip MailAutoreply: FromDate > message.Date");
                    return;
                }

                if (MailUtil.IsMessageAutoGenerated(message))
                {
                    log.Info("Skip MailAutoreply: found some auto-generated header");
                    return;
                }

                if (IsCurrentMailboxInFrom(account, message))
                {
                    log.Info("Skip MailAutoreply: message from current account");
                    return;
                }

                var apiHelper = new ApiHelper(httpContextScheme);

                var autoreplyEmail = GetAutoreplyEmailInTo(account, message);

                if (string.IsNullOrEmpty(autoreplyEmail))
                {
                    log.Info("Skip MailAutoreply: autoreplyEmail not found");
                    return;
                }

                if (HasGroupsInTo(account, message))
                {
                    log.Info("Skip MailAutoreply: has group address in TO, CC");
                    return;
                }

                if (HasMailboxAutoreplyHistory(account, message.FromEmail))
                {
                    log.Info("Skip MailAutoreply: already sent to this address (history)");
                    return;
                }

                if (account.MailAutoreply.OnlyContacts && !apiHelper.SearchEmails(message.FromEmail).Any())
                {
                    log.Info("Skip MailAutoreply: message From address is not a part of user's contacts");
                    return;
                }

                apiHelper.SendMessage(CreateAutoreply(account, message, autoreplyEmail), true);
                account.MailAutoreplyHistory.Add(message.FromEmail);

                log.InfoFormat("AutoreplyEngine->SendAutoreply: auto-reply message has been sent to '{0}' email", autoreplyEmail);
            }
            catch (Exception ex)
            {
                log.ErrorFormat(
                    "AutoreplyEngine->SendAutoreply Error: {0}, innerException: {1}, account.MailBoxId = {2}, " +
                    "account.UserId = {3}, account.TenantId = {4}",
                    ex, ex.InnerException != null ? ex.InnerException.ToString() : string.Empty,
                    account.MailBoxId, account.UserId, account.TenantId);
            }
        }
Ejemplo n.º 9
0
        public int CreateSampleMessage(
            int?folderId,
            int?mailboxId,
            List <string> to,
            List <string> cc,
            List <string> bcc,
            bool importance,
            bool unread,
            string subject,
            string body,
            string calendarUid   = null,
            DateTime?date        = null,
            List <int> tagIds    = null,
            string fromAddress   = null,
            bool add2Index       = false,
            string mimeMessageId = null,
            uint?userFolderId    = null)
        {
            var folder = folderId.HasValue ? (FolderType)folderId.Value : FolderType.Inbox;

            if (!MailFolder.IsIdOk(folder))
            {
                throw new ArgumentException(@"Invalid folder id", "folderId");
            }

            if (!mailboxId.HasValue)
            {
                throw new ArgumentException(@"Invalid mailbox id", "mailboxId");
            }

            var accounts = _engineFactory.AccountEngine.GetAccountInfoList().ToAccountData().ToList();

            var account = mailboxId.HasValue
                ? accounts.FirstOrDefault(a => a.MailboxId == mailboxId)
                : accounts.FirstOrDefault(a => a.IsDefault) ?? accounts.FirstOrDefault();

            if (account == null)
            {
                throw new ArgumentException("Mailbox not found");
            }

            var mbox = _engineFactory.MailboxEngine.GetMailboxData(
                new СoncreteUserMailboxExp(account.MailboxId, TenantId, Username));

            if (mbox == null)
            {
                throw new ArgumentException("no such mailbox");
            }

            var internalId = string.IsNullOrEmpty(mimeMessageId) ? MailUtil.CreateMessageId() : mimeMessageId;

            var restoreFolder = folder == FolderType.Spam || folder == FolderType.Trash
                ? FolderType.Inbox
                : folder;

            string sampleBody;
            string sampleIntro;

            if (!to.Any())
            {
                to = new List <string> {
                    mbox.EMail.Address
                };
            }

            if (!string.IsNullOrEmpty(body))
            {
                sampleBody  = body;
                sampleIntro = MailUtil.GetIntroduction(body);
            }
            else
            {
                sampleBody  = LOREM_IPSUM_BODY;
                sampleIntro = LOREM_IPSUM_INTRO;
            }

            var sampleMessage = new MailMessage
            {
                Date            = date ?? DateTime.UtcNow,
                MimeMessageId   = internalId,
                MimeReplyToId   = null,
                ChainId         = internalId,
                ReplyTo         = "",
                To              = string.Join(", ", to.ToArray()),
                Cc              = cc.Any() ? string.Join(", ", cc.ToArray()) : "",
                Bcc             = bcc.Any() ? string.Join(", ", bcc.ToArray()) : "",
                Subject         = string.IsNullOrEmpty(subject) ? LOREM_IPSUM_SUBJECT : subject,
                Important       = importance,
                TextBodyOnly    = false,
                Attachments     = new List <MailAttachmentData>(),
                Size            = sampleBody.Length,
                MailboxId       = mbox.MailBoxId,
                HtmlBody        = sampleBody,
                Introduction    = sampleIntro,
                Folder          = folder,
                RestoreFolderId = restoreFolder,
                IsNew           = unread,
                StreamId        = MailUtil.CreateStreamId(),
                CalendarUid     = calendarUid
            };

            if (!string.IsNullOrEmpty(fromAddress))
            {
                var from = Parser.ParseAddress(fromAddress);

                sampleMessage.From      = from.ToString();
                sampleMessage.FromEmail = from.Email;
            }
            else
            {
                sampleMessage.From      = MailUtil.CreateFullEmail(mbox.Name, mbox.EMail.Address);
                sampleMessage.FromEmail = mbox.EMail.Address;
            }

            if (tagIds != null && tagIds.Any())
            {
                sampleMessage.TagIds = tagIds;
            }

            MessageEngine.StoreMailBody(mbox, sampleMessage, Log);

            var id = _engineFactory.MessageEngine.MailSave(mbox, sampleMessage, 0, folder, restoreFolder, userFolderId,
                                                           SAMPLE_UIDL, "", false);

            if (!add2Index)
            {
                return(id);
            }

            var message = _engineFactory.MessageEngine.GetMessage(id, new MailMessageData.Options());

            message.IsNew = unread;

            var wrapper = message.ToMailWrapper(mbox.TenantId, new Guid(mbox.UserId));

            _engineFactory.IndexEngine.Add(wrapper);

            return(id);
        }
Ejemplo n.º 10
0
        public int CreateReplyToSampleMessage(int id, string body, bool add2Index = false)
        {
            var message = _engineFactory.MessageEngine.GetMessage(id, new MailMessage.Options());

            if (message == null)
            {
                throw new ArgumentException("Message with id not found");
            }

            var mbox = _engineFactory.MailboxEngine.GetMailboxData(
                new СoncreteUserMailboxExp(message.MailboxId, TenantId, Username));

            if (mbox == null)
            {
                throw new ArgumentException("Mailbox not found");
            }

            var mimeMessageId = MailUtil.CreateMessageId();

            var sampleMessage = new MailMessage
            {
                Date            = DateTime.UtcNow,
                MimeMessageId   = mimeMessageId,
                MimeReplyToId   = message.MimeMessageId,
                ChainId         = message.MimeMessageId,
                ReplyTo         = message.FromEmail,
                To              = message.FromEmail,
                Cc              = "",
                Bcc             = "",
                Subject         = "Re: " + message.Subject,
                Important       = message.Important,
                TextBodyOnly    = false,
                Attachments     = new List <MailAttachmentData>(),
                Size            = body.Length,
                MailboxId       = mbox.MailBoxId,
                HtmlBody        = body,
                Introduction    = body,
                Folder          = FolderType.Sent,
                RestoreFolderId = FolderType.Sent,
                IsNew           = false,
                StreamId        = MailUtil.CreateStreamId(),
                From            = MailUtil.CreateFullEmail(mbox.Name, mbox.EMail.Address),
                FromEmail       = mbox.EMail.Address
            };

            MessageEngine.StoreMailBody(mbox, sampleMessage, Log);

            var replyId = _engineFactory.MessageEngine.MailSave(mbox, sampleMessage, 0, FolderType.Sent, FolderType.Sent, null,
                                                                SAMPLE_REPLY_UIDL, "", false);

            if (!add2Index)
            {
                return(replyId);
            }

            var replyMessage = _engineFactory.MessageEngine.GetMessage(replyId, new MailMessageData.Options());

            var wrapper = replyMessage.ToMailWrapper(mbox.TenantId, new Guid(mbox.UserId));

            _engineFactory.IndexEngine.Add(wrapper);

            return(replyId);
        }