A pouco tempo estive em um projeto bastante interessante no qual era necessário que a minha aplicação ficasse monitorando uma caixa de mensagem provinda de um Microsoft Exchange 2007, após o recebimento das mensagens elas seriam parametrizadas e reenviadas para outro destino, isto tudo de forma automática sem a necessidade de intervenção humana durante o processo. Foram analisados varais soluções, mas devido à natureza nada simples do projeto, foi escolhido que uma aplicação ficaria responsável por este monitoramento da caixa de mensagem.

Para começarmos,primeiramente precisamos preparar o ambiente, tanto o de desenvolvimento como o de produção. Para os ambientes as seguintes aplicações precisam estar instaladas:

  • Desenvolvimento
    • Windows XP,Vista,7,Server 2003 ou 2008
    • Microsoft Office Outlook 2003 ou 2007
    • Visual Studio 2005 ou 2008
    • Antivírus atualizado*

*o A instalação do antivírus não é obrigatória, mas para garantir que não é nenhum vírus que está passando a mensagem o Outlook não confia em nenhuma aplicação que tente acessar os seus recursos sem as devidas proteções dentro da maquina. Caso você opte por não instalar um antivírus, todas as vezes que a aplicação tentar consumir algum recurso do Outlook será mostrado uma tela pedindo a confirmação de que a aplicação pode realmente ser tratada como segura.

  1. Criando a projeto:
    Para iniciarmos, vamos criar um projeto de console application no Visual Studio 2008, para isto vamos apertar o (CTRL + SHIFT + N) -> Vamos escolher Console Application, dar o nome de AppOutlook –>OK

  2. Adicionando as referencias as bibliotecas de interoperabilidade

    Aqui vamos adicionar a referencia as bibliotecas de interop do Outlook, para isto vamos expandir o Solution Explorer, clicar com o botão direito em cima da pasta REFERENCES e clicar em Add Reference.
    Na tela que se abriu procurem por Microsoft.Office.Interop.Outlook, version 12.0.0.0, selecionem e cliquem em OK.

    Agora que já importamos a biblioteca para dentro do projeto, vamos referenciá-la na nossa classe, para isto vamos adicionar a palavra using seguida do namespace Microsoft.Office.Interop.Outlook;
  3. Leitura dos E-mails na caixa de entrada.

    static void CapturaEmails()

    {

    //Declarao do Application, representa toda a aplicaao do Outlook

    Application app = new Microsoft.Office.Interop.Outlook.Application();

    //Declarao do Namespace, que seria como se fosse a fonte de dados do outlook no tipo MAPI

    /*MAPI = Messaging Application Programming Interface, interface de programao da Microsoft

    Para softwares de correio*/

    NameSpace ns = app.GetNamespace("MAPI");

    try

    {

    //Declarao de um ForEach que ir capturar todos os itens que esto dentro da caixa de entrada

    foreach (MailItem _mail in ns.GetDefaultFolder(OlDefaultFolders.olFolderInbox).Items)

    {

    //Nossa aplicao s ir ler os e-mails no lidos, os lidos sero descartados

    if (_mail.UnRead)

    {

    //Imprime na tela algumas informaes do e-mail

    Console.WriteLine(string.Format("Email Novo: Assunto: {0}, Remetente: {1}, Corpo: {2}",

    _mail.Subject,_mail.SenderName,_mail.Body));

    //Muda o situao do e-mail para lido

    _mail.UnRead = false;

    }

    }

    //Apensar para podermos ler o que foi impresso na tela

    Console.ReadLine();

    }

    catch (System.Exception ex)

    {

    throw;

    }

    }

     
  4. Criando e Enviando um e-mail

    static void EnviaEmail(string _Destinatario, string _Assunto, string _Corpo)

    {

    //Declarao do Application, representa toda a aplicação do Outlook

    Application app = new Microsoft.Office.Interop.Outlook.Application();

    try

    {

    //Cria um item do tipo Email

    MailItem mail = (MailItem)app.CreateItem(OlItemType.olMailItem);

    //Define o destinatario

    mail.To = _Destinatario;

    //Define o Assunto do e-mail

    mail.Subject = _Assunto;

    //Define o Corpo da mensagem

    mail.Body = _Corpo;

    //Define que a mensagem dever ser enviada no formato html

    mail.BodyFormat = OlBodyFormat.olFormatHTML;

    /*Por Fim, envia a mensagem por dentro do Outlook

    * Vale o comentrio, mais fcil que usar a biblioteca

    * System.Net.Mail*/

    mail.Send();

    }

    catch (System.Exception ex)

    {

    throw;

    }

    }

  5. Deletando um E-mail

    /*Para deletar um e-mail, basta que aps ter achado Dentro do mtodo de busca,

    * voc chame o delete(); */

    mail.Delete();

     
  6. Criando uma Pasta

    static void CriaPasta(string _NomePasta)

    {

    //Declarao do Application, representa toda a aplicaao do Outlook

    Application app = new Microsoft.Office.Interop.Outlook.Application();

    NameSpace ns = app.GetNamespace("MAPI");

    try

    {

    //Instancia a caixa de entrada dos e-mails

    MAPIFolder inBox = ns.GetDefaultFolder(OlDefaultFolders.olFolderInbox);

    //Cria uma pasta dentro da caixa de entrada do tipo FolderInBox

    inBox.Folders.Add(_NomePasta, OlDefaultFolders.olFolderInbox);

    }

    catch (System.Exception ex)

    {

    throw;

    }

    }

     
  7. Movendo um e-mail para a nova pasta

    MAPIFolder destPasta = ns.GetDefaultFolder(OlDefaultFolders.olFolderInbox).Folders["Olavo"];

    _mail.Move(destPasta);

    Espero com este pequeno artigo ter demonstrado como é simples trabalhar com as bibliotecas de interop da Microsoft par o Microsoft Office Outlook. Muito simples e rápido de implementar, sem falar que você está lhe dando com uma aplicação robusta e extremamente testada e estressada pelos desenvolvedores da Microsoft.
    Quanto ao projeto, hoje ele está rodando de forma direta, recebendo, parametrizado e enviando mais de 2mil e-mails por dia.