private string ExtractFileFromAttachment(string filename, string archFileName, string externalFileName) { using (var fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read)) { var logger = LogManager.GetLogger(GetType()); try { var message = Mime.Parse(fs); message = UueHelper.ExtractFromUue(message, Path.GetTempPath()); var attachments = message.GetValidAttachements(); foreach (var entity in attachments) { var attachmentFilename = entity.GetFilename(); if (!FileHelper.CheckMask(attachmentFilename, archFileName) && !FileHelper.CheckMask(attachmentFilename, externalFileName)) { continue; } attachmentFilename = Path.Combine(Path.GetTempPath(), attachmentFilename); entity.DataToFile(attachmentFilename); return(attachmentFilename); } } catch (Exception ex) { logger.ErrorFormat( "Возникла ошибка при попытке перепровести прайс. Не удалось обработать файл {0}. Файл должен быть письмом (*.eml)\n{1}", filename, ex); throw; } } throw new Exception(String.Format("В архиве '{0}' не удалось найти архив '{1}' или файл прайс листа {2}", filename, archFileName, externalFileName)); }
/// <summary> /// Происходит разбор собственно вложения и сверка его с источниками /// </summary> private void UnPack(Mime m, ref bool Matched, AddressList FromList, string ShortFileName) { //Раньше не проверялся весь список From, теперь это делается. Туда же добавляется и Sender foreach (var mbFrom in FromList.Mailboxes) { //Раньше не проверялся весь список TO, теперь это делается foreach (var mba in m.MainEntity.To.Mailboxes) { var drLS = dtSources.Select(String.Format("(EMailTo = '{0}') and (EMailFrom like '*{1}*')", MimeEntityExtentions.GetCorrectEmailAddress(mba.EmailAddress), mbFrom.EmailAddress)); foreach (DataRow drS in drLS) { if ((drS[SourcesTableColumns.colPriceMask] is String) && !String.IsNullOrEmpty(drS[SourcesTableColumns.colPriceMask].ToString())) { var priceMask = (string)drS[SourcesTableColumns.colPriceMask]; var priceMaskIsMatched = FileHelper.CheckMask(ShortFileName, priceMask); if (priceMaskIsMatched) { SetCurrentPriceCode(drS); // Пробуем разархивировать var correctArchive = FileHelper.ProcessArchiveIfNeeded(CurrFileName, ExtrDirSuffix, drS["ArchivePassword"].ToString()); if (correctArchive) { string extrFile; if (ProcessPriceFile(CurrFileName, out extrFile, (ulong)PriceSourceType.EMail)) { Matched = true; LogDownloadedPrice((ulong)PriceSourceType.EMail, Path.GetFileName(CurrFileName), extrFile); } else { LogDownloaderFail((ulong)PriceSourceType.EMail, "Не удалось обработать файл '" + Path.GetFileName(CurrFileName) + "'", Path.GetFileName(CurrFileName)); } } else { LogDownloaderFail((ulong)PriceSourceType.EMail, "Не удалось распаковать файл '" + Path.GetFileName(CurrFileName) + "'. Файл поврежден", Path.GetFileName(CurrFileName)); } drS.Delete(); } } } dtSources.AcceptChanges(); } //foreach (MailboxAddress mba in m.MainEntity.To.Mailboxes) } //foreach (MailboxAddress mbFrom in FromList.Mailboxes) }