Exchange 2010 e o Message Tracking

Em uma das últimas POC (Prova de Conceito) que participei, tive a oportunidade de conhecer um pouco mais sobre o Exchange. Eu trabalho com desenvolvimento mais focado em Sharepoint, mas como todos nós sabemos, tocou na criança, o filho é seu Alegre

O que foi solicitado: Acessar o LOG dos emails através dos Web Services do Exchange 2010. O cliente precisa saber se o sistema entregou o email ou não. Ah, e pra completar, você tem que usar a API de desenvolvimento do Exchange e não tem muita documentação dela Alegre Cool!!!

Primeiramente, o que é o Message Tracking?

Message Tracking é um recurso que acompanha o Exchange desde a  versão 2007. Como o próprio nome diz, ele grava todos os passos da mensagem e armazena em arquivos textos. A partir do 2010, foi possível consultar esse LOG através da API 1.0 exchange Web Services. Na prática, esse serviço já está disponível na interface OWA (Outlook Web Access) do 2010.

a) Acesse o OWA 2010 e entre com suas credenciais
b) Clique o botão direito em cima de uma mensagem (na pasta ITENS ENVIADOS ) e selecione a opção “Abrir relatório de entrega”
obs: A primeira vez que tentei fazer isso, essa opção não estava disponível.Caso isso aconteca, clique em opções , organizar email, notificações de entrega , depois que acessei essa tela, a opção no item B apareceu numa boa.

 

image

c) O famoso Message Tracking é esse resultado abaixo. Confira que podemos acompanhar o que aconteceu com a mensagem. No caso, a minha foi entregue ao destinatário

image

Vamos ao que interessa. Acessar essa bagaça via Exchange Web Services. Primeiramente, será necessário fazer o download da API:

Download da API 1.0
http://msdn.microsoft.com/en-us/library/dd877043%28v=EXCHG.140%29.aspx

obs: A versão beta já possui recursos para o Message Tracking, mas como não era possível utilizar em ambiente
produtivo, resolvi utilizar a versão 1.0 mesmo.
Versão beta:
http://msdn.microsoft.com/en-us/library/dd877012%28EXCHG.140%29.aspx

a) Crie seu projeto no visual studio e adiciona a DLL como referência.

b) Adicione o webservice do Exchange. No meu caso, ele está no endereço: https://exchange2010/ews/exchange.asmx

obs: É para adicionar como web service, ok? Não como Service Reference.

b) O seguinte código abaixo acessará a API e fará o download do message Tracking, informando um email como filtro. Farei alguns comentários do código para entendimento

Entidade. Para armazenar de forma amigável o resultado do LOG

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EWS
{
    public class MessageTrackingEntity
    {

        public DateTime Hora { get; set; }
        public string From { get; set; }
        public List<string> Para { get; set; }
        public string Assunto { get; set; }
        public List<string>  DeliveryStatus {get;set;}
        public string Dominio { get; set; }

        public MessageTrackingEntity()
        {
            this.Para = new List<string>();
            this.DeliveryStatus = new List<string>();
        }

    }
}


O código em si. Na prática, ele é uma classe para você instanciar em seu projeto e mandar parametros, customizar o resultado no método MessageTrackingEntityPopulate(). Existem outras informações que você pode extrair desse Message Tracking. Para conhece-las, basta debugar sua aplicação e explorar o objeto retorno. O mesmo que serve como parâmetro para o método acima.

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using EWS.ExchangeEWS;  //Referencia ao webservice



namespace EWS
{
    /// <summary>
    /// Implementador da Interface
    /// </summary>
    public class ProxyAcces: IProxyAcces  //Fiz uma interface, mas beleza. Isso é fácil você ignorar, se for o caso
    {

        /// <summary>
        /// Armazena todos os resultados encontrados
        /// </summary>
     
      //Aqui vou armazenar os resultados. Do tipo da classe acima
       public List<MessageTrackingEntity> METCollection { get; set; } 
        private string ExchangeUrlEws {get; set;}
        private string Usuario { get; set; }
        private string Senha { get; set; }
        private string Dominio { get; set; }                
        
        public ProxyAcces()
        {
           //Credenciais para o web service e endereço do mesmo
            this.ExchangeUrlEws = "https://exchange2010/ews/exchange.asmx";
            this.Usuario = "administrator";
            this.Senha = "senha";
            this.Dominio = "theforest";

            this.METCollection = new List<MessageTrackingEntity>();
        }

        public List<MessageTrackingEntity> CarregarMessageTracking()
        {
            try
            {

                //Esse codigo serve somente para não validar o certificado do site, caso seja inválido. 
                //Isso é importante. As vezes o certificado instalado com o Exchange 2010 não é válido. Ainda mais no ambiente de testes. ou seja, isso aqui resolve o problema

               ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;

                ExchangeServiceBinding binding = new ExchangeServiceBinding();
                binding.RequestServerVersionValue = new RequestServerVersion();
                binding.RequestServerVersionValue.Version = ExchangeVersionType.Exchange2010;                              
                binding.Credentials = new NetworkCredential(this.Usuario, this.Senha, this.Dominio);
                binding.Url = this.ExchangeUrlEws;


                //Pegar o MessageTrackingReportId do MessageTracking
                FindMessageTrackingReportRequestType FMT = new FindMessageTrackingReportRequestType();
                FMT.Sender = new EmailAddressType();
                FMT.Sender.EmailAddress = “ernesto@theforest.com” \\ Aqui você coloca de quem é para pegar o LOG. Email completo.

                FMT.Domain = “TheForest”;                
                FindMessageTrackingReportResponseMessageType retornoFind = binding.FindMessageTrackingReport(FMT);


                GetMessageTrackingReportRequestType oGmT = new GetMessageTrackingReportRequestType();
                oGmT.RecipientFilter = new EmailAddressType();                

                for (int i = 0; i < retornoFind.MessageTrackingSearchResults.Length; i++)
                {
                    oGmT.MessageTrackingReportId = retornoFind.MessageTrackingSearchResults[i].MessageTrackingReportId;
                    GetMessageTrackingReportResponseMessageType retorno = binding.GetMessageTrackingReport(oGmT);
                    METCollection.Add(MessageTrackingEntityPopulate(retorno));
                }


                 return METCollection;

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return null;
            }
        }

        /// <summary>
        /// Trabalha o objeto retornado no Web Service e retorna ao usuário para uso
        /// </summary>
        /// <param name="retorno"></param>
        /// <returns></returns>
        private MessageTrackingEntity MessageTrackingEntityPopulate(GetMessageTrackingReportResponseMessageType retorno)
        {            
            MessageTrackingEntity MTE = new MessageTrackingEntity();
            
            //Hora do LOG
            MTE.Hora = retorno.MessageTrackingReport.SubmitTime;

            //FROM
            MTE.From = retorno.MessageTrackingReport.Sender.EmailAddress;

            //DeliveryStatus
            for (int i = 0; i <  retorno.MessageTrackingReport.RecipientTrackingEvents.Length; i++)
            {
                MessageTrackingDeliveryStatusType dStatus = retorno.MessageTrackingReport.RecipientTrackingEvents[i].DeliveryStatus;
                MTE.DeliveryStatus.Add(dStatus.ToString());
            }            
            
            //Emails dos Destinatários
            for (int i = 0; i < retorno.MessageTrackingReport.OriginalRecipients.Length; i++)
            {
                 MTE.Para.Add(retorno.MessageTrackingReport.OriginalRecipients[i].EmailAddress);
            }            

            return MTE;
        }
                
    }

}



No fundo, é legal. O código da POC evoluiu e está bem mais consistente. Mas o que eu mudei fui justamente pegar novos dados,como hora de envio e pra quem foi a mensagem, para mostrar no relatório.

Fica atento que alguns resultados de retorno do Web Service são array de String (como o campo RECIPIENTS, por exemplo)  Nesses casos, você tem que trata-los para mostrar um a um na tela.

Boa Sorte!

Referências:

http://msdn.microsoft.com/en-us/library/bb409286.aspx

http://msdn.microsoft.com/en-us/library/dd877025%28EXCHG.140%29.aspx

Sobre matchboxt
Owner MatchBox

One Response to Exchange 2010 e o Message Tracking

  1. Thiago Tietze disse:

    Só um detalhe…
    Message Tracking já existia antes da versão 2007 do Exchange!

    Um abraço!

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: