Desenvolvimento - Visual Basic
Envie e-mails a partir do VB
Descubra quais são as alternativas para o envio de e-mail a partir de seu aplicativo VB, e também como gerenciar as listas de distribuição.
por Stan SchultesOs aplicativos que não lhe permitem enviar e-mail estão em clara desvantagem no mundo de hoje, conectado por e-mail. A maioria dos aplicativos comerciais lhe oferece a opção de enviar e-mail a partir de um item de menu ou de um botão da barra de ferramentas. O que você pode enviar varia de (acordo com o) aplicativo: o Microsoft Office lhe permite enviar uma página Web inteira ou somente um link, e o CorelDraw lhe permite enviar arquivos de desenho. Nesta coluna, mostrarei três maneiras diferentes para você enviar e-mail de seu aplicativo Visual Basic. Eu lhe ajudarei a escolher a tecnologia de e-mail que trabalhará melhor para você, e também mostrarei como gerenciar as listas de distribuição de e-mail de seu aplicativo.
Você pode querer enviar a produção para uma lista de distribuição, se seu aplicativo gerar relatórios. Se você distribuir o seu aplicativo para os usuários, deve querer que eles tenham a opção de avaliar os problemas ocorridos ou dar sugestões. Um aplicativo que executa desacompanhado pode enviar e-mail ao administrador, quando acontece um problema, e o aplicativo de manutenção pode lhe enviar arquivos de log de programas ou informações sumárias.
Você envia e-mails através do VB utilizando o Messaging Application Programming Interface (MAPI). O modelo MAPI descreve virtualmente tudo sobre criar e gerenciar mensagens de e-mail, pastas e serviços. O modelo completo MAPI só está disponível aos programadores de C++, mas a maioria das funcionalidades de e-mail no MAPI está disponível aos programadores de VB. O Active Messaging agora se tornou Collaborative Data Objects (CDO) e você também poderia achar útil outras alternativas de e-mail.
Eu demonstrarei três mecanismos de envio de e-mail MAPI nesta coluna: Os controles MAPI do VB, a biblioteca CDO e o modelo de objeto Microsoft Outlook. Cada um possui semelhanças e diferenças; a sua escolha é baseada em suas próprias preferências (descubra as diferenças em Fontes de Referência). Todos os três mecanismos lhe exigem conexão a um servidor de e-mail MAPI compatível como o Microsoft Exchange para enviar e-mail com o código de exemplo. Você também precisa ter um programa de cliente e-mail MAPI compatível instalado na máquina onde o seu aplicativo VB envia mensagens. Normalmente, os desenvolvedores utilizam os clientes Microsoft Outlook ou Exchange, mas qualquer programa de cliente e-mail MAPI compatível deve funcionar.
Faça o download do código de exemplo do . EmailTest O EmailTest lhe permite compor mensagens de e-mail, adicionar um arquivo anexado e enviar o e-mail para uma lista de endereços (veja Figura 1). Você implementa dois dos exemplos de e-mail, CEmailCDO e CEmailOL, como módulos de classe.
Figura 1: Teste Seus Mecanismos de Envio de E-Mail.
O exemplo do aplicativo EmailTest lhe permite criar e enviar mensagens de e-mail contendo um único anexo opcional. Os botões Get List Info e Save List Info obtêm e salvam as configurações no registro do Windows, organizado por listas de e-mail. As configurações por lista de e-mail incluem Send to (Enviar Para), Message Importance (Prioridade da Mensagem) e um sinalizador Enabled (Ativado).
O CEmailMAPI é nomeado e age como uma classe, mas você o implementa como um formulário e assim irá conter os controles MAPI (para mais detalhes, veja os comentários sobre o código de exemplo). Cada classe tem um método Send (Enviar) com cinco parâmetros. Os parâmetros são o nome de um EmailList que está armazenado no registro do Windows, um sinalizador Client Active, as strings Subject e Body, e um nome de arquivo opcional de Attachment (veja a Listagem 1).
O método CEmailCDO Send leva os parâmetros de entrada para os componentes principais de uma mensagem de e-mail. Você define as propriedades do Collaborative Data Objects (CDO): mensagem, destinatário e anexo dos parâmetros de entrada e das configurações armazenadas no Registro do Windows. Você começa acrescentando uma mensagem à coleção de mensagens da Caixa de Saída (Outbox) do MAPI. Adiciona os destinatários e um anexo opcional às coleções de Destinatários e Anexos da mensagem e utiliza o método Send (Enviar) para enviar o e-mail.
Listagem 1: Método Send
"Variáveis membro Private m_oSession As Session Private m_oMessage As Message Private m_oRecipient As Recipient Private m_oAttachment As Attachment Public Function Send (ByVal ListName As String, _ ByVal ClientActive As Boolean, _ ByVal Subject As String, _ ByVal Body As String, _ Optional ByVal Attachment As String) As Long Dim sAddresses() As String Dim lRecip As Long Dim sName As String, sPath As String Dim bShow As Boolean On Error Resume Next If m_oSession Is Nothing Then Exit Function If Len(ListName) = 0 Then Exit Function "Ative o sinalizador de lista de email goReg.EmailList = ListName If Not goReg.Enabled Then Exit Function bShow = True "o cliente de e-mail não executa If ClientActive Then bShow = False m_oSession.Logon ShowDialog:=bShow, _ NewSession:=False "crie a mensagem Set m_oMessage = _ m_oSession.Outbox.Messages.Add With m_oMessage .Subject = Subject .Text = Body .Importance = GetImportance _ (goReg.Importance) End With "os endereços são delimitados por ponto e vírgula sAddresses = _ Split(goReg.SendTo, ";") For lRecip = 0 _ To UBound(sAddresses, 1) With m_oMessage.Recipients.Add .Name = sAddresses(lRecip) .Type = CdoTo .Resolve End With Next "um Anexo nesse exemplo If CheckAttachment _ (Attachment, sPath, sName) Then With m_oMessage.Attachments.Add .Position = 1 .Type = CdoFileData .Source = sPath .Name = sName .ReadFromFile sPath End With End If m_oMessage.Send "retorne 0=sucesso Send = Err End Function
Ache os Controles de E-mail e Bibliotecas
A partir do VB3, as versões vêm com um par de controles MAPI: MAPISession e MAPIMessages. Das três alternativas, os controles MAPI são os mais fáceis de se usar, mas também são os menos eficientes. Por exemplo, você pode ter acesso somente a Caixa de Entrada e não ter acesso ao Calendário ou outras pastas, e também não pode definir a prioridade da mensagem (alta, normal ou baixa). Algumas das vantagens dos controles MAPI são que tudo o que você precisa para enviar e-mail vem na caixa com o VB e os controles são pequenos em tamanho. Não há necessidade de instalar uma biblioteca extra como no CDO, ou instalar e configurar o Outlook. Os controles MAPI são mais fáceis de usar nos aplicativos de e-mail simples.
Para carregar os controles MAPI, você precisa clicar com o botão direito na caixa de ferramentas e escolher Componentes a partir do menu popup. Role a lista para baixo e clique na caixa de seleção Controles Microsoft MAPI, depois clique no botão OK (os controles MAPI estão no arquivo MSMAPI32.ocx no diretório Windows\system). Arraste os controles MAPISession e MAPIMessages para um formulário. Clique com o botão direito no controle MAPISession e escolha Propriedades no menu popup. Desmarque a caixa de seleção DownloadMail e LogonUI. Você definiu a propriedade LogonUI no código baseado no sinalizador Client Active.
A biblioteca CDO começou como OLE Messaging, depois foi chamado de Active Messaging antes de ser nomeado CDO. A biblioteca CDO é uma completa interface de script para o modelo MAPI. Permite criar componentes ActiveX em VB utilizando CDO,que pode ser chamado a partir do Active Server Pages (ASP) para os seus aplicativos Web. A Microsoft também possui uma biblioteca separada CDONTS que você pode usar para enviar e-mail de servidores Web, utilizando o Simple Mail Transport Protocol (SMTP) em vez de MAPI. A desvantagem principal do CDO, quando comparado aos controles MAPI, é que os arquivos da biblioteca CDO são aproximadamente cinco vezes maiores, o que é significante se você estiver tentando minimizar o tamanho do kit de configuração. O CDO suporta a maioria dos recursos de programação de e-mail MAPI, mas é mais complexo de se usar do que os controles MAPI.
Para usar a biblioteca CDO do VB, você precisa acrescentar uma referência ao projeto (Menu Projeto | Referências). Role a lista para baixo e clique na caixa de seleção Biblioteca Microsoft CDO 1.21. Implemente a biblioteca utilizando CDO.dll, procure no diretório c:\program files\common files\system\mapi\. Com o CDO, você declara e manipula objetos de tipos MAPI.Session, .Messaging, .Recipient e .Attachment para controlar o processo de e-mail. Veja o código de exemplo do arquivo ReadMe.txt, para mais informações ou se você tiver qualquer problema intermitente com o CDO.
O modelo de objeto Outlook utiliza o próprio Outlook para oferecer serviços de e-mail ao seu aplicativo. O Outlook 2000 pode fazer qualquer coisa virtualmente; o seu programa VB também, inclusive o acesso para qualquer uma de suas pastas particulares (E-mail, Calendário, Contatos ou Notas) e pastas públicas no Exchange Server. O Outlook 97, 98 e 2000 funcionam para enviar e-mail, mas o Outlook 2000 adiciona uma significante funcionalidade para você, como programador (para mais informações, consulte O Que Há de Novo, no Outlook 2000). A desvantagem de se usar o modelo de objeto Outlook é que você deve possuir uma licença do Microsoft Office em qualquer máquina que você utilizar para enviar e-mail (você também pode licenciar o Outlook separadamente do Office).
Acrescente uma referência ao projeto que utiliza o modelo de objeto Outlook do VB (Menu Projeto | Referências). Role a lista para baixo e marque a caixa de seleção da Biblioteca de Objeto Microsoft Outlook 9.0 (para o Outlook 2000) ou a Biblioteca de Objeto 8.0 (para o Outlook 98). Você declara e manipula objetos de tipos Outlook.Application e Outlook.MailItem para controlar o processo de e-mail. Encontre a biblioteca de objeto no arquivo c:\program files\microsoft office\office\msoutl9.olb.
Gerencie as Configurações da Lista de E-Mail
Talvez você queira definir várias listas de e-mail para propósitos diferentes, especialmente num aplicativo que envia e-mail. Por exemplo, num aplicativo que gera relatórios, os relatórios diferentes poderiam entrar para as listas diferentes de usuários. Salvar as configurações no Registro lhe dá a flexibilidade para operar o seu programa sem ter de mudar o código. Foi pensando nisso que a estrutura de Registro de e-mail foi criada e a classe CEmailReg trata essa interface para você. Dado o nome do programa e um nome de lista de e-mail, você armazena as chaves para a lista SendTo (uma lista de endereços de e-mail delimitada por ponto e vírgula), a prioridade da mensagem e um sinalizador Enabled (Ativo) para aquela lista (download da Listagem A).
Salve as configurações da lista de e-mail sob a chave de Registro padrão do VB \HKEY_CURRENT_USER\Software\VB e VBA Program Settings. Você pode armazenar as configurações para qualquer quantidade de nomes de programa, cada um tendo uma quantidade de entradas na lista de e-mail, usando as funções GetSetting e SaveSetting do VB, dentro de CEmailReg. Por exemplo, você pode manter as configurações das listas de e-mail nomeadas como DistList, Support e DailyReports sob o nome-chave do programa EmailTest.
O aplicativo EmailTest demonstra como ler e escrever as chaves de Registro em código, para que você não tenha de executar o editor de Registro para mudar as configurações manualmente (download da Listagem B). Na primeira vez que você executar o EmailTest, o aplicativo cria um nome padrão de lista de e-mail chamado DistList. Preencha seu próprio endereço de e-mail e clique no botão Salvar Lista Info como teste.
Comece seu cliente de e-mail e efetue log on, antes de executar o aplicativo EmailTest. Você não precisa começar seu cliente de e-mail primeiro, mas a mensagem inicial que você envia passa muito mais depressa, porque o logon de MAPI leva um tempo dependendo da velocidade de conexão com o seu servidor de e-mail. Efetuar o log on com antecedência, coloca o tempo de logon inicial de MAPI fora do tempo de inicialização de seu aplicativo. Ao enviar um e-mail, as mensagens subseqüentes são enviadas rapidamente desde que você não destrua seus objetos de correio no meio da utilização (consulte a Tabela 1).
Tabela 1: Compare Três Demonstrações de Velocidade de E-mail. Estes testes de velocidade lhe dão uma idéia geral de como os três mecanismos de e-mail se comparam. Eles foram executados em uma máquina Pentium II 400 MHz, conectada ao servidor de e-mail pela Internet, em conexão de 256 Kbps. Seus tempos podem variar. Todos os três métodos são semelhantes no tempo de inicialização, se o seu cliente de e-mail não está executando e todos os três são semelhantes após a primeira mensagem. O método Outlook possui um tempo de inicialização curta, se o cliente Outlook estiver executando, significa que o logon do Outlook foi feito.
Controles MAPI | Biblioteca CDO | Modelo de Objeto Outlook | ||||
Estado Cliente | Não executando | Executando | Não executando | Executando | Não executando | Executando |
Primeiro e-mail | 80-85 seg | 30-35 seg | 70-75 seg | 25-30 seg | 70-75 seg | 1-2 seg |
Segundo e-mail | 1-2 seg | 1-2 seg | 1-2 seg | 1-2 seg | 1-2 seg | 1-2 seg |
Você pode facilmente usar o código EmailTest em seus próprios aplicativos. Escolha um dos três módulos de classe de envio de e-mail: controles MAPI, CDO ou o modelo de objeto Outlook. Inclua a classe CEmailReg na interface de Registro e o módulo EmailTestBas nas definições variáveis de objeto e funções com vários objetivos. Para enviar e-mail através de um item de menu ou de um processo automatizado, crie um formulário que inclua a informação a ser enviada, junto com uma maneira de salvar suas configurações. Para um aplicativo desacompanhado, inicie o cliente de e-mail em tempo de inicialização para evitar a exibição de um diálogo de logon MAPI, quando seu aplicativo primeiro enviar o e-mail.
Você pode enviar e-mails a partir de seu aplicativo Web de várias maneiras. Cada um compartilha semelhanças com os outros e a melhor escolha depende com qual deles você se sente mais confortável. Use o exemplo do aplicativo EmailTest para explorar as possibilidades e examinar os detalhes. Eu estaria interessado em ouvir sobre qualquer aplicativo que você apresente, após experimentar o de exemplo. Envie-me um e-mail através de seu aplicativo.
Sobre o autor
Stan Schultes é gerente de IT, de projetos, arquiteto e desenvolvedor de aplicativos VB/Web em Sarasota, Flórida. Ele é um MCP em VB e deu palestra sobre desenvolvimento VB na conferência DevDays da Microsoft.
Download do código referente a este artigo
Clique aqui para fazer o download- Sou programador, o mágico atende na sala ao ladoPHP
- System Tray - O seu ícone ao lado do relógio do WindowsVisual Basic
- Criando Aplicações Limitadas a Uma Única Instância (Single Instance)C#
- Criando um pacote de instalação com o INNO SETUPVisual Basic
- Nota Fiscal Eletrônica: Construindo um "Servidor de Assinatura Digital" com o NFeExpr...Visual Basic