public static MailMessage CreateMailMessage(this MimeMessage message, int folder = 1, bool unread = false, string chainId = "", string streamId = "", ILogger log = null) { var mail = new MailMessage(); if (message == null) { throw new ArgumentNullException("message"); } log = log ?? new NullLogger(); mail.Date = MailUtil.IsDateCorrect(message.Date.UtcDateTime) ? message.Date.UtcDateTime : DateTime.UtcNow; mail.MimeMessageId = (string.IsNullOrEmpty(message.MessageId) ? MailUtil.CreateMessageId() : message.MessageId) .Trim(new[] { '<', '>' }); mail.ChainId = string.IsNullOrEmpty(chainId) ? mail.MimeMessageId : chainId; mail.MimeReplyToId = mail.ChainId.Equals(mail.MimeMessageId) ? null : message.InReplyTo.Trim('<', '>'); mail.ReplyTo = message.ReplyTo.ToString(); mail.From = message.From.ToString(); mail.FromEmail = message.From != null && message.From.Mailboxes != null && message.From.Mailboxes.Any() ? message.From.Mailboxes.First().Address : ""; mail.ToList = message.To.Mailboxes.Select(s => new MailAddress(s.Address, s.Name)).ToList(); mail.To = string.Join(", ", message.To.Mailboxes.Select(s => s.ToString())); mail.CcList = message.Cc.Mailboxes.Select(s => new MailAddress(s.Address, s.Name)).ToList(); mail.Cc = string.Join(", ", message.Cc.Mailboxes.Select(s => s.ToString())); mail.Bcc = string.Join(", ", message.Bcc.Mailboxes.Select(s => s.ToString())); mail.Subject = message.Subject ?? string.Empty; mail.Important = message.Importance == MessageImportance.High || message.Priority == MessagePriority.Urgent; mail.TextBodyOnly = false; mail.Introduction = ""; mail.Attachments = new List <MailAttachment>(); mail.HtmlBodyStream = new MemoryStream(); mail.ExtractMainParts(message); mail.Size = mail.HtmlBodyStream.Length > 0 ? mail.HtmlBodyStream.Length : mail.HtmlBody.Length; mail.HeaderFieldNames = new NameValueCollection(); message.Headers .ToList() .ForEach(h => mail.HeaderFieldNames.Add(h.Field, h.Value)); mail.Folder = folder; mail.IsNew = unread; mail.StreamId = string.IsNullOrEmpty(streamId) ? MailUtil.CreateStreamId() : streamId; mail.LoadCalendarInfo(message, log); return(mail); }
public void StoreAttachmentWithoutQuota(MailAttachment attachment) { try { if ((attachment.dataStream == null || attachment.dataStream.Length == 0) && (attachment.data == null || attachment.data.Length == 0)) { return; } if (string.IsNullOrEmpty(attachment.fileName)) { attachment.fileName = "attachment.ext"; } var storage = MailDataStore.GetDataStore(Tenant); storage.QuotaController = null; var ext = Path.GetExtension(attachment.fileName); attachment.storedName = MailUtil.CreateStreamId(); if (!string.IsNullOrEmpty(ext)) { attachment.storedName = Path.ChangeExtension(attachment.storedName, ext); } attachment.fileNumber = !string.IsNullOrEmpty(attachment.contentId) //Upload hack: embedded attachment have to be saved in 0 folder ? 0 : attachment.fileNumber; var attachmentPath = MailStoragePathCombiner.GerStoredFilePath(attachment); if (attachment.data != null) { using (var reader = new MemoryStream(attachment.data)) { var uploadUrl = storage.Save(attachmentPath, reader, attachment.fileName); attachment.storedFileUrl = MailStoragePathCombiner.GetStoredUrl(uploadUrl); } } else { var uploadUrl = storage.Save(attachmentPath, attachment.dataStream, attachment.fileName); attachment.storedFileUrl = MailStoragePathCombiner.GetStoredUrl(uploadUrl); } } catch (Exception e) { _logger.Error("StoreAttachmentWithoutQuota(). filename: {0}, ctype: {1} Exception:\r\n{2}\r\n", attachment.fileName, attachment.contentType, e.ToString()); throw; } }
public MailMessage(MimeMessage message, int folder = 1, bool unread = false, string chainId = "", string streamId = "") { if (message == null) { throw new ArgumentNullException("message"); } Date = IsDateCorrect(message.Date.UtcDateTime) ? message.Date.UtcDateTime : DateTime.UtcNow; MimeMessageId = (string.IsNullOrEmpty(message.MessageId) ? MailUtil.CreateMessageId() : message.MessageId) .Trim(new[] { '<', '>' }); ChainId = string.IsNullOrEmpty(chainId) ? MimeMessageId : chainId; MimeReplyToId = ChainId.Equals(MimeMessageId) ? null : message.InReplyTo.Trim('<', '>'); ReplyTo = message.ReplyTo.ToString(); From = message.From.ToString(); FromEmail = message.From != null && message.From.Mailboxes != null && message.From.Mailboxes.Any() ? message.From.Mailboxes.First().Address : ""; ToList = message.To.Mailboxes.Select(s => new MailAddress(s.Address, s.Name)).ToList(); To = string.Join(", ", message.To.Mailboxes.Select(s => s.ToString())); CcList = message.Cc.Mailboxes.Select(s => new MailAddress(s.Address, s.Name)).ToList(); Cc = string.Join(", ", message.Cc.Mailboxes.Select(s => s.ToString())); Bcc = string.Join(", ", message.Bcc.Mailboxes.Select(s => s.ToString())); Subject = message.Subject ?? string.Empty; Important = message.Importance == MessageImportance.High || message.Priority == MessagePriority.Urgent; TextBodyOnly = false; Introduction = ""; Attachments = new List <MailAttachment>(); HtmlBodyStream = new MemoryStream(); ExtractMainParts(message); Size = HtmlBodyStream.Length > 0 ? HtmlBodyStream.Length : HtmlBody.Length; HeaderFieldNames = new NameValueCollection(); message.Headers .ToList() .ForEach(h => HeaderFieldNames.Add(h.Field, h.Value)); Folder = folder; IsNew = unread; StreamId = string.IsNullOrEmpty(streamId) ? MailUtil.CreateStreamId() : streamId; LoadCalendarInfo(message); }
public void StoreAttachmentWithoutQuota(int tenant, string user, MailAttachment attachment, IDataStore storage) { try { if (attachment.data == null || attachment.data.Length == 0) { return; } if (string.IsNullOrEmpty(attachment.fileName)) { attachment.fileName = "attachment.ext"; } var contentDisposition = MailStoragePathCombiner.PrepareAttachmentName(attachment.fileName); var ext = Path.GetExtension(attachment.fileName); attachment.storedName = MailUtil.CreateStreamId(); if (!string.IsNullOrEmpty(ext)) { attachment.storedName = Path.ChangeExtension(attachment.storedName, ext); } attachment.fileNumber = !string.IsNullOrEmpty(attachment.contentId) //Upload hack: embedded attachment have to be saved in 0 folder ? 0 : attachment.fileNumber; var attachmentPath = MailStoragePathCombiner.GerStoredFilePath(attachment); using (var reader = new MemoryStream(attachment.data)) { var uploadUrl = storage.UploadWithoutQuota(string.Empty, attachmentPath, reader, attachment.contentType, contentDisposition); attachment.storedFileUrl = MailStoragePathCombiner.GetStoredUrl(uploadUrl); } } catch (Exception e) { _logger.Error("StoreAttachmentWithoutQuota(). filename: {0}, ctype: {1} Exception:\r\n{2}\r\n", attachment.fileName, attachment.contentType, e.ToString()); throw; } }
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); }
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; } } }
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)); }
private void AddNotificationAlertToMailbox(MailDraftData draft, Exception exOnSanding) { try { var sbMessage = new StringBuilder(1024); sbMessage .AppendFormat("<div style=\"max-width:500px;font: normal 12px Arial, Tahoma,sans-serif;\"><p style=\"color:gray;font: normal 12px Arial, Tahoma,sans-serif;\">{0}</p>", DaemonLabels.AutomaticMessageLabel) .AppendFormat("<p style=\"font: normal 12px Arial, Tahoma,sans-serif;\">{0}</p>", DaemonLabels.MessageIdentificator .Replace("{subject}", draft.Subject) .Replace("{date}", DateTime.Now.ToString(CultureInfo.InvariantCulture))) .AppendFormat("<div><p style=\"font: normal 12px Arial, Tahoma,sans-serif;\">{0}:</p><ul style=\"color:#333;font: normal 12px Arial, Tahoma,sans-serif;\">", DaemonLabels.RecipientsLabel); draft.To.ForEach(rcpt => sbMessage.AppendFormat("<li>{0}</li>", HttpUtility.HtmlEncode(rcpt))); draft.Cc.ForEach(rcpt => sbMessage.AppendFormat("<li>{0}</li>", HttpUtility.HtmlEncode(rcpt))); draft.Bcc.ForEach(rcpt => sbMessage.AppendFormat("<li>{0}</li>", HttpUtility.HtmlEncode(rcpt))); sbMessage .AppendFormat("</ul>") .AppendFormat("<p style=\"font: normal 12px Arial, Tahoma,sans-serif;\">{0}</p>", DaemonLabels.RecommendationsLabel .Replace("{account_name}", "<b>" + draft.From + "</b>")) .AppendFormat( "<a id=\"delivery_failure_button\" mailid={0} class=\"button blue\" style=\"margin-right:8px;\">{1}</a></div>", draft.Id, DaemonLabels.TryAgainButtonLabel) .AppendFormat("<p style=\"font: normal 12px Arial, Tahoma,sans-serif;\">{0}</p>", DaemonLabels.FaqInformationLabel .Replace("{url_begin}", "<a id=\"delivery_failure_faq_link\" target=\"blank\" href=\"#\" class=\"link underline\">") .Replace("{url_end}", "</a>")); const int max_length = 300; var smtpResponse = string.IsNullOrEmpty(exOnSanding.Message) ? "no response" : exOnSanding.Message.Length > max_length ? exOnSanding.Message.Substring(0, max_length) : exOnSanding.Message; sbMessage.AppendFormat("<p style=\"color:gray;font: normal 12px Arial, Tahoma,sans-serif;\">{0}: \"{1}\"</p></div>", DaemonLabels.ReasonLabel, smtpResponse); draft.Mailbox.Name = ""; var messageDelivery = new MailDraftData(0, draft.Mailbox, DaemonLabels.DaemonEmail, new List <string>() { draft.From }, new List <string>(), new List <string>(), DaemonLabels.SubjectLabel, MailUtil.CreateStreamId(), "", true, new List <int>(), sbMessage.ToString(), MailUtil.CreateStreamId(), new List <MailAttachmentData>()); // SaveToDraft To Inbox var notifyMessageItem = messageDelivery.ToMailMessage(); notifyMessageItem.ChainId = notifyMessageItem.MimeMessageId; notifyMessageItem.IsNew = true; MessageEngine.StoreMailBody(draft.Mailbox, notifyMessageItem, Log); var engine = new EngineFactory(draft.Mailbox.TenantId, draft.Mailbox.UserId); var mailDaemonMessageid = engine.MessageEngine.MailSave(draft.Mailbox, notifyMessageItem, 0, FolderType.Inbox, FolderType.Inbox, null, string.Empty, string.Empty, false); engine.AlertEngine.CreateDeliveryFailureAlert( draft.Mailbox.TenantId, draft.Mailbox.UserId, draft.Mailbox.MailBoxId, draft.Subject, draft.From, draft.Id, mailDaemonMessageid); } catch (Exception exError) { Log.ErrorFormat("AddNotificationAlertToMailbox() in MailboxId={0} failed with exception:\r\n{1}", draft.Mailbox.MailBoxId, exError.ToString()); } }
public MailMessage(MimeMessage message, int folder = 1, bool unread = false, string chainId = "", string streamId = "") { if (message == null) { throw new ArgumentNullException("message"); } Date = IsDateCorrect(message.Date.UtcDateTime) ? message.Date.UtcDateTime : DateTime.UtcNow; MimeMessageId = (string.IsNullOrEmpty(message.MessageId) ? MailUtil.CreateMessageId() : message.MessageId) .Trim(new[] { '<', '>' }); ChainId = string.IsNullOrEmpty(chainId) ? MimeMessageId : chainId; MimeReplyToId = ChainId.Equals(MimeMessageId) ? null : message.InReplyTo.Trim(new[] { '<', '>' }); ReplyTo = message.ReplyTo.ToString(); From = message.From.ToString(); FromEmail = message.From != null && message.From.Mailboxes != null && message.From.Mailboxes.Any() ? message.From.Mailboxes.First().Address : ""; ToList = message.To.Mailboxes.Select(s => new MailAddress(s.Address, s.Name)).ToList(); To = string.Join(", ", message.To.Mailboxes.Select(s => s.ToString())); CcList = message.Cc.Mailboxes.Select(s => new MailAddress(s.Address, s.Name)).ToList(); Cc = string.Join(", ", message.Cc.Mailboxes.Select(s => s.ToString())); Bcc = string.Join(", ", message.Bcc.Mailboxes.Select(s => s.ToString())); Subject = message.Subject ?? string.Empty; Important = message.Importance == MessageImportance.High || message.Priority == MessagePriority.Urgent; TextBodyOnly = false; if (message.HtmlBody == null && message.TextBody == null) { HtmlBody = ""; Introduction = ""; IsBodyCorrupted = true; var messagePart = new MessagePart { Message = message, ContentDisposition = new ContentDisposition { FileName = "message.eml" } }; LoadAttachments(new List <MimeEntity> { messagePart }); } else { SetHtmlBodyAndIntroduction(message); } Size = HtmlBody.Length; HeaderFieldNames = new NameValueCollection(); if (message.Headers.Any()) { foreach (var header in message.Headers) { HeaderFieldNames.Add(header.Field, header.Value); } } Folder = folder; IsNew = unread; StreamId = string.IsNullOrEmpty(streamId) ? MailUtil.CreateStreamId() : streamId; LoadAttachments(message.Attachments); LoadEmbeddedAttachments(message); LoadCalendarInfo(message); }
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); } } }
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 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); }
public static MailMessage Save(MailBox mailbox, MimeMessage mimeMessage, string uid, MailFolder folder, bool unread = true, ILogger log = null) { if (mailbox == null) { throw new ArgumentException("mailbox is null", "mailbox"); } if (mimeMessage == null) { throw new ArgumentException("message is null", "mimeMessage"); } if (uid == null) { throw new ArgumentException("uidl is null", "uid"); } if (log == null) { log = new NullLogger(); } var manager = new MailBoxManager(log); var fromEmail = mimeMessage.From.Mailboxes.FirstOrDefault(); 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()); 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(null); } 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)) { return(null); } log.Debug("MailSave()"); if (TrySaveMail(manager, mailbox, message, folder, uidl, md5, log)) { return(message); } 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"); } return(null); }
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()); } }
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 void StoreAttachmentWithoutQuota(MailAttachmentData mailAttachmentData) { try { if ((mailAttachmentData.dataStream == null || mailAttachmentData.dataStream.Length == 0) && (mailAttachmentData.data == null || mailAttachmentData.data.Length == 0)) { return; } if (string.IsNullOrEmpty(mailAttachmentData.fileName)) { mailAttachmentData.fileName = "attachment.ext"; } var storage = MailDataStore.GetDataStore(Tenant); storage.QuotaController = null; if (string.IsNullOrEmpty(mailAttachmentData.storedName)) { mailAttachmentData.storedName = MailUtil.CreateStreamId(); var ext = Path.GetExtension(mailAttachmentData.fileName); if (!string.IsNullOrEmpty(ext)) { mailAttachmentData.storedName = Path.ChangeExtension(mailAttachmentData.storedName, ext); } } mailAttachmentData.fileNumber = !string.IsNullOrEmpty(mailAttachmentData.contentId) //Upload hack: embedded attachment have to be saved in 0 folder ? 0 : mailAttachmentData.fileNumber; var attachmentPath = MailStoragePathCombiner.GerStoredFilePath(mailAttachmentData); if (mailAttachmentData.data != null) { using (var reader = new MemoryStream(mailAttachmentData.data)) { var uploadUrl = (mailAttachmentData.needSaveToTemp) ? storage.Save("attachments_temp", attachmentPath, reader, mailAttachmentData.fileName) : storage.Save(attachmentPath, reader, mailAttachmentData.fileName); mailAttachmentData.storedFileUrl = MailStoragePathCombiner.GetStoredUrl(uploadUrl); } } else { var uploadUrl = (mailAttachmentData.needSaveToTemp) ? storage.Save("attachments_temp", attachmentPath, mailAttachmentData.dataStream, mailAttachmentData.fileName) : storage.Save(attachmentPath, mailAttachmentData.dataStream, mailAttachmentData.fileName); mailAttachmentData.storedFileUrl = MailStoragePathCombiner.GetStoredUrl(uploadUrl); } if (mailAttachmentData.needSaveToTemp) { mailAttachmentData.tempStoredUrl = mailAttachmentData.storedFileUrl; } } catch (Exception e) { Log.ErrorFormat("StoreAttachmentWithoutQuota(). filename: {0}, ctype: {1} Exception:\r\n{2}\r\n", mailAttachmentData.fileName, mailAttachmentData.contentType, e.ToString()); throw; } }
public int CreateSampleMessage(int?folderId, int?mailboxId) { 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 < 0) { 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; var sampleMessage = new MailMessage { Date = DateTime.UtcNow, MimeMessageId = mimeMessageId, MimeReplyToId = null, ChainId = mimeMessageId, ReplyTo = "", From = mbox.EMail.ToString(), FromEmail = mbox.EMail.Address, ToList = new List <MailAddress> { mbox.EMail }, To = mbox.EMail.ToString(), CcList = new List <MailAddress>(), Cc = "", Bcc = "", Subject = LOREM_IPSUM_SUBJECT, Important = false, TextBodyOnly = false, Introduction = LOREM_IPSUM_INTRO, Attachments = new List <MailAttachment>(), HtmlBodyStream = new MemoryStream(), Size = LOREM_IPSUM_BODY.Length, MailboxId = mbox.MailBoxId, HeaderFieldNames = new NameValueCollection(), HtmlBody = LOREM_IPSUM_BODY, Folder = folderId.Value, RestoreFolderId = restoreFolderId, IsNew = true, StreamId = MailUtil.CreateStreamId() }; MailBoxManager.StoreMailBody(mbox, sampleMessage); var id = MailBoxManager.MailSave(mbox, sampleMessage, 0, folderId.Value, restoreFolderId, "api sample", "", false); 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, 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 static MailMessage CreateCorruptedMesage(this MimeMessage message, int folder = 1, bool unread = false, string chainId = "", string streamId = "") { var mailMessage = new MailMessage { HasParseError = true }; MailUtil.SkipErrors(() => mailMessage.Date = MailUtil.IsDateCorrect(message.Date.UtcDateTime) ? message.Date.UtcDateTime : DateTime.UtcNow); MailUtil.SkipErrors(() => mailMessage.MimeMessageId = (string.IsNullOrEmpty(message.MessageId) ? MailUtil.CreateMessageId() : message.MessageId) .Trim('<', '>')); MailUtil.SkipErrors(() => mailMessage.ChainId = string.IsNullOrEmpty(chainId) ? mailMessage.MimeMessageId : chainId); MailUtil.SkipErrors(() => mailMessage.MimeReplyToId = mailMessage.ChainId.Equals(mailMessage.MimeMessageId) ? null : message.InReplyTo.Trim('<', '>')); MailUtil.SkipErrors(() => mailMessage.ReplyTo = message.ReplyTo.ToString()); MailUtil.SkipErrors(() => mailMessage.From = message.From.ToString()); MailUtil.SkipErrors(() => mailMessage.FromEmail = message.From != null && message.From.Mailboxes != null && message.From.Mailboxes.Any() ? message.From.Mailboxes.First().Address : ""); MailUtil.SkipErrors(() => mailMessage.ToList = message.To.Mailboxes.Select(s => MailUtil.ExecuteSafe(() => new MailAddress(s.Address, s.Name))).ToList()); MailUtil.SkipErrors(() => mailMessage.To = string.Join(", ", message.To.Mailboxes.Select(s => s.ToString()))); MailUtil.SkipErrors(() => mailMessage.CcList = message.Cc.Mailboxes.Select(s => MailUtil.ExecuteSafe(() => new MailAddress(s.Address, s.Name))).ToList()); MailUtil.SkipErrors(() => mailMessage.Cc = string.Join(", ", message.Cc.Mailboxes.Select(s => s.ToString()))); MailUtil.SkipErrors(() => mailMessage.Bcc = string.Join(", ", message.Bcc.Mailboxes.Select(s => s.ToString()))); MailUtil.SkipErrors(() => mailMessage.Subject = message.Subject ?? string.Empty); MailUtil.SkipErrors(() => mailMessage.Important = message.Importance == MessageImportance.High || message.Priority == MessagePriority.Urgent); mailMessage.HtmlBodyStream = new MemoryStream(); using (var sw = new StreamWriter(mailMessage.HtmlBodyStream, Encoding.UTF8, 1024, true)) { sw.Write("<body><pre> </pre></body>"); sw.Flush(); } mailMessage.Size = mailMessage.HtmlBodyStream.Length; mailMessage.HeaderFieldNames = new NameValueCollection(); message.Headers .ToList() .ForEach(h => MailUtil.SkipErrors(() => mailMessage.HeaderFieldNames.Add(h.Field, h.Value))); mailMessage.Folder = folder; mailMessage.IsNew = unread; mailMessage.StreamId = string.IsNullOrEmpty(streamId) ? MailUtil.CreateStreamId() : streamId; mailMessage.TextBodyOnly = true; mailMessage.Introduction = ""; mailMessage.Attachments = new List <MailAttachment>(); MailUtil.SkipErrors(() => { var mailAttach = new MailAttachment { contentId = null, fileName = "message.eml", contentType = "message/rfc822", contentLocation = null, dataStream = new MemoryStream() }; message.WriteTo(mailAttach.dataStream); mailAttach.size = mailAttach.dataStream.Length; mailMessage.Attachments.Add(mailAttach); }); return(mailMessage); }
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); } } }