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); }
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("Не найден источник."); } }
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); } }