Example #1
0
        public static IEnumerable <string> GetAttachmentFilenames(this Mime mime)
        {
            var result      = new List <string>();
            var attachments = mime.GetValidAttachements();

            foreach (var entity in attachments)
            {
                result.Add(entity.GetFilename());
            }
            return(result);
        }
Example #2
0
        protected override void ProcessAttachs(Mime m, AddressList fromList)
        {
            if (_context == null)
            {
                throw new EMailSourceHandlerException("Не установлен контекст для обработки письма");
            }

            Cleanup();

            var mail = new Mail(_context);

            var attachments = m.GetValidAttachements();

            foreach (var entity in attachments)
            {
                SaveAttachement(entity);
                mail.Attachments.Add(new Attachment(mail, CurrFileName));
            }
            mail.Size = (uint)(_context.BodyLength + mail.Attachments.Sum(a => a.Size));

            foreach (var verifyRecipient in _context.VerifiedRecipients)
            {
                verifyRecipient.Mail = mail;
                mail.MailRecipients.Add(verifyRecipient);
            }

            var mailLogs = _context.Users.Select(i => new MailSendLog(i.Key, i.Value)).ToList();

            var attachmentLogs = new List <AttachmentSendLog>();

            foreach (var attachement in mail.Attachments)
            {
                attachmentLogs.AddRange(_context.Users.Select(i => new AttachmentSendLog {
                    Attachment = attachement, User = i.Key
                }));
            }

            Ping();

            using (var transaction = new TransactionScope(OnDispose.Rollback)) {
                mail.Save();
                mail.Attachments.Each(a =>
                                      File.Copy(
                                          a.LocalFileName,
                                          Path.Combine(Settings.Default.AttachmentPath, a.GetSaveFileName())));

                mailLogs.ForEach(l => l.Save());
                attachmentLogs.ForEach(l => l.Save());

                transaction.VoteCommit();
            }
        }
        protected virtual void ProcessAttachs(Mime m, AddressList fromList)
        {
            //Один из аттачментов письма совпал с источником, иначе - письмо не распознано
            var matched = false;

            var attachments = m.GetValidAttachements();

            foreach (var entity in attachments)
            {
                var attachmentFileName = SaveAttachement(entity);
                UnPack(m, ref matched, fromList, attachmentFileName);
                Cleanup();
            }

            if (!matched)
            {
                throw new EMailSourceHandlerException("Не найден источник.");
            }
        }
Example #4
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;
        }
        protected override void ProcessAttachs(Mime mime, AddressList fromList)
        {
            //Один из аттачментов письма совпал с источником, иначе - письмо не распознано
            bool matched = false;

            /*
             * В накладных письма обрабатываются немного по-другому:
             * письма обрабатываются относительно адреса отправителя
             * и если такой отправитель найден в истониках, то все вложения
             * сохраняются относительно него.
             * Если он не найден, то ничего не делаем.
             */
            if (fromList == null)
            {
                _logger.Info("WaybillEmailSourceHandler: Адрес отправителя пуст");
            }
            if (fromList.Count == 0)
            {
                _logger.Info("WaybillEmailSourceHandler: Адреса в коллекции не обнаружены");
            }
            if (fromList.Mailboxes.Length == 0)
            {
                _logger.Info("WaybillEmailSourceHandler: Список адресов mailboxes пустой");
            }

            foreach (var mbFrom in fromList.Mailboxes)
            {
                var sources = dtSources.Select(String.Format("({0} like '*{1}*')",
                                                             WaybillSourcesTable.colEMailFrom, mbFrom.EmailAddress));
                // Адрес отправителя должен быть только у одного поставщика,
                // если получилось больше, то ищем поставщика, который доступен клиенту,
                // если таких нет или несколько, то это ошибка

                DataRow source;

                if (sources.Length > 1)
                {
                    source = SelectWaybillSourceForClient(sources, _addressId);
                    if (source == null)
                    {
                        _logger.Info(String.Format("WaybillEmailSourceHandler: На адрес \"{0}\"" +
                                                   "назначено несколько поставщиков. Определить какой из них работает с клиентом не удалось", mbFrom.EmailAddress));
                        throw new Exception(String.Format(
                                                "На адрес \"{0}\" назначено несколько поставщиков. Определить какой из них работает с клиентом не удалось", mbFrom.EmailAddress));
                    }
                }
                else if (sources.Length == 0)
                {
                    var addition = dtSources.Rows == null ? "В строках источников находится null" : String.Format("Количество записей в источниках - {0}", dtSources.Rows.Count);
                    _logger.Info(String.Format("WaybillEmailSourceHandler: Не найдено записи в источниках, соответствующей адресу {0}. {1}", mbFrom.EmailAddress, addition));
                    if (dtSources.Rows != null && dtSources.Rows.Count > 0)
                    {
                        var count1 = dtSources.Select(String.Format("({0} like '*{1}*')",
                                                                    WaybillSourcesTable.colEMailFrom, mbFrom.EmailAddress)).Length;
                        var count2 = dtSources.Select(String.Format("({0} like '%{1}%')",
                                                                    WaybillSourcesTable.colEMailFrom, mbFrom.EmailAddress)).Length;
                        _logger.Info(String.Format("WaybillEmailSourceHandler: Делаем попытку выбрать нужные записи иначе: " +
                                                   "количество через * - {0}, через % - {1}, исходное - {2}", count1, count2, sources.Count()));
                    }
                    continue;
                }
                else
                {
                    source = sources.Single();
                }

                var attachments = mime.GetValidAttachements();
                if (!attachments.Any())
                {
                    _logger.Info(String.Format("WaybillEmailSourceHandler: Отсутствуют вложения в письме от адреса {0}", mbFrom.EmailAddress));
                }
                //двойная очистка FileCleaner и Cleanup нужно оставить только одно
                //думаю Cleaner подходит лучше
                using (var cleaner = new FileCleaner()) {
                    var savedFiles = new List <string>();
                    foreach (var entity in attachments)
                    {
                        SaveAttachement(entity);
                        var correctArchive = FileHelper.ProcessArchiveIfNeeded(CurrFileName, ExtrDirSuffix);
                        matched = true;
                        if (!correctArchive)
                        {
                            DocumentReceiveLog.Log(Convert.ToUInt32(source[WaybillSourcesTable.colFirmCode]),
                                                   _addressId,
                                                   Path.GetFileName(CurrFileName),
                                                   _currentDocumentType.DocType,
                                                   "Не удалось распаковать файл",
                                                   IMAPHandler.CurrentUID);
                            Cleanup();
                            continue;
                        }
                        if (ArchiveHelper.IsArchive(CurrFileName))
                        {
                            var files = Directory.GetFiles(CurrFileName + ExtrDirSuffix +
                                                           Path.DirectorySeparatorChar, "*.*", SearchOption.AllDirectories);
                            savedFiles.AddRange(files);
                            cleaner.Watch(files);
                        }
                        else
                        {
                            savedFiles.Add(CurrFileName);
                            cleaner.Watch(CurrFileName);
                        }
                    }
                    var logs = ProcessWaybillFile(savedFiles, source);

                    var service = new WaybillService();
                    service.Process(logs);
                    if (service.Exceptions.Count > 0)
                    {
                        SendErrorLetterToSupplier(service.Exceptions.First(), mime);
                    }
                }
                Cleanup();
                source.Delete();
                dtSources.AcceptChanges();
            }             //foreach (MailboxAddress mbFrom in FromList.Mailboxes)

            if (!matched)
            {
                throw new EmailFromUnregistredMail(
                          "Для данного E-mail не найден источник в таблице documents.waybill_sources",
                          Settings.Default.ResponseDocSubjectTemplateOnUnknownProvider,
                          Settings.Default.ResponseDocBodyTemplateOnUnknownProvider);
            }
        }