Как получить тело письма с помощью EWS? - PullRequest
1 голос
/ 23 марта 2020

Я получаю электронные письма из папки «Входящие» Outlook для отображения на экране поиска электронной почты на основе фильтров (Отправитель, Тема, Сообщение).

Я могу получить все, кроме тела электронного письма. mail:

OutlookRepository.cs:

public FindItemsResults<Item> GetEmails(string loginUsuario, string de, string assunto, string conteudo, WellKnownFolderName pasta = WellKnownFolderName.Inbox)
        {
            ExchangeService service = GetExchangeService(loginUsuario);

            var inbox = Folder.Bind(service, WellKnownFolderName.Inbox);

            SearchFilter sf = null;

            // Search by Sender
            if (!string.IsNullOrWhiteSpace(de))
                sf = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.ContainsSubstring(EmailMessageSchema.From, de));

            // Search by Subject
            if (!string.IsNullOrWhiteSpace(assunto))
                sf = new SearchFilter.SearchFilterCollection(LogicalOperator.Or, new SearchFilter.ContainsSubstring(EmailMessageSchema.Subject, assunto));

            // Search by Body
            if (!string.IsNullOrWhiteSpace(conteudo))
                sf = new SearchFilter.SearchFilterCollection(LogicalOperator.Or, new SearchFilter.ContainsSubstring(EmailMessageSchema.Body, conteudo));

            var view = new ItemView(100);

            var emails = service.FindItems(pasta, sf, view);

            return emails;
        }

При возврате «электронных писем» Body выдает исключение: Body = '(new System.Linq. SystemCore_EnumerableDebugView (электронная почта) .Items [0]). Тело »сгенерировало исключение типа« Microsoft.Exchange.WebServices.Data.ServiceObjectPropertyException »

EmailController.cs:

public JsonResult PesquisarEmails(string de, string assunto, string conteudo)
        {
            FindItemsResults<Item> emails = ServiceFactory.GetService<IComunicacaoService>(true).RecuperarEmails(UsuarioAutenticado.Funcionario.Login, de, assunto, conteudo);

            var lista = new List<EmailFormatado>();

            foreach (Item email in emails)
            {
                lista.Add(new EmailFormatado()
                { 
                    DataEmail = email.DateTimeReceived.FormatarDataCompleta(),
                    Remetente = (email as EmailMessage).From.Address,
                    AssuntoEmail = email.Subject,
                    Descricao = email.TextBody
            });
            }

            return Json(lista, JsonRequestBehavior.AllowGet);
        }

Попытка использовать "email.TextBody" и "email.Body", но она вызывает исключение: email.TextBody = 'email.TextBody' вызвала исключение типа 'Microsoft.Exchange.WebServices .Data.ServiceObjectPropertyException '

Любая помощь?

1 Ответ

0 голосов
/ 25 марта 2020

Операция findItem возвращает только подмножество свойств Item, а Body не возвращается (адрес from.address также не отображается), см. https://github.com/MicrosoftDocs/office-developer-exchange-docs/blob/master/docs/exchange-web-services/email-properties-and-elements-in-ews-in-exchange.md, поэтому вам потребуется либо код, либо Загрузка каждого элемента (плохая идея с точки зрения производительности) или LoadPropertiesFromItems, например что-то вроде

service.LoadPropertiesForItems(emails, PropertySet.FirstClassProperties);
...