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 Schultes



Os 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
Stan Schultes

Stan Schultes