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()); }
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); }
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)); }
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; } } }
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)); }
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; } } }
/// <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); }
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); }
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); }
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); }
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); }