public void IsMailAddresTest()
 {
     Assert.AreEqual(true, MimeEntityExtentions.IsMailAddress("*****@*****.**"), "Адрес некорректен");
     Assert.AreEqual(false, MimeEntityExtentions.IsMailAddress("zakaz"), "Адрес некорректен");
     Assert.AreEqual(false, MimeEntityExtentions.IsMailAddress("zakaz@"), "Адрес некорректен");
     Assert.AreEqual(true, MimeEntityExtentions.IsMailAddress("zakaz@dsds"), "Адрес некорректен");
     Assert.AreEqual(true, MimeEntityExtentions.IsMailAddress("<'*****@*****.**'>"), "Адрес некорректен");
 }
        /// <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)
        }
        public void SendErrorLetterToSupplier(EMailSourceHandlerException e, Mime sourceLetter)
        {
            try {
                var miniMailException = e as MiniMailException;
                if (miniMailException != null)
                {
                    e.MailTemplate = TemplateHolder.GetTemplate(miniMailException.Template);
                }

                if (e.MailTemplate.IsValid())
                {
                    var FromList = MimeEntityExtentions.GetAddressList(sourceLetter);

                    var from = new AddressList();

                    @from.Parse("*****@*****.**");

                    var responseMime = new Mime();
                    responseMime.MainEntity.From = @from;
#if DEBUG
                    var toList = new AddressList {
                        new MailboxAddress(Settings.Default.SMTPUserFail)
                    };
                    responseMime.MainEntity.To = toList;
#else
                    responseMime.MainEntity.To = FromList;
#endif
                    responseMime.MainEntity.Subject     = e.MailTemplate.Subject;
                    responseMime.MainEntity.ContentType = MediaType_enum.Multipart_mixed;

                    var testEntity = responseMime.MainEntity.ChildEntities.Add();
                    testEntity.ContentType             = MediaType_enum.Text_plain;
                    testEntity.ContentTransferEncoding = ContentTransferEncoding_enum.QuotedPrintable;
                    testEntity.DataText = e.GetBody(sourceLetter);

                    var attachEntity = responseMime.MainEntity.ChildEntities.Add();
                    attachEntity.ContentType                 = MediaType_enum.Application_octet_stream;
                    attachEntity.ContentTransferEncoding     = ContentTransferEncoding_enum.Base64;
                    attachEntity.ContentDisposition          = ContentDisposition_enum.Attachment;
                    attachEntity.ContentDisposition_FileName = (!String.IsNullOrEmpty(sourceLetter.MainEntity.Subject)) ? sourceLetter.MainEntity.Subject + ".eml" : "Unrec.eml";
                    attachEntity.Data = sourceLetter.ToByteData();

                    Send(responseMime);
                }
                else
                {
                    _logger.ErrorFormat("Для исключения '{0}' не установлен шаблон", e.GetType());
                }
            }
            catch (Exception exception) {
                _logger.WarnFormat("Ошибка при отправке письма поставщику: {0}", exception);
            }
        }
		public void FromAddressParseProblem()
		{
			var message = Mime.Parse(@"..\..\Data\MailContextFixture\Unparse_Protek.eml");
			var fromList = MimeEntityExtentions.GetAddressList(message);
			Assert.That(fromList.Count, Is.EqualTo(0), "Список разборанных адресов отправителя должен быть пустым");

			var context = new MailContext();

			var exception = Assert.Throws<FromParseException>(() => context.ParseMime(message, fromList));

			Assert.That(exception.Message, Is.StringStarting("Не смогли разобрать список отправителей письма для сопоставления с поставщиками"));
		}
        public void ProcessMime(Mime m)
        {
            var from = MimeEntityExtentions.GetAddressList(m);

            m = UueHelper.ExtractFromUue(m, DownHandlerPath);
            FillSourcesTable();
            try {
                CheckMime(m);
                ProcessAttachs(m, from);
            }
            catch (EMailSourceHandlerException e) {
                // Формируем список приложений, чтобы использовать
                // его при отчете о нераспознанном письме
                ErrorOnMessageProcessing(m, from, e);
            }
        }
Ejemplo n.º 6
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;
        }