public List <string> SearchAccountEmails(string searchText)
        {
            var accounts = GetAccountInfoList();
            var emails   = new List <string>();

            foreach (var account in accounts)
            {
                var email = string.IsNullOrEmpty(account.Name)
                                ? account.Email
                                : MailUtil.CreateFullEmail(account.Name, account.Email);
                emails.Add(email);

                foreach (var alias in account.Aliases)
                {
                    email = string.IsNullOrEmpty(account.Name)
                                ? account.Email
                                : MailUtil.CreateFullEmail(account.Name, alias.Email);
                    emails.Add(email);
                }

                foreach (var group in account.Groups.Where(group => emails.IndexOf(group.Email) == -1))
                {
                    emails.Add(group.Email);
                }
            }

            return(emails.Where(e => e.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) > -1).ToList());
        }
Beispiel #2
0
        public List <string> SearchPeopleEmails(string term, int startIndex, int count)
        {
            var request = new RestRequest("people/filter.json?filterValue={FilterValue}&StartIndex={StartIndex}&Count={Count}", Method.GET);

            request.AddParameter("FilterValue", term, ParameterType.UrlSegment)
            .AddParameter("StartIndex", startIndex.ToString(), ParameterType.UrlSegment)
            .AddParameter("Count", count.ToString(), ParameterType.UrlSegment);

            var response = Execute(request);

            var peopleEmails = new List <string>();

            var json = JObject.Parse(response.Content);

            var contacts = json["response"] as JArray;

            if (contacts == null)
            {
                return(peopleEmails);
            }

            foreach (var contact in contacts)
            {
                var displayName = contact["displayName"].ToString();

                var emails = new List <string>();

                var email = contact["email"].ToString();

                if (!string.IsNullOrEmpty(email))
                {
                    emails.Add(email);
                }

                var contactData = contact["contacts"] as JArray;

                if (contactData != null)
                {
                    emails.AddRange(contactData.Where(d => d["type"].ToString() == "mail").Select(d => (string)d["value"]).ToList());
                }

                if (displayName.IndexOf(term, StringComparison.OrdinalIgnoreCase) > -1)
                {
                    peopleEmails.AddRange(emails.Select(e => MailUtil.CreateFullEmail(displayName, e)));
                }
                else
                {
                    peopleEmails.AddRange(emails
                                          .Where(e => e.IndexOf(term, StringComparison.OrdinalIgnoreCase) > -1)
                                          .Select(e => MailUtil.CreateFullEmail(displayName, e)));
                }
            }

            return(peopleEmails);
        }
Beispiel #3
0
        public List <string> SearchCrmEmails(string term, int maxCount)
        {
            var request = new RestRequest("crm/contact/simple/byEmail.json", Method.GET);

            request.AddParameter("term", term)
            .AddParameter("maxCount", maxCount.ToString());

            var response = Execute(request);

            var crmEmails = new List <string>();

            var json = JObject.Parse(response.Content);

            var contacts = json["response"] as JArray;

            if (contacts == null)
            {
                return(crmEmails);
            }

            foreach (var contact in contacts)
            {
                var commonData = contact["contact"]["commonData"] as JArray;

                if (commonData == null)
                {
                    continue;
                }

                var emails = commonData.Where(d => int.Parse(d["infoType"].ToString()) == 1).Select(d => (string)d["data"]).ToList();

                if (!emails.Any())
                {
                    continue;
                }

                var displayName = contact["contact"]["displayName"].ToString();

                if (displayName.IndexOf(term, StringComparison.OrdinalIgnoreCase) > -1)
                {
                    crmEmails.AddRange(emails.Select(e => MailUtil.CreateFullEmail(displayName, e)));
                }
                else
                {
                    crmEmails.AddRange(emails
                                       .Where(e => e.IndexOf(term, StringComparison.OrdinalIgnoreCase) > -1)
                                       .Select(e => MailUtil.CreateFullEmail(displayName, e)));
                }
            }

            return(crmEmails);
        }
        public virtual MailMessage Save(
            int id,
            string from,
            List <string> to,
            List <string> cc,
            List <string> bcc,
            string mimeReplyToId,
            bool importance,
            string subject,
            List <int> tags,
            string body,
            List <MailAttachmentData> attachments,
            string calendarIcs,
            DeliveryFailureMessageTranslates translates = null)
        {
            var mailAddress = new MailAddress(from);

            var engine = new EngineFactory(Tenant, User);

            var accounts = engine.AccountEngine.GetAccountInfoList().ToAccountData();

            var account = accounts.FirstOrDefault(a => a.Email.ToLower().Equals(mailAddress.Address));

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

            if (account.IsGroup)
            {
                throw new InvalidOperationException("Saving emails from a group address is forbidden");
            }

            var mbox = engine.MailboxEngine.GetMailboxData(
                new СoncreteUserMailboxExp(account.MailboxId, Tenant, User));

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

            string mimeMessageId, streamId;

            var previousMailboxId = mbox.MailBoxId;

            if (id > 0)
            {
                var message = engine.MessageEngine.GetMessage(id, new MailMessage.Options
                {
                    LoadImages    = false,
                    LoadBody      = true,
                    NeedProxyHttp = Defines.NeedProxyHttp,
                    NeedSanitizer = false
                });

                if (message.Folder != FolderType.Draft)
                {
                    throw new InvalidOperationException("Saving emails is permitted only in the Drafts folder");
                }

                if (message.HtmlBody.Length > Defines.MaximumMessageBodySize)
                {
                    throw new InvalidOperationException("Message body exceeded limit (" + Defines.MaximumMessageBodySize / 1024 + " KB)");
                }

                mimeMessageId = message.MimeMessageId;

                streamId = message.StreamId;

                previousMailboxId = message.MailboxId;
            }
            else
            {
                mimeMessageId = MailUtil.CreateMessageId();
                streamId      = MailUtil.CreateStreamId();
            }

            var fromAddress = MailUtil.CreateFullEmail(mbox.Name, mbox.EMail.Address);

            var compose = new MailDraftData(id, mbox, fromAddress, to, cc, bcc, subject, mimeMessageId, mimeReplyToId, importance,
                                            tags, body, streamId, attachments, calendarIcs)
            {
                PreviousMailboxId = previousMailboxId
            };

            DaemonLabels = translates ?? DeliveryFailureMessageTranslates.Defauilt;

            return(Save(compose));
        }
Beispiel #5
0
        public MailMessage SaveMessage(int id,
                                       string from,
                                       List <string> to,
                                       List <string> cc,
                                       List <string> bcc,
                                       string mimeReplyToId,
                                       bool importance,
                                       string subject,
                                       List <int> tags,
                                       string body,
                                       List <MailAttachment> attachments,
                                       string calendarIcs)
        {
            if (id < 1)
            {
                id = 0;
            }

            if (string.IsNullOrEmpty(from))
            {
                throw new ArgumentNullException("from");
            }

            Thread.CurrentThread.CurrentCulture   = CurrentCulture;
            Thread.CurrentThread.CurrentUICulture = CurrentCulture;

            var mailAddress = new MailAddress(from);

            var accounts = MailBoxManager.GetAccountInfo(TenantId, Username).ToAddressData();

            var account = accounts.FirstOrDefault(a => a.Email.ToLower().Equals(mailAddress.Address));

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

            if (account.IsGroup)
            {
                throw new InvalidOperationException("Saving emails from a group address is forbidden");
            }

            var mbox = MailBoxManager.GetUnremovedMailBox(account.MailboxId);

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

            string mimeMessageId, streamId;

            var previousMailboxId = mbox.MailBoxId;

            if (id > 0)
            {
                var message = GetMessage(id, false, false, false);

                if (message.Folder != MailFolder.Ids.drafts)
                {
                    throw new InvalidOperationException("Saving emails is permitted only in the Drafts folder");
                }

                mimeMessageId = message.MimeMessageId;

                streamId = message.StreamId;

                foreach (var attachment in attachments)
                {
                    attachment.streamId = streamId;
                }

                previousMailboxId = message.MailboxId;
            }
            else
            {
                mimeMessageId = MailUtil.CreateMessageId();
                streamId      = MailUtil.CreateStreamId();
            }

            var fromAddress = MailUtil.CreateFullEmail(mbox.Name, mbox.EMail.Address);

            var draft = new MailDraft(id, mbox, fromAddress, to, cc, bcc, subject, mimeMessageId, mimeReplyToId, importance,
                                      tags, body, streamId, attachments, calendarIcs)
            {
                PreviousMailboxId = previousMailboxId
            };

            try
            {
                var draftsManager = new DraftManager(MailBoxManager, Logger);

                return(draftsManager.Save(draft));
            }
            catch (DraftException ex)
            {
                string fieldName;

                switch (ex.FieldType)
                {
                case DraftFieldTypes.From:
                    fieldName = MailApiResource.FieldNameFrom;
                    break;

                default:
                    fieldName = "";
                    break;
                }
                switch (ex.ErrorType)
                {
                case DraftException.ErrorTypes.IncorrectField:
                    throw new ArgumentException(MailApiResource.ErrorIncorrectEmailAddress.Replace("%1", fieldName));

                case DraftException.ErrorTypes.EmptyField:
                    throw new ArgumentException(MailApiResource.ErrorEmptyField.Replace("%1", fieldName));

                default:
                    throw;
                }
            }
        }
Beispiel #6
0
        public long Send(int id,
                         string from,
                         List <string> to,
                         List <string> cc,
                         List <string> bcc,
                         string mimeReplyToId,
                         bool importance,
                         string subject,
                         List <int> tags,
                         string body,
                         List <MailAttachmentData> attachments,
                         Files.Core.Security.FileShare fileLinksShareMode,
                         string calendarIcs,
                         bool isAutoreply,
                         bool requestReceipt,
                         bool requestRead,
                         DeliveryFailureMessageTranslates translates = null)
        {
            if (id < 1)
            {
                id = 0;
            }

            if (string.IsNullOrEmpty(from))
            {
                throw new ArgumentNullException("from");
            }

            if (!to.Any())
            {
                throw new ArgumentNullException("to");
            }

            var mailAddress = new MailAddress(from);

            var engine = new EngineFactory(Tenant, User);

            var accounts = engine.AccountEngine.GetAccountInfoList().ToAccountData();

            var account = accounts.FirstOrDefault(a => a.Email.ToLower().Equals(mailAddress.Address));

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

            if (account.IsGroup)
            {
                throw new InvalidOperationException("Sending emails from a group address is forbidden");
            }

            var mbox = engine.MailboxEngine.GetMailboxData(
                new СoncreteUserMailboxExp(account.MailboxId, Tenant, User));

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

            if (!mbox.Enabled)
            {
                throw new InvalidOperationException("Sending emails from a disabled account is forbidden");
            }

            string mimeMessageId, streamId;

            var previousMailboxId = mbox.MailBoxId;

            if (id > 0)
            {
                var message = engine.MessageEngine.GetMessage(id, new MailMessage.Options
                {
                    LoadImages    = false,
                    LoadBody      = true,
                    NeedProxyHttp = Defines.NeedProxyHttp,
                    NeedSanitizer = false
                });

                if (message.Folder != FolderType.Draft && message.Folder != FolderType.Templates)
                {
                    throw new InvalidOperationException("Sending emails is permitted only in the Drafts folder");
                }

                if (message.HtmlBody.Length > Defines.MaximumMessageBodySize)
                {
                    throw new InvalidOperationException("Message body exceeded limit (" + Defines.MaximumMessageBodySize / 1024 + " KB)");
                }

                mimeMessageId = message.MimeMessageId;

                streamId = message.StreamId;

                foreach (var attachment in attachments)
                {
                    attachment.streamId = streamId;
                }

                previousMailboxId = message.MailboxId;
            }
            else
            {
                mimeMessageId = MailUtil.CreateMessageId();
                streamId      = MailUtil.CreateStreamId();
            }

            var fromAddress = MailUtil.CreateFullEmail(mbox.Name, mailAddress.Address);

            var draft = new MailDraftData(id, mbox, fromAddress, to, cc, bcc, subject, mimeMessageId, mimeReplyToId,
                                          importance, tags, body, streamId, attachments, calendarIcs)
            {
                FileLinksShareMode = fileLinksShareMode,
                PreviousMailboxId  = previousMailboxId,
                RequestReceipt     = requestReceipt,
                RequestRead        = requestRead,
                IsAutogenerated    = !string.IsNullOrEmpty(calendarIcs),
                IsAutoreplied      = isAutoreply
            };

            DaemonLabels = translates ?? DeliveryFailureMessageTranslates.Defauilt;

            return(Send(draft));
        }
Beispiel #7
0
        public long SendMessage(int id,
                                string from,
                                List <string> to,
                                List <string> cc,
                                List <string> bcc,
                                string mimeReplyToId,
                                bool importance,
                                string subject,
                                List <int> tags,
                                string body,
                                List <MailAttachment> attachments,
                                FileShare fileLinksShareMode,
                                string calendarIcs,
                                bool isAutoreply)
        {
            if (id < 1)
            {
                id = 0;
            }

            if (string.IsNullOrEmpty(from))
            {
                throw new ArgumentNullException("from");
            }

            if (!to.Any())
            {
                throw new ArgumentNullException("to");
            }

            var mailAddress = new MailAddress(from);
            var accounts    = MailBoxManager.GetAccountInfo(TenantId, Username).ToAddressData();
            var account     = accounts.FirstOrDefault(a => a.Email.ToLower().Equals(mailAddress.Address));

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

            if (account.IsGroup)
            {
                throw new InvalidOperationException("Sending emails from a group address is forbidden");
            }

            var mbox = MailBoxManager.GetUnremovedMailBox(account.MailboxId);

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

            if (!mbox.Enabled)
            {
                throw new InvalidOperationException("Sending emails from a disabled account is forbidden");
            }

            string mimeMessageId, streamId;

            var previousMailboxId = mbox.MailBoxId;

            if (id > 0)
            {
                var message = GetMessage(id, false, false, false);

                if (message.Folder != MailFolder.Ids.drafts)
                {
                    throw new InvalidOperationException("Sending emails is permitted only in the Drafts folder");
                }

                mimeMessageId = message.MimeMessageId;

                streamId = message.StreamId;

                foreach (var attachment in attachments)
                {
                    attachment.streamId = streamId;
                }

                previousMailboxId = message.MailboxId;
            }
            else
            {
                mimeMessageId = MailUtil.CreateMessageId();
                streamId      = MailUtil.CreateStreamId();
            }

            var fromAddress = MailUtil.CreateFullEmail(mbox.Name, mailAddress.Address);

            var draft = new MailDraft(id, mbox, fromAddress, to, cc, bcc, subject, mimeMessageId, mimeReplyToId, importance,
                                      tags, body, streamId, attachments, calendarIcs)
            {
                FileLinksShareMode = fileLinksShareMode,
                PreviousMailboxId  = previousMailboxId
            };

            try
            {
                Thread.CurrentThread.CurrentCulture   = CurrentCulture;
                Thread.CurrentThread.CurrentUICulture = CurrentCulture;

                var daemonLabels =
                    new DraftManager.DeliveryFailureMessageTranslates(
                        MailDaemonEmail,
                        MailApiResource.DeliveryFailureSubject,
                        MailApiResource.DeliveryFailureAutomaticMessage,
                        MailApiResource.DeliveryFailureMessageIdentificator,
                        MailApiResource.DeliveryFailureRecipients,
                        MailApiResource.DeliveryFailureRecommendations,
                        MailApiResource.DeliveryFailureBtn,
                        MailApiResource.DeliveryFailureFAQInformation,
                        MailApiResource.DeliveryFailureReason);

                var draftsManager = new DraftManager(MailBoxManager, Logger, daemonLabels, isAutoreply);

                return(draftsManager.Send(draft));
            }
            catch (DraftException ex)
            {
                string fieldName;

                switch (ex.FieldType)
                {
                case DraftFieldTypes.From:
                    fieldName = MailApiResource.FieldNameFrom;
                    break;

                case DraftFieldTypes.To:
                    fieldName = MailApiResource.FieldNameTo;
                    break;

                case DraftFieldTypes.Cc:
                    fieldName = MailApiResource.FieldNameCc;
                    break;

                case DraftFieldTypes.Bcc:
                    fieldName = MailApiResource.FieldNameBcc;
                    break;

                default:
                    fieldName = "";
                    break;
                }
                switch (ex.ErrorType)
                {
                case DraftException.ErrorTypes.IncorrectField:
                    throw new ArgumentException(MailApiResource.ErrorIncorrectEmailAddress.Replace("%1", fieldName));

                case DraftException.ErrorTypes.EmptyField:
                    throw new ArgumentException(MailApiResource.ErrorEmptyField.Replace("%1", fieldName));

                default:
                    throw;
                }
            }
        }
Beispiel #8
0
        /// <summary>
        /// Search emails in Accounts, Mail, CRM, Peaople Contact System
        /// </summary>
        /// <param name="tenant">Tenant id</param>
        /// <param name="userName">User id</param>
        /// <param name="term">Search word</param>
        /// <param name="maxCountPerSystem">limit result per Contact System</param>
        /// <param name="timeout">Timeout in milliseconds</param>
        /// <param name="httpContextScheme"></param>
        /// <returns></returns>
        public List <string> SearchEmails(int tenant, string userName, string term, int maxCountPerSystem, string httpContextScheme, int timeout = -1)
        {
            var equality = new ContactEqualityComparer();
            var contacts = new List <string>();
            var userGuid = new Guid(userName);

            var watch = new Stopwatch();

            watch.Start();

            var apiHelper = new ApiHelper(httpContextScheme);

            var taskList = new List <Task <List <string> > >()
            {
                Task.Run(() =>
                {
                    CoreContext.TenantManager.SetCurrentTenant(tenant);
                    SecurityContext.AuthenticateMe(userGuid);

                    var engine = new EngineFactory(tenant, userName);

                    var exp = new FullFilterContactsExp(tenant, userName, term, infoType: ContactInfoType.Email, orderAsc: true, limit: maxCountPerSystem);

                    var contactCards = engine.ContactEngine.GetContactCards(exp);

                    return((from contactCard in contactCards
                            from contactItem in contactCard.ContactItems
                            select
                            string.IsNullOrEmpty(contactCard.ContactInfo.ContactName)
                                ? contactItem.Data
                                : MailUtil.CreateFullEmail(contactCard.ContactInfo.ContactName, contactItem.Data))
                           .ToList());
                }),

                Task.Run(() =>
                {
                    CoreContext.TenantManager.SetCurrentTenant(tenant);
                    SecurityContext.AuthenticateMe(userGuid);

                    var engine = new EngineFactory(tenant, userGuid.ToString());
                    return(engine.AccountEngine.SearchAccountEmails(term));
                }),

                Task.Run(() =>
                {
                    CoreContext.TenantManager.SetCurrentTenant(tenant);
                    SecurityContext.AuthenticateMe(userGuid);

                    return(WebItemSecurity.IsAvailableForMe(WebItemManager.CRMProductID)
                        ? apiHelper.SearchCrmEmails(term, maxCountPerSystem)
                        : new List <string>());
                }),

                Task.Run(() =>
                {
                    CoreContext.TenantManager.SetCurrentTenant(tenant);
                    SecurityContext.AuthenticateMe(userGuid);

                    return(WebItemSecurity.IsAvailableForMe(WebItemManager.PeopleProductID)
                        ? apiHelper.SearchPeopleEmails(term, 0, maxCountPerSystem)
                        : new List <string>());
                })
            };

            try
            {
                var taskArray = taskList.ToArray <Task>();

                Task.WaitAll(taskArray, timeout);

                watch.Stop();
            }
            catch (AggregateException e)
            {
                watch.Stop();

                var errorText =
                    new StringBuilder("SearchEmails: \nThe following exceptions have been thrown by WaitAll():");

                foreach (var t in e.InnerExceptions)
                {
                    errorText
                    .AppendFormat("\n-------------------------------------------------\n{0}", t);
                }

                Log.Error(errorText.ToString());
            }

            contacts =
                taskList.Aggregate(contacts,
                                   (current, task) => !task.IsFaulted &&
                                   task.IsCompleted &&
                                   !task.IsCanceled
                        ? current.Concat(task.Result).ToList()
                        : current)
                .Distinct(equality)
                .ToList();

            Log.DebugFormat("SearchEmails (term = '{0}'): {1} sec / {2} items", term, watch.Elapsed.TotalSeconds, contacts.Count);

            return(contacts);
        }
Beispiel #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);
        }
Beispiel #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);
        }
Beispiel #11
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)
        {
            if (!folderId.HasValue)
            {
                folderId = MailFolder.Ids.inbox;
            }

            if (folderId < MailFolder.Ids.inbox || folderId > MailFolder.Ids.spam)
            {
                throw new ArgumentException(@"Invalid folder id", "folderId");
            }

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

            var accounts = MailBoxManager.GetAccountInfo(TenantId, Username).ToAddressData();

            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 = MailBoxManager.GetUnremovedMailBox(account.MailboxId);

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

            var mimeMessageId = MailUtil.CreateMessageId();

            var restoreFolderId = folderId.Value == MailFolder.Ids.spam || folderId.Value == MailFolder.Ids.trash
                ? MailFolder.Ids.inbox
                : folderId.Value;

            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            = DateTime.UtcNow,
                MimeMessageId   = mimeMessageId,
                MimeReplyToId   = null,
                ChainId         = mimeMessageId,
                ReplyTo         = "",
                From            = MailUtil.CreateFullEmail(mbox.Name, mbox.EMail.Address),
                FromEmail       = mbox.EMail.Address,
                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 <MailAttachment>(),
                Size            = sampleBody.Length,
                MailboxId       = mbox.MailBoxId,
                HtmlBody        = sampleBody,
                Introduction    = sampleIntro,
                Folder          = folderId.Value,
                RestoreFolderId = restoreFolderId,
                IsNew           = unread,
                StreamId        = MailUtil.CreateStreamId()
            };

            MailBoxManager.StoreMailBody(mbox, sampleMessage);

            var id = MailBoxManager.MailSave(mbox, sampleMessage, 0, folderId.Value, restoreFolderId, SAMPLE_UIDL, "",
                                             false);

            return(id);
        }
Beispiel #12
0
        public bool SimpleSend(
            string from,
            List <string> to,
            string subject,
            string body,
            bool isReceipt,
            DeliveryFailureMessageTranslates translates = null)
        {
            if (!to.Any())
            {
                throw new ArgumentNullException("to");
            }

            if (string.IsNullOrEmpty(from))
            {
                throw new ArgumentNullException("from");
            }

            var mailAddress = new MailAddress(from);

            var engine = new EngineFactory(Tenant, User);

            var accounts = engine.AccountEngine.GetAccountInfoList().ToAccountData();

            var account = accounts.FirstOrDefault(a => a.Email.ToLower().Equals(mailAddress.Address));

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

            if (account.IsGroup)
            {
                throw new InvalidOperationException("Sending emails from a group address is forbidden");
            }

            var mbox = engine.MailboxEngine.GetMailboxData(
                new СoncreteUserMailboxExp(account.MailboxId, Tenant, User));

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

            if (!mbox.Enabled)
            {
                throw new InvalidOperationException("Sending emails from a disabled account is forbidden");
            }

            var previousMailboxId = mbox.MailBoxId;

            var mimeMessageId = MailUtil.CreateMessageId();
            var streamId      = MailUtil.CreateStreamId();

            var fromAddress = MailUtil.CreateFullEmail(mbox.Name, mailAddress.Address);

            var draft = new MailDraftData(0, mbox, fromAddress, to, new List <string>(), new List <string>(), subject, mimeMessageId, string.Empty,
                                          false, new List <int>(), body, streamId, new List <MailAttachmentData>(), string.Empty)
            {
                FileLinksShareMode = (Files.Core.Security.FileShare)FileShare.None,
                PreviousMailboxId  = previousMailboxId,
                RequestReceipt     = false,
                RequestRead        = false,
                IsAutogenerated    = false,
                IsAutoreplied      = false,
                IsReceipt          = isReceipt
            };

            DaemonLabels = translates ?? DeliveryFailureMessageTranslates.Defauilt;

            var scheme = HttpContext.Current == null
                ? Uri.UriSchemeHttp
                : HttpContext.Current.Request.GetUrlRewriter().Scheme;

            var currentUrl = HttpContext.Current != null?HttpContext.Current.Request.GetUrlRewriter().ToString() : null;

            Task.Run(() =>
            {
                try
                {
                    if (HttpContext.Current == null && !WorkContext.IsMono)
                    {
                        HttpContext.Current = new HttpContext(
                            new HttpRequest("hack", currentUrl, string.Empty),
                            new HttpResponse(new StringWriter()));
                    }

                    CoreContext.TenantManager.SetCurrentTenant(draft.Mailbox.TenantId);

                    SecurityContext.CurrentUser = new Guid(draft.Mailbox.UserId);

                    draft.ChangeEmbeddedAttachmentLinks(Log);

                    var mimeMessage = draft.ToMimeMessage();

                    using (var mc = new MailClient(draft.Mailbox, CancellationToken.None,
                                                   certificatePermit: draft.Mailbox.IsTeamlab || _sslCertificatePermit, log: Log,
                                                   enableDsn: draft.RequestReceipt))
                    {
                        mc.Send(mimeMessage, false);
                    }

                    Log.Info($"User {draft.Mailbox.UserId} sent a read confirmation to {string.Join(",", draft.To)} from {draft.From}");

                    SendMailNotification(draft);
                }
                catch (Exception ex)
                {
                    Log.ErrorFormat("Mail->Send failed: Exception: {0}", ex.ToString());

                    SendMailErrorNotification(draft, MailNotificationState.SendReceiptError);
                }
            });

            return(true);
        }