public void Person_contact_from_supplier()
		{
			var message = Mime.Parse(@"..\..\Data\MailContextFixture\Unparse_Protek.eml");
			var context = new MailContext();
			var name = Generator.Name();
			var email = name + "@test.ru";
			var fromList = new AddressList();
			fromList.Add(new MailboxAddress(email));

			var supplier = TestSupplier.CreateNaked(session);
			supplier.Name = name;
			session.Save(supplier);
			var group = supplier.ContactGroupOwner.AddContactGroup(ContactGroupType.MiniMails);
			session.Save(group);
			group.AddPerson("Tестовая персона");
			session.Save(group.Persons[0]);
			var contact = group.Persons[0].AddContact(ContactType.Email, email);
			session.Save(contact);

			FlushAndCommit();
			context.ParseMime(message, fromList);

			Assert.AreEqual(context.Suppliers.Count, 1);
			Assert.AreEqual(context.Suppliers[0].Name, name);
		}
		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("Не смогли разобрать список отправителей письма для сопоставления с поставщиками"));
		}
Пример #3
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;
        }