コード例 #1
0
        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);
        }
コード例 #2
0
 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());
     }
 }
コード例 #3
0
        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);
        }
コード例 #4
0
        /// <summary>
        /// Парсинг принятого сообщения
        /// </summary>
        private MailMessageData ParseMailMessageData(byte[] rawBytes)
        {
            var             json    = Encoding.UTF8.GetString(rawBytes);
            MailMessageData message = MessageFormatter.MessageFormatter.JsonToMailMessage(json);

            return(message);
        }
コード例 #5
0
ファイル: Converter.cs プロジェクト: Alibek23/CommunityServer
        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);
        }
コード例 #6
0
        /// <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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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());
            }
        }
コード例 #9
0
        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;
            }
        }
コード例 #10
0
ファイル: MailSender.cs プロジェクト: r3utov/EmailBroker
        /// <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);
        }
コード例 #11
0
        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);
            }
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        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);
        }
コード例 #14
0
        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);
        }
コード例 #15
0
        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);
        }
コード例 #16
0
        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>&nbsp;</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);
        }
コード例 #17
0
        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);
        }
コード例 #18
0
        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());
            }
        }
コード例 #19
0
        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());
            }
        }
コード例 #20
0
        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);
        }
コード例 #21
0
        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);
                }
            }
        }
コード例 #22
0
        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());
                    }
                }
            }
        }
コード例 #23
0
        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>&nbsp;</pre></body>";
            mail.Introduction = "";
            mail.TextBodyOnly = true;
        }
コード例 #24
0
ファイル: Program.cs プロジェクト: r3utov/EmailBroker
 static void MessageReceivedHandler(object sender, MailMessageData message)
 {
     Console.WriteLine(
         $"({DateTime.Now}) [+] Сообщение получено из брокера [To:{ message.To}, From: { message.From}, {message.Subject}]"
         );
 }