Exemple #1
0
        public override void CheckMime(Mime m)
        {
            _context = null;

            var context = new MailContext();

            Ping();

            context.ParseMime(m, MimeEntityExtentions.GetAddressList(m));

            Ping();

            if (String.IsNullOrEmpty(context.SHA256MailHash))
            {
                throw new MiniMailOnEmptyLetterException("У письма не установлены тема и тело письма.");
            }

            if (context.Suppliers.Count > 1)
            {
                throw new EMailSourceHandlerException("Найдено несколько источников.");
            }

            if (context.Suppliers.Count == 0)
            {
                throw new MiniMailOnUnknownProviderException(
                          "Для данного E-mail не найден контакт в группе 'Список E-mail, с которых разрешена отправка писем клиентам АналитФармация'",
                          context.SupplierEmails);
            }

            using (new SessionScope()) {
                context.ParseRecipients(m);
            }

            Ping();

            // Все хорошо, если кол-во вложений больше 0 и распознан только один адрес как корректный
            // Если не сопоставили с клиентом)
            if (context.Users.Count == 0)
            {
                if (context.Recipients.All(r => r.Status == RecipientStatus.Duplicate))
                {
                    throw new EmailDoubleMessageException("Письмо было отброшено как дубликат. " + context.SupplierEmails + " " + context.Subject);
                }
                else
                {
                    throw new MiniMailOnEmptyRecipientsException(
                              "Не найден пользователь.",
                              context.GetCauseList());
                }
            }
            else if (context.DiscardedRecipients.Count > 0)
            {
                SendErrorLetterToSupplier(
                    new MiniMailOnEmptyRecipientsException(
                        "Не найден пользователь.",
                        context.GetCauseList()),
                    m);
            }

            if (m.MailSize() / 1024.0 / 1024.0 > Settings.Default.MaxMiniMailSize)
            {
                throw new MiniMailOnMaxMailSizeException(
                          "Размер письма больше максимально допустимого значения ({0} Мб).".Format(Settings.Default.MaxMiniMailSize));
            }

            if (m.Attachments.Length > 0)
            {
                var nonAllowedExtension = false;
                var errorExtension      = String.Empty;
                foreach (var attachment in m.GetValidAttachements())
                {
                    var fileName  = attachment.GetFilename();
                    var extension = Path.GetExtension(fileName);
                    if (!context.IsValidExtension(extension))
                    {
                        nonAllowedExtension = true;
                        errorExtension      = extension;
                        break;
                    }
                }

                if (nonAllowedExtension)
                {
                    throw new MiniMailOnAllowedExtensionsException(
                              "Письмо содержит вложение недопустимого типа.",
                              errorExtension,
                              TemplateHolder.Values.AllowedMiniMailExtensions);
                }
            }

            _context = context;
        }