public async Task <MailSendResult> SendMailAsync(MailMessageData emailMessage) { Console.WriteLine($"EmailRabbitMQProcessor SendMailAsync method => Calısma zamanı: {DateTime.Now.ToShortTimeString()}"); MailSendResult result; MailMessage mailMessage = emailMessage.GetMailMessage(); mailMessage.From = new MailAddress(_smtpConfiguration.User); try { using (var client = CreateSmtpClient(_smtpConfiguration.GetSmtpConfig())) { await client.SendMailAsync(mailMessage); string resultMessage = $"donus mesajı metni {string.Join(",", mailMessage.To)}."; result = new MailSendResult(mailMessage, true, resultMessage); Console.WriteLine($"EmailRabbitMQProcessor running => resultMessage to:{ mailMessage.To}"); } } catch (Exception ex) { while (ex.InnerException != null) { ex = ex.InnerException; } result = new MailSendResult(mailMessage, false, $"Hata: {ex.Message}"); } finally { Thread.Sleep(MailConsts.SendTimeout); } return(result); }
private void Consumer_Received(object sender, BasicDeliverEventArgs ea) { try { _semaphore.Wait(); MailMessageData message = _objectConvertFormat.JsonToObject <MailMessageData>(Encoding.UTF8.GetString(ea.Body)); MessageReceived?.Invoke(this, message); // E-Posta akışını başlatma yeri Task.Run(() => { try { var task = _mailSender.SendMailAsync(message); task.Wait(); var result = task.Result; MessageProcessed?.Invoke(this, result); } catch (Exception ex) { throw new Exception(ex.InnerException.Message.ToString()); } finally { // Teslimat Onayı _channel.BasicAck(ea.DeliveryTag, false); // akışı - thread'i serbest bırakıyoruz ek thread alabiliriz. _semaphore.Release(); } }); } catch (Exception ex) { throw new Exception(ex.InnerException.Message.ToString()); } }
public static bool IsMessageAutoGenerated(MailMessageData message) { var isMassSending = false; if (message.HeaderFieldNames != null && ListHeaderNames.Any( h => message.HeaderFieldNames.AllKeys.FirstOrDefault( k => k.Equals(h, StringComparison.OrdinalIgnoreCase)) != null)) { isMassSending = true; } else if (!string.IsNullOrEmpty(message.From) && ListFromTextToSkip.Any(f => message.From.IndexOf(f, StringComparison.OrdinalIgnoreCase) != -1)) { isMassSending = true; } else if (message.HtmlBodyStream != null && message.HtmlBodyStream.Length > 0) { isMassSending = HasUnsubscribeLink(message.HtmlBodyStream); } else if (!string.IsNullOrEmpty(message.HtmlBody)) { isMassSending = HasUnsubscribeLink(message.HtmlBody); } return(isMassSending); }
/// <summary> /// Парсинг принятого сообщения /// </summary> private MailMessageData ParseMailMessageData(byte[] rawBytes) { var json = Encoding.UTF8.GetString(rawBytes); MailMessageData message = MessageFormatter.MessageFormatter.JsonToMailMessage(json); return(message); }
public static MailWrapper ToMailWrapper(this MailMessageData message, int tenant, Guid userId) { var now = DateTime.UtcNow; var mailWrapper = new MailWrapper { Id = message.Id, TenantId = tenant, UserId = userId, FromText = message.From, ToText = message.To, Cc = message.Cc, Bcc = message.Bcc, Subject = message.Subject, Folder = (byte)message.Folder, DateSent = message.Date, MailboxId = message.MailboxId, ChainId = message.ChainId, ChainDate = message.ChainDate, IsRemoved = false, Unread = message.IsNew, Importance = message.Important, HasAttachments = message.HasAttachments, WithCalendar = !string.IsNullOrEmpty(message.CalendarUid), LastModifiedOn = now, Stream = message.StreamId }; if (message.Folder == FolderType.UserFolder && message.UserFolderId.HasValue) { mailWrapper.UserFolders = new List <UserFolderWrapper> { new UserFolderWrapper { Id = (int)message.UserFolderId.Value } }; } else { mailWrapper.UserFolders = new List <UserFolderWrapper>(); } if (message.TagIds != null && message.TagIds.Any()) { mailWrapper.Tags = message.TagIds.ConvertAll(tagId => new TagWrapper { Id = tagId, TenantId = tenant, LastModifiedOn = now }); } else { mailWrapper.Tags = new List <TagWrapper>(); } return(mailWrapper); }
/// <summary> /// Имитация отправки письма /// </summary> public async Task <MailSendResult> SendMailAsync(MailMessageData emailMessage) { Thread.Sleep(SendTimeout); var result = await Task.Factory.StartNew <MailSendResult>(() => { string resultMessage = $"[Test] Письмо отправлено на {emailMessage.To}."; return(new MailSendResult(emailMessage.GetMailMessage(), true, resultMessage)); }); return(result); }
public void AddToCrmHistory(MailMessageData message, CrmContactData entity, IEnumerable <object> fileIds) { var request = new RestRequest("crm/history.json", Method.POST); var contentJson = string.Format("{{ message_id : {0} }}", message.Id); request.AddParameter("content", contentJson) .AddParameter("categoryId", MAIL_CRM_HISTORY_CATEGORY) .AddParameter("created", new ApiDateTime(message.Date)); var crmEntityType = entity.EntityTypeName; if (crmEntityType == CrmContactData.CrmEntityTypeNames.CONTACT) { request.AddParameter("contactId", entity.Id) .AddParameter("entityId", 0); } else { if (crmEntityType != CrmContactData.CrmEntityTypeNames.CASE && crmEntityType != CrmContactData.CrmEntityTypeNames.OPPORTUNITY) { throw new ArgumentException(String.Format("Invalid crm entity type: {0}", crmEntityType)); } request.AddParameter("contactId", 0) .AddParameter("entityId", entity.Id) .AddParameter("entityType", crmEntityType); } if (fileIds != null) { fileIds.ToList().ForEach( id => request.AddParameter("fileId[]", id)); } var response = Execute(request); if (response.ResponseStatus == ResponseStatus.Completed && (response.StatusCode == HttpStatusCode.Created || response.StatusCode == HttpStatusCode.OK)) { return; } if (response.ErrorException is ApiHelperException) { throw response.ErrorException; } throw new ApiHelperException("Add message to crm history failed.", response.StatusCode, response.Content); }
public void SaveEmailInData(MailBoxData mailbox, MailMessageData message, string httpContextScheme = null) { if (string.IsNullOrEmpty(mailbox.EMailInFolder)) { return; } if (Log == null) { Log = new NullLog(); } try { foreach (var attachment in message.Attachments.Where(a => !a.isEmbedded)) { if (attachment.dataStream != null) { Log.DebugFormat("SaveEmailInData->ApiHelper.UploadToDocuments(fileName: '{0}', folderId: {1})", attachment.fileName, mailbox.EMailInFolder); attachment.dataStream.Seek(0, SeekOrigin.Begin); UploadToDocuments(attachment.dataStream, attachment.fileName, attachment.contentType, mailbox, httpContextScheme, Log); } else { using (var file = attachment.ToAttachmentStream()) { Log.DebugFormat("SaveEmailInData->ApiHelper.UploadToDocuments(fileName: '{0}', folderId: {1})", file.FileName, mailbox.EMailInFolder); UploadToDocuments(file.FileStream, file.FileName, attachment.contentType, mailbox, httpContextScheme, Log); } } } } catch (Exception e) { Log.ErrorFormat("SaveEmailInData(tenant={0}, userId='{1}', messageId={2}) Exception:\r\n{3}\r\n", mailbox.TenantId, mailbox.UserId, message.Id, e.ToString()); } }
public static void LoadAttachments(this MailMessageData mail, IEnumerable <MimeEntity> attachments, bool skipContentId = false) { if (mail.Attachments == null) { mail.Attachments = new List <MailAttachmentData>(); } foreach (var attachment in attachments) { var mailAttach = ConvertToMailAttachment(attachment, skipContentId); if (mailAttach == null) { continue; } mail.Attachments.Add(mailAttach); mail.HasAttachments = true; } }
/// <summary> /// Отправка письма /// </summary> public async Task <MailSendResult> SendMailAsync(MailMessageData emailMessage) { MailSendResult result; MailMessage mailMessage = emailMessage.GetMailMessage(); try { using (var client = CreateSmtpClient(GetConfig())) { await client.SendMailAsync(mailMessage); string resultMessage = $"Письмо отправлено на {string.Join(",", mailMessage.To)}."; result = new MailSendResult(mailMessage, true, resultMessage); } } catch (Exception ex) { while (ex.InnerException != null) { ex = ex.InnerException; } result = new MailSendResult(mailMessage, false, $"Ошибка отправки: {ex.Message}"); } finally { Thread.Sleep(SendTimeout); } return(result); }
public void AddRelationshipEventForLinkedAccounts(MailBoxData mailbox, MailMessageData messageItem, string httpContextScheme) { try { using (var daoFactory = new DaoFactory()) { var dao = daoFactory.CreateCrmLinkDao(mailbox.TenantId, mailbox.UserId); messageItem.LinkedCrmEntityIds = dao.GetLinkedCrmContactEntities(messageItem.ChainId, mailbox.MailBoxId); } if (!messageItem.LinkedCrmEntityIds.Any()) { return; } AddRelationshipEvents(messageItem, httpContextScheme); } catch (Exception ex) { Log.Warn(string.Format("Problem with adding history event to CRM. mailId={0}", messageItem.Id), ex); } }
public void SendMessage(MailMessageData message, bool isAutoreply = false) { var request = new RestRequest("mail/messages/send.json", Method.PUT); var jObject = new JObject { { "id", message.Id } }; if (!string.IsNullOrEmpty(message.From)) { jObject.Add("from", message.From); } jObject.Add("to", message.To); if (!string.IsNullOrEmpty(message.Cc)) { jObject.Add("cc", message.Cc); } if (!string.IsNullOrEmpty(message.Bcc)) { jObject.Add("bcc", message.Bcc); } jObject.Add("subject", message.Subject); jObject.Add("body", message.HtmlBody); jObject.Add("mimeReplyToId", message.MimeReplyToId); jObject.Add("importance", message.Important); if (message.TagIds != null && message.TagIds.Count != 0) { jObject.Add("tags", JsonConvert.SerializeObject(message.TagIds)); } if (message.Attachments != null && message.Attachments.Count != 0) { jObject.Add("attachments", JsonConvert.SerializeObject(message.Attachments)); } if (!string.IsNullOrEmpty(message.CalendarEventIcs)) { jObject.Add("calendarIcs", message.CalendarEventIcs); } jObject.Add("isAutoreply", isAutoreply); request.AddParameter("application/json; charset=utf-8", jObject, ParameterType.RequestBody); var response = Execute(request); if (response.ResponseStatus == ResponseStatus.Completed && (response.StatusCode == HttpStatusCode.Created || response.StatusCode == HttpStatusCode.OK)) { return; } if (response.ErrorException is ApiHelperException) { throw response.ErrorException; } throw new ApiHelperException("Send message to api failed.", response.StatusCode, response.Content); }
public static MailMessageData ToMailMessage(this MailComposeBase draft) { MailboxAddress fromVerified; if (string.IsNullOrEmpty(draft.From)) { throw new DraftException(DraftException.ErrorTypes.EmptyField, "Empty email address in {0} field", DraftFieldTypes.From); } if (!MailboxAddress.TryParse(ParserOptions.Default, draft.From, out fromVerified)) { throw new DraftException(DraftException.ErrorTypes.IncorrectField, "Incorrect email address", DraftFieldTypes.From); } if (string.IsNullOrEmpty(fromVerified.Name)) { fromVerified.Name = draft.Mailbox.Name; } if (string.IsNullOrEmpty(draft.MimeMessageId)) { throw new ArgumentException("MimeMessageId"); } var messageItem = new MailMessageData { From = fromVerified.ToString(), FromEmail = fromVerified.Address, To = string.Join(", ", draft.To.ToArray()), Cc = draft.Cc != null?string.Join(", ", draft.Cc.ToArray()) : "", Bcc = draft.Bcc != null?string.Join(", ", draft.Bcc.ToArray()) : "", Subject = draft.Subject, Date = DateTime.UtcNow, Important = draft.Important, HtmlBody = draft.HtmlBody, Introduction = MailUtil.GetIntroduction(draft.HtmlBody), StreamId = draft.StreamId, TagIds = draft.Labels != null && draft.Labels.Count != 0 ? new List <int>(draft.Labels) : null, Size = draft.HtmlBody.Length, MimeReplyToId = draft.MimeReplyToId, MimeMessageId = draft.MimeMessageId, IsNew = false, Folder = draft.Folder, ChainId = draft.MimeMessageId, CalendarUid = draft.CalendarEventUid, CalendarEventIcs = draft.CalendarIcs, MailboxId = draft.Mailbox.MailBoxId }; if (messageItem.Attachments == null) { messageItem.Attachments = new List <MailAttachmentData>(); } draft.Attachments.ForEach(attachment => { attachment.tenant = draft.Mailbox.TenantId; attachment.user = draft.Mailbox.UserId; }); messageItem.Attachments.AddRange(draft.Attachments); messageItem.HasAttachments = messageItem.Attachments.Count > 0; return(messageItem); }
private void DoOptionalOperations(MailMessageData message, MimeMessage mimeMessage, MailBoxData mailbox, MailFolder folder, ILog log) { var factory = new EngineFactory(mailbox.TenantId, mailbox.UserId, log); var tagIds = new List <int>(); if (folder.Tags.Any()) { log.Debug("DoOptionalOperations->GetOrCreateTags()"); tagIds = factory.TagEngine.GetOrCreateTags(mailbox.TenantId, mailbox.UserId, folder.Tags); } log.Debug("DoOptionalOperations->IsCrmAvailable()"); if (IsCrmAvailable(mailbox, log)) { log.Debug("DoOptionalOperations->GetCrmTags()"); var crmTagIds = factory.TagEngine.GetCrmTags(message.FromEmail); if (crmTagIds.Any()) { if (tagIds == null) { tagIds = new List <int>(); } tagIds.AddRange(crmTagIds.Select(t => t.Id)); } } if (tagIds.Any()) { if (message.TagIds == null || !message.TagIds.Any()) { message.TagIds = tagIds; } else { message.TagIds.AddRange(tagIds); } message.TagIds = message.TagIds.Distinct().ToList(); } log.Debug("DoOptionalOperations->AddMessageToIndex()"); var wrapper = message.ToMailWrapper(mailbox.TenantId, new Guid(mailbox.UserId)); factory.IndexEngine.Add(wrapper); foreach (var tagId in tagIds) { try { log.DebugFormat("DoOptionalOperations->SetMessagesTag(tagId: {0})", tagId); factory.TagEngine.SetMessagesTag(new List <int> { message.Id }, tagId); } catch (Exception e) { log.ErrorFormat( "SetMessagesTag(tenant={0}, userId='{1}', messageId={2}, tagid = {3}) Exception:\r\n{4}\r\n", mailbox.TenantId, mailbox.UserId, message.Id, e.ToString(), tagIds != null ? string.Join(",", tagIds) : "null"); } } log.Debug("DoOptionalOperations->AddRelationshipEventForLinkedAccounts()"); factory.CrmLinkEngine.AddRelationshipEventForLinkedAccounts(mailbox, message, _tasksConfig.DefaultApiSchema); log.Debug("DoOptionalOperations->SaveEmailInData()"); factory.EmailInEngine.SaveEmailInData(mailbox, message, _tasksConfig.DefaultApiSchema); log.Debug("DoOptionalOperations->SendAutoreply()"); factory.AutoreplyEngine.SendAutoreply(mailbox, message, _tasksConfig.DefaultApiSchema, log); log.Debug("DoOptionalOperations->UploadIcsToCalendar()"); factory .CalendarEngine .UploadIcsToCalendar(mailbox, message.CalendarId, message.CalendarUid, message.CalendarEventIcs, message.CalendarEventCharset, message.CalendarEventMimeType, mailbox.EMail.Address, _tasksConfig.DefaultApiSchema); if (_tasksConfig.SaveOriginalMessage) { log.Debug("DoOptionalOperations->StoreMailEml()"); StoreMailEml(mailbox.TenantId, mailbox.UserId, message.StreamId, mimeMessage, log); } log.Debug("DoOptionalOperations->ApplyFilters()"); var filters = GetFilters(factory, log); factory.FilterEngine.ApplyFilters(message, mailbox, folder, filters); log.Debug("DoOptionalOperations->NotifySignalrIfNeed()"); NotifySignalrIfNeed(mailbox, log); }
public MailAttachmentData AttachFile(int tenant, string user, MailMessageData message, string name, Stream inputStream, long contentLength, string contentType = null, bool needSaveToTemp = false) { if (message == null) { throw new AttachmentsException(AttachmentsException.Types.MessageNotFound, "Message not found."); } if (string.IsNullOrEmpty(message.StreamId)) { throw new AttachmentsException(AttachmentsException.Types.MessageNotFound, "StreamId is empty."); } var messageId = message.Id; var engine = new EngineFactory(tenant, user); var totalSize = engine.AttachmentEngine.GetAttachmentsSize(new ConcreteMessageAttachmentsExp(messageId, tenant, user)); totalSize += contentLength; if (totalSize > Defines.ATTACHMENTS_TOTAL_SIZE_LIMIT) { throw new AttachmentsException(AttachmentsException.Types.TotalSizeExceeded, "Total size of all files exceeds limit!"); } var fileNumber = engine.AttachmentEngine.GetAttachmentNextFileNumber(new ConcreteMessageAttachmentsExp(messageId, tenant, user)); var attachment = new MailAttachmentData { fileName = name, contentType = string.IsNullOrEmpty(contentType) ? MimeMapping.GetMimeMapping(name) : contentType, needSaveToTemp = needSaveToTemp, fileNumber = fileNumber, size = contentLength, data = inputStream.ReadToEnd(), streamId = message.StreamId, tenant = tenant, user = user, mailboxId = message.MailboxId }; engine.QuotaEngine.QuotaUsedAdd(contentLength); try { var storage = new StorageManager(tenant, user); storage.StoreAttachmentWithoutQuota(attachment); } catch { engine.QuotaEngine.QuotaUsedDelete(contentLength); throw; } if (!needSaveToTemp) { int attachCount; using (var daoFactory = new DaoFactory()) { var db = daoFactory.DbManager; using (var tx = db.BeginTransaction()) { var daoAttachment = daoFactory.CreateAttachmentDao(tenant, user); attachment.fileId = daoAttachment.SaveAttachment(attachment.ToAttachmnet(messageId)); attachCount = daoAttachment.GetAttachmentsCount( new ConcreteMessageAttachmentsExp(messageId, tenant, user)); var daoMailInfo = daoFactory.CreateMailInfoDao(tenant, user); daoMailInfo.SetFieldValue( SimpleMessagesExp.CreateBuilder(tenant, user) .SetMessageId(messageId) .Build(), MailTable.Columns.AttachCount, attachCount); engine.ChainEngine.UpdateMessageChainAttachmentsFlag(daoFactory, tenant, user, messageId); tx.Commit(); } } if (attachCount == 1) { var data = new MailWrapper { HasAttachments = true }; engine.IndexEngine.Update(data, s => s.Where(m => m.Id, messageId), wrapper => wrapper.HasAttachments); } } return(attachment); }
public static MailMessageData CreateCorruptedMesage(this MimeMessage message, FolderType folder = FolderType.Inbox, bool unread = false, string chainId = "", string streamId = "") { var mailMessage = new MailMessageData { 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 <MailAttachmentData>(); MailUtil.SkipErrors(() => { var mailAttach = new MailAttachmentData { 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); }
public static MailMessageData CreateMailMessage(this MimeMessage message, int mailboxId = -1, FolderType folder = FolderType.Inbox, bool unread = false, string chainId = "", DateTime?chainDate = null, string streamId = "", ILog log = null) { var mail = new MailMessageData(); if (message == null) { throw new ArgumentNullException("message"); } log = log ?? new NullLog(); mail.MailboxId = mailboxId; var now = DateTime.UtcNow; mail.Date = MailUtil.IsDateCorrect(message.Date.UtcDateTime) ? message.Date.UtcDateTime : now; mail.MimeMessageId = (string.IsNullOrEmpty(message.MessageId) ? MailUtil.CreateMessageId() : message.MessageId) .Trim('<', '>'); mail.ChainId = string.IsNullOrEmpty(chainId) ? mail.MimeMessageId : chainId; mail.ChainDate = chainDate ?? now; mail.MimeReplyToId = mail.ChainId.Equals(mail.MimeMessageId) || string.IsNullOrEmpty(message.InReplyTo) ? 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 <MailAttachmentData>(); 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 static void ReplaceEmbeddedImages(this MailMessageData mail, ILog log = null) { log = log ?? new NullLog(); try { var attchments = mail.Attachments.Where(a => a.isEmbedded && !string.IsNullOrEmpty(a.storedFileUrl)).ToList(); if (!attchments.Any()) { return; } if (mail.HtmlBodyStream.Length > 0) { mail.HtmlBodyStream.Seek(0, SeekOrigin.Begin); var doc = new HtmlDocument(); doc.Load(mail.HtmlBodyStream, Encoding.UTF8); var hasChanges = false; foreach (var attach in attchments) { HtmlNodeCollection oldNodes = null; if (!string.IsNullOrEmpty(attach.contentId)) { oldNodes = doc.DocumentNode.SelectNodes("//img[@src and (contains(@src,'cid:" + attach.contentId.Trim('<').Trim('>') + "'))]"); } if (!string.IsNullOrEmpty(attach.contentLocation) && oldNodes == null) { oldNodes = doc.DocumentNode.SelectNodes("//img[@src and (contains(@src,'" + attach.contentLocation + "'))]"); } if (oldNodes == null) { //This attachment is not embedded; attach.contentId = null; attach.contentLocation = null; continue; } foreach (var node in oldNodes) { node.SetAttributeValue("src", attach.storedFileUrl); hasChanges = true; } } mail.HtmlBodyStream.Seek(0, SeekOrigin.Begin); if (!hasChanges) { return; } mail.HtmlBodyStream.Close(); mail.HtmlBodyStream.Dispose(); mail.HtmlBodyStream = new MemoryStream(); using (var sw = new StreamWriter(mail.HtmlBodyStream, Encoding.UTF8, 1024, true)) { doc.DocumentNode.WriteTo(sw); sw.Flush(); mail.HtmlBodyStream.Seek(0, SeekOrigin.Begin); } mail.HtmlBodyStream.Seek(0, SeekOrigin.Begin); } else { foreach (var attach in attchments) { if (!string.IsNullOrEmpty(attach.contentId)) { mail.HtmlBody = mail.HtmlBody.Replace(string.Format("cid:{0}", attach.contentId.Trim('<').Trim('>')), attach.storedFileUrl); } else if (!string.IsNullOrEmpty(attach.contentLocation)) { mail.HtmlBody = mail.HtmlBody.Replace(string.Format("{0}", attach.contentLocation), attach.storedFileUrl); } else { //This attachment is not embedded; attach.contentId = null; attach.contentLocation = null; } } } } catch (Exception ex) { log.ErrorFormat("ReplaceEmbeddedImages() \r\n Exception: \r\n{0}\r\n", ex.ToString()); } }
public static void LoadCalendarInfo(this MailMessageData mail, MimeMessage message, ILog log = null) { if (!message.BodyParts.Any()) { return; } log = log ?? new NullLog(); try { var calendarParts = message.BodyParts.Where(p => p.ContentType.IsMimeType("text", "calendar")).ToList(); if (!calendarParts.Any()) { return; } log.DebugFormat("LoadCalendarInfo found {0} calendars", calendarParts.Count); foreach (var calendarPart in calendarParts) { var p = calendarPart as TextPart; if (p == null) { continue; } var ics = p.Text; var calendar = MailUtil.ParseValidCalendar(ics, log); if (calendar == null) { continue; } if (calendar.Events[0].Organizer == null && calendar.Method.Equals(Defines.ICAL_REPLY, StringComparison.OrdinalIgnoreCase)) { // Fix reply organizer (Outlook style of Reply) var toAddress = message.To.Mailboxes.FirstOrDefault(); if (toAddress != null) { calendar.Events[0].Organizer = new Ical.Net.DataTypes.Organizer("mailto:" + toAddress.Address) { CommonName = string.IsNullOrEmpty(toAddress.Name) ? toAddress.Address : toAddress.Name }; ics = MailUtil.SerializeCalendar(calendar); } } mail.CalendarUid = calendar.Events[0].Uid; mail.CalendarId = -1; mail.CalendarEventIcs = ics; mail.CalendarEventCharset = string.IsNullOrEmpty(p.ContentType.Charset) ? Encoding.UTF8.HeaderName : p.ContentType.Charset; mail.CalendarEventMimeType = p.ContentType.MimeType; log.DebugFormat("Calendar UID: {0} Method: {1} ics: {2}", mail.CalendarUid, calendar.Method, mail.CalendarEventIcs); var calendarExists = message.Attachments .Any( attach => { var subType = attach.ContentType.MediaSubtype.ToLower().Trim(); if (string.IsNullOrEmpty(subType) || (!subType.Equals("ics") && !subType.Equals("ical") && !subType.Equals("ifb") && !subType.Equals("icalendar") && !subType.Equals("calendar"))) { return(false); } var icsTextPart = attach as TextPart; string icsAttach; if (icsTextPart != null) { icsAttach = icsTextPart.Text; } else { using (var stream = new MemoryStream()) { p.Content.DecodeTo(stream); var bytes = stream.ToArray(); var encoding = MailUtil.GetEncoding(p.ContentType.Charset); icsAttach = encoding.GetString(bytes); } } var cal = MailUtil.ParseValidCalendar(icsAttach, log); if (cal == null) { return(false); } return(mail.CalendarUid == cal.Events[0].Uid); }); if (calendarExists) { log.Debug("Calendar exists as attachment"); continue; } if (calendarPart.ContentDisposition == null) { calendarPart.ContentDisposition = new ContentDisposition(); } if (string.IsNullOrEmpty(calendarPart.ContentDisposition.FileName)) { calendarPart.ContentDisposition.FileName = calendar.Method == Defines.ICAL_REQUEST ? "invite.ics" : calendar.Method == Defines.ICAL_REPLY ? "reply.ics" : "cancel.ics"; } mail.LoadAttachments(new List <MimeEntity> { calendarPart }, true); } } catch (Exception ex) { log.ErrorFormat("LoadCalendarInfo() \r\n Exception: \r\n{0}\r\n", ex.ToString()); } }
public bool IsConditionSucceed(MailSieveFilterConditionData condition, MailMessageData message) { try { bool success; Func <ConditionOperationType, string, string, bool> isSucceed = (o, vLeft, vRight) => { if (string.IsNullOrEmpty(vLeft)) { return(string.IsNullOrEmpty(vRight)); } if (vRight == null) { return(false); } switch (o) { case ConditionOperationType.Matches: return(vLeft.Equals(vRight, StringComparison.InvariantCultureIgnoreCase)); case ConditionOperationType.NotMatches: return(!vLeft.Equals(vRight, StringComparison.InvariantCultureIgnoreCase)); case ConditionOperationType.Contains: return(vLeft.IndexOf(vRight, StringComparison.InvariantCultureIgnoreCase) >= 0); case ConditionOperationType.NotContains: return(vLeft.IndexOf(vRight, StringComparison.InvariantCultureIgnoreCase) == -1); default: throw new ArgumentOutOfRangeException("o", o, null); } }; Func <List <MailAddress>, ConditionOperationType, string, bool> compareToFilter = (addresses, o, v) => { return(addresses.Any(a => isSucceed(o, a.DisplayName, v) || isSucceed(o, a.Address, v))); }; switch (condition.Key) { case ConditionKeyType.From: MailAddress address = null; MailUtil.SkipErrors(() => { var a = Parser.ParseAddress(message.From); address = new MailAddress(a.Email, a.Name); }); success = address == null ? isSucceed(condition.Operation, message.From, condition.Value) : compareToFilter(new List <MailAddress> { address }, condition.Operation, condition.Value); break; case ConditionKeyType.ToOrCc: success = compareToFilter(message.ToList, condition.Operation, condition.Value) || compareToFilter(message.CcList, condition.Operation, condition.Value); break; case ConditionKeyType.To: success = compareToFilter(message.ToList, condition.Operation, condition.Value); break; case ConditionKeyType.Cc: success = compareToFilter(message.CcList, condition.Operation, condition.Value); break; case ConditionKeyType.Subject: success = isSucceed(condition.Operation, message.Subject, condition.Value); break; default: throw new ArgumentOutOfRangeException(); } return(success); } catch (Exception ex) { Log.Error(ex.ToString()); } return(false); }
public void AddRelationshipEvents(MailMessageData message, string httpContextScheme = null) { using (var scope = DIHelper.Resolve()) { var factory = scope.Resolve <CRM.Core.Dao.DaoFactory>(); foreach (var contactEntity in message.LinkedCrmEntityIds) { switch (contactEntity.Type) { case CrmContactData.EntityTypes.Contact: var crmContact = factory.ContactDao.GetByID(contactEntity.Id); CRMSecurity.DemandAccessTo(crmContact); break; case CrmContactData.EntityTypes.Case: var crmCase = factory.CasesDao.GetByID(contactEntity.Id); CRMSecurity.DemandAccessTo(crmCase); break; case CrmContactData.EntityTypes.Opportunity: var crmOpportunity = factory.DealDao.GetByID(contactEntity.Id); CRMSecurity.DemandAccessTo(crmOpportunity); break; } var fileIds = new List <object>(); var apiHelper = new ApiHelper(httpContextScheme ?? Defines.DefaultApiSchema); foreach (var attachment in message.Attachments.FindAll(attach => !attach.isEmbedded)) { if (attachment.dataStream != null) { attachment.dataStream.Seek(0, SeekOrigin.Begin); var uploadedFileId = apiHelper.UploadToCrm(attachment.dataStream, attachment.fileName, attachment.contentType, contactEntity); if (uploadedFileId != null) { fileIds.Add(uploadedFileId); } } else { using (var file = attachment.ToAttachmentStream()) { var uploadedFileId = apiHelper.UploadToCrm(file.FileStream, file.FileName, attachment.contentType, contactEntity); if (uploadedFileId != null) { fileIds.Add(uploadedFileId); } } } } apiHelper.AddToCrmHistory(message, contactEntity, fileIds); Log.InfoFormat( "CrmLinkEngine->AddRelationshipEvents(): message with id = {0} has been linked successfully to contact with id = {1}", message.Id, contactEntity.Id); } } }
public void ApplyFilters(MailMessageData message, MailBoxData mailbox, MailFolder folder, List <MailSieveFilterData> filters) { var listAppliedFilters = new List <MailSieveFilterData>(); if (!filters.Any()) { return; } foreach (var filter in filters) { if (!filter.Enabled) { continue; } if (filter.Options.ApplyTo.Folders.Any() && !filter.Options.ApplyTo.Folders.Contains((int)folder.Folder)) { continue; } if (filter.Options.ApplyTo.Mailboxes.Any() && !filter.Options.ApplyTo.Mailboxes.Contains(mailbox.MailBoxId)) { continue; } var appliedCount = filter.Conditions.Count(c => { var success = IsConditionSucceed(c, message); if (success) { Log.InfoFormat("Filter condition succeed -> {0} {1} '{2}'", Enum.GetName(typeof(ConditionKeyType), c.Key), Enum.GetName(typeof(ConditionOperationType), c.Operation), c.Value); } return(success); }); switch (filter.Options.MatchMultiConditions) { case MatchMultiConditionsType.MatchAll: case MatchMultiConditionsType.None: if (filter.Conditions.Count == appliedCount) { listAppliedFilters.Add(filter); } else if (appliedCount > 0) { Log.InfoFormat("Skip filter by not match all conditions"); } break; case MatchMultiConditionsType.MatchAtLeastOne: if (appliedCount > 0) { listAppliedFilters.Add(filter); } break; default: Log.Error("Unknown MatchMultiConditionsType"); break; } if (appliedCount > 0 && filter.Options.IgnoreOther) { break; } } foreach (var filter in listAppliedFilters) { foreach (var action in filter.Actions) { try { Log.InfoFormat("Apply filter (id={0}) action: '{1}'{2}", filter.Id, Enum.GetName(typeof(ActionType), action.Action), action.Action == ActionType.MarkTag || action.Action == ActionType.MoveTo ? " id=" + action.Data : ""); ApplyAction(new List <int> { message.Id }, action); } catch (NotFoundFilterDataException ex) { Log.Error(ex.ToString()); Log.DebugFormat("Disable filter with id={0}", filter.Id); filter.Enabled = false; Factory.FilterEngine.Update(filter); break; } catch (Exception e) { Log.ErrorFormat("ApplyFilters(filterId = {0}, mailId = {1}) Exception:\r\n{2}\r\n", filter.Id, message.Id, e.ToString()); } } } }
public static void ExtractMainParts(this MailMessageData mail, MimeMessage message) { var htmlStream = new MemoryStream(); var textStream = new MemoryStream(); Action <MimeEntity> loadRealAttachment = (part) => { if ((part.ContentDisposition != null && !string.IsNullOrEmpty(part.ContentDisposition.FileName)) || part.ContentType != null && !string.IsNullOrEmpty(part.ContentType.Name)) { mail.LoadAttachments(new List <MimeEntity> { part }); } }; Action <MimePart> setBodyOrAttachment = (part) => { var entity = part as TextPart; if (htmlStream == null || textStream == null) { throw new Exception("Streams are not initialized"); } if ((entity == null || htmlStream.Length != 0 && entity.IsHtml || textStream.Length != 0 && !entity.IsHtml)) { loadRealAttachment(part); } else { if (mail.Introduction.Length < 200 && (!entity.IsHtml && !string.IsNullOrEmpty(entity.Text))) { if (string.IsNullOrEmpty(mail.Introduction)) { mail.Introduction = (entity.Text.Length > 200 ? entity.Text.Substring(0, 200) : entity.Text); } else { var need = 200 - mail.Introduction.Length; mail.Introduction += (entity.Text.Length > need ? entity.Text.Substring(0, need) : entity.Text); } mail.Introduction = mail.Introduction.Replace("\r\n", " ").Replace("\n", " ").Trim(); } var body = ConvertToHtml(entity); if (entity.IsHtml) { using (var sw = new StreamWriter(htmlStream, Encoding.UTF8, 1024, true)) { sw.Write(body); sw.Flush(); htmlStream.Seek(0, SeekOrigin.Begin); } } else { using (var sw = new StreamWriter(textStream, Encoding.UTF8, 1024, true)) { sw.Write(body); sw.Flush(); textStream.Seek(0, SeekOrigin.Begin); } } } }; var newPathIndex = ""; using (var sw = new StreamWriter(mail.HtmlBodyStream, Encoding.UTF8, 1024, true)) { using (var iter = new MimeIterator(message)) { while (string.IsNullOrEmpty(newPathIndex) ? iter.MoveNext() : iter.MoveTo(newPathIndex)) { if (!string.IsNullOrEmpty(newPathIndex)) { newPathIndex = ""; } var multipart = iter.Parent as Multipart; var part = iter.Current as MimePart; var subMessage = iter.Current as MessagePart; if (subMessage != null) { if ((subMessage.ContentDisposition != null && !string.IsNullOrEmpty(subMessage.ContentDisposition.FileName)) || subMessage.ContentType != null && !string.IsNullOrEmpty(subMessage.ContentType.Name)) { mail.LoadAttachments(new List <MimeEntity> { subMessage }, true); } else { subMessage.ContentDisposition = new ContentDisposition { Disposition = ContentDisposition.Attachment, FileName = "message.eml" }; mail.LoadAttachments(new List <MimeEntity> { subMessage }, true); } float pathIndex; if (float.TryParse(iter.PathSpecifier, out pathIndex)) { pathIndex++; newPathIndex = ((int)pathIndex).ToString(); continue; } } if (part == null || iter.Parent is MessagePart) { continue; } if (part.IsAttachment) { if (part is TnefPart) { var tnefPart = iter.Current as TnefPart; if (tnefPart != null) { mail.LoadAttachments(tnefPart.ExtractAttachments(), true); } } else { mail.LoadAttachments(new List <MimeEntity> { part }, multipart == null || !multipart.ContentType.MimeType.ToLowerInvariant().Equals("multipart/related")); } } else if (multipart != null) { switch (multipart.ContentType.MimeType.ToLowerInvariant()) { case "multipart/report": if (part is TextPart) { var entity = part as TextPart; if (entity == null) { entity = new TextPart(TextFormat.Plain); entity.SetText(Encoding.UTF8, part.ToString()); } var body = ConvertToHtml(entity); if (mail.HtmlBodyStream.Length == 0) { sw.Write(body); } else { sw.Write("<hr /><br/>"); sw.Write(body); } sw.Flush(); } else if (part is MessageDeliveryStatus) { var entity = new TextPart(TextFormat.Plain); var mds = (MessageDeliveryStatus)part; using (var memory = new MemoryStream()) { mds.Content.DecodeTo(memory); var text = Encoding.ASCII.GetString(memory.GetBuffer(), 0, (int)memory.Length) .Replace("\r\n", "\n"); entity.SetText(Encoding.UTF8, text); } var body = ConvertToHtml(entity); if (mail.HtmlBodyStream.Length == 0) { sw.Write(body); } else { sw.Write("<hr /><br/>"); sw.Write(body); } sw.Flush(); } else { loadRealAttachment(part); } break; case "multipart/mixed": if (part is TextPart) { var entity = part as TextPart; var body = ConvertToHtml(entity); if (mail.HtmlBodyStream.Length == 0) { sw.Write(body); } else { sw.Write("<hr /><br/>"); sw.Write(body); } sw.Flush(); } else { if (part.ContentType != null && part.ContentType.MediaType.Equals("image", StringComparison.InvariantCultureIgnoreCase) && part.ContentDisposition != null && part.ContentDisposition.Disposition.Equals(ContentDisposition.Inline, StringComparison.InvariantCultureIgnoreCase)) { if (string.IsNullOrEmpty(part.ContentId)) { part.ContentId = Guid.NewGuid().ToString("N").ToLower(); } mail.LoadAttachments(new List <MimeEntity> { part }); sw.Write("<hr /><br/>"); sw.Write("<img src=\"cid:{0}\">", part.ContentId); sw.Flush(); } else { loadRealAttachment(part); } } break; case "multipart/alternative": if (part is TextPart) { setBodyOrAttachment(part); } else { loadRealAttachment(part); } break; case "multipart/related": if (part is TextPart) { setBodyOrAttachment(part); } else if (!string.IsNullOrEmpty(part.ContentId) || part.ContentLocation != null) { mail.LoadAttachments(new List <MimeEntity> { part }); } else { loadRealAttachment(part); } break; default: if (part is TextPart) { setBodyOrAttachment(part); } else { loadRealAttachment(part); } break; } } else { if (part is TextPart) { setBodyOrAttachment(part); } else { loadRealAttachment(part); } } } } if (htmlStream.Length != 0) { if (mail.HtmlBodyStream.Length > 0) { sw.Write("<hr /><br/>"); sw.Flush(); } htmlStream.CopyTo(sw.BaseStream); } else if (textStream.Length != 0) { if (mail.HtmlBodyStream.Length == 0) { mail.TextBodyOnly = true; } else { sw.Write("<hr /><br/>"); sw.Flush(); } textStream.CopyTo(sw.BaseStream); } htmlStream.Dispose(); textStream.Dispose(); } if (mail.HtmlBodyStream.Length != 0) { return; } mail.HtmlBody = "<body><pre> </pre></body>"; mail.Introduction = ""; mail.TextBodyOnly = true; }
static void MessageReceivedHandler(object sender, MailMessageData message) { Console.WriteLine( $"({DateTime.Now}) [+] Сообщение получено из брокера [To:{ message.To}, From: { message.From}, {message.Subject}]" ); }