Access 2007 X Outlook 2007
Novos recursos do Outlook 2007 e do Access 2007 permitiram uma melhoria significativa na automação entre as duas ferramentas. Vamos usar o Access para ganhar acesso aos métodos do Outlook 2007 para realizar o envio de mensagens de forma programática.
Foi montado um arquivo exemplo, que você poderá baixar e verificar na prática o que iremos explicar aqui.
Ao final desta dica você terá visto os seguintes recursos:
1) Como referenciar o Outlook 2007 no Access 2007.
2) Como desabilitar o aviso de segurança do Outlook, quando se envia
email pelo Access.
3) Uso do Richt text para formatação da mensagem no corpo do email.
4) Como adicionar um ou mais anexos.
5) Envio de propaganda em Html, no corpo do email.
6) Envio de relatórios, em diversos formatos, com destaque para o
envio em PDF.
Para ganharmos o acesso aos métodos do Outlook precisamos referenciá-lo no Access. Vamos ver então como fazer isso:
Abra qualquer módulo do Visual Basic, do banco de dados, e selecione FERRAMENTAS > REFERÊNCIAS.

Procure e marque o item MICROSOFT OUTLOOK 12.0 OBJECT LIBRARY, conforme figura abaixo.

Com isso, o Visual basic, terá à disposição todos as classes do Outlook. Usaremos algumas delas no exemplo.
Antes de prosseguirmos com a programação, faremos uma modificação na configuração do Outlook 2007, que nos permitirá enviar mensagens pelo Access, sem que o aviso de segurança do Outlook seja ativado. Veja como é o aviso:

Abra o Outlook e no menu FERRAMENTAS selecione CENTRAL DE CONFIABILIDADE.

Clique em ACESSO DE PROGRAMAÇÃO e selecione uma das opções marcadas abaixo:

Agora com o Access e com o Outlook devidamente configurados, podemos por em prática, nosso projeto.
Veja abaixo o formulário exemplo, feito no Access 2007, para o envio de mensagens e arquivos:

Observe que iremos manipular os principais itens de um email, como se estivéssemos no Outlook.
Carregando, através do uso de variáveis, algumas das classes do Outlook, teremos à nossa disposição, propriedades e métodos, que nos permitirá o envio de mensagens e arquivos.
Veja um trecho do código, que se encontra no evento Ao clicar do botão enviar e preste bastante atenção nos comentários.
Private Sub btEnviar_Click()
'----------------------------------------------
'Criando as variáveis que irão assumir as
'propriedades e métodos das classes do outlook
'---------------------------------------------- Dim objOut As Outlook.Application Dim objMail As Outlook.MailItem '---------------------------------------------
'Carregando a coleção do Outlook
'Similar ao abrir o Outlook
'--------------------------------------------- Set objOut = New Outlook.Application
'------------------------------------------------------------
'Abrindo o formulário de email para inserir os itens de email
'Similar ao clicar no botão NOVO do Outlook
'------------------------------------------------------------ Set objMail = objOut.CreateItem(olMailItem)
'-----------------------------------------------------------------------
'Passando os valores do formulário exemplo para os itens de email
'----------------------------------------------------------------------- objMail.To = Me!txPara 'destinatário objMail.CC = Nz(Me!txCc, "") 'com cópia objMail.BCC = Nz(Me!TxCco, "") 'Com cópia oculta ...
'--------------------------------------------
'Usando o método enviar, da classe de itens
'--------------------------------------------
objMail.send
End Sub
Agora que você aprendeu como é fácil enviar um email de forma programática, pelo Access 2007, vamos explicar como manipular alguns desses itens (propriedades) que serão de vital importância na automação de projetos.
O item corpo do email (BODY) pode ser modificado, de modo que possamos redigir texto, com formatação aprimorada. Temos então três possibilidades de configuração : Texto puro, Rich Text ou HTML.
O Formato Rich Text também foi inserido nos campos memorando do Access 2007. Aproveitamos então esta novidade para dar uma qualidade de formatação nas mensagens enviadas.
Observe na figura abaixo o campo mensagem, configurado para a formatação Rich Text.

A formatação do campo memorando por ser modificada através da propriedade TextFormat , 0 (zero) configura o campo memorando sem formatação e 1 configura o campo com a formatação Rich Text
me!txmensagem.TextFormat = 1 'configurado com a formatação Rich text
O item que permite escolher a conta que enviará a mensagem (SendUsingAccount) e a nova classe contas (Accounts), inseridas no Outlook 2007, são novidades bem-vindas. Vamos demonstrar aqui como carregar as contas existentes, criadas no Outlook, numa caixa de combinação.
Observe na figura baixo, a caixa de combinação, com os nomes das contas do Outlook.

Veja o código abaixo de como foi carregada a caixa de combinação
Private Function fncCarregaContas()
Dim objOut As Outlook.Application Dim objConta As Outlook.Account
On Error Resume Next
'------------------------
'Carrega o Outlook
'------------------------
Set objOut = New Outlook.Application
'-------------------------------
'Limpa lista caixa de combinação
'-------------------------------
Me!txContas.RowSource = ""
'-----------------------------------------------
'Captura todas as contas criadas no Outlook
'e adiciona na caixa de combinação
'-----------------------------------------------
For Each objConta In objOut.Session.Accounts
If objConta.AccountType = olPop3 Then
Me!txContas.AddItem objConta
End If
Next
'----------------------------------------------
'carrega o primeiro nome da conta como
'valor padrão
'----------------------------------------------
Me!txContas.DefaultValue = "'" & Me!txContas.Column(0, 0) & "'"
'-----------------------------------
'Limpa os objetos da memória
'-----------------------------------
Set objConta = Nothing
Set objOut = Nothing
End Function
Em função da escolha da conta, pela nossa caixa de combinação, podemos então indicar ao Outlook a conta que enviará a mensagem.
Veja, em vermelho, as linhas acrescentadas no código do botão Enviar:
Private Sub btEnviar_Click()
'----------------------------------------------
'Criando as variáveis que irão assumir as
'propriedades e métodos das classes do outlook
'---------------------------------------------- Dim objOut As Outlook.Application Dim objMail As Outlook.MailItem
Dim objContas As Outlook.Accounts '---------------------------------------------
'Carregando a coleção do Outlook
'Similar ao abrir o Outlook
'--------------------------------------------- Set objOut = New Outlook.Application
'------------------------------------------------------------
'Abrindo o formulário de email para inserir os itens de email
'Similar ao clicar no botão NOVO do Outlook
'------------------------------------------------------------ Set objMail = objOut.CreateItem(olMailItem)
'-----------------------------------------------------------------------
'Passando os valores do formulário exemplo para os itens de email
'----------------------------------------------------------------------- objMail.To = Me!txPara 'destinatário objMail.CC = Nz(Me!txCc, "") 'com cópia objMail.BCC = Nz(Me!TxCco, "") 'Com cópia oculta ...
'-----------------------------------------
'Seleciona a conta que enviará a mensagem
'-----------------------------------------
.SendUsingAccount = objOut.Session.Accounts(Me!txContas.Value)
'--------------------------------------------
'Usando o método enviar, da classe de itens
'--------------------------------------------
objMail.send
End Sub
Adicionar anexos a mensagem, sem dúvida é um dos itens mais importantes de se aprender. Para isso iremos utilizar a classe anexos (Attachments), que contém o método Adicionar Anexo (Add). Basta então indicarmos o caminho do arquivo que o método adicionará o arquivo à mensagem.
Primeiro capturamos o arquivo e guardamos o seu caminho completo e o seu nome numa caixa de listagem, conforme exemplo na figura abaixo.

Com a lista dos arquivos anexos salva no campo Anexos, fica bem fácil adicioná-los ao email.
Veja as linhas, em vermelho, adicionadas no código do botão enviar.
Private Sub btEnviar_Click()
'----------------------------------------------
'Criando as variáveis que irão assumir as
'propriedades e métodos das classes do outlook
'---------------------------------------------- Dim objOut As Outlook.Application Dim objMail As Outlook.MailItem
Dim objContas As Outlook.Accounts
Dim objAnexo As Outlook.Attachments '---------------------------------------------
'Carregando a coleção do Outlook
'Similar ao abrir o Outlook
'--------------------------------------------- Set objOut = New Outlook.Application
'------------------------------------------------------------
'Abrindo o formulário de email para inserir os itens de email
'Similar ao clicar no botão NOVO do Outlook
'------------------------------------------------------------ Set objMail = objOut.CreateItem(olMailItem)
'-----------------------------------------------------------------------
'Passando os valores do formulário exemplo para os itens de email
'----------------------------------------------------------------------- objMail.To = Me!txPara 'destinatário objMail.CC = Nz(Me!txCc, "") 'com cópia objMail.BCC = Nz(Me!TxCco, "") 'Com cópia oculta ...
'--------------------------------- 'Adicionando os anexos '--------------------------------- For j = 1 To Me!txAnexo.ListCount objAnexo.Add Me!txAnexo.Column(0, j - 1),olByValue,1,Me!txAnexo.Column(1,j-1) Next
.SendUsingAccount = objOut.Session.Accounts(Me!txContas.Value)
'--------------------------------------------
'Usando o método enviar, da classe de itens
'--------------------------------------------
objMail.send
End Sub
Vejamos agora como inserir propagandas ou comunicados, elaborados em HTML. A vantagem do uso de Html são inúmeras , principalmente se o que você deseja apresentar ao seu cliente, estiver em jogo a qualidade visual.
Uma observação - o uso de imagens, geralmente é travado no momento da exibição da mensagem, atrapalhando o objetivo da propaganda ou comunicado. O pessoal então apela para uso de Estilo que também deixa o visual da mensagem bastante chamativo.
Observe na figura abaixo, a opção propaganda selecionada:

O segredinho aqui é usarmos uma função que leia o arquivo html para tê-lo inserido no corpo da mensagem. Veja a função que faz a leitura do arquivo:
Public Function fncLerArquivo(ByVal LocalArquivo As String) As String
Dim objfso As Object Dim objts As Object
On Error Resume Next
Set objfso = CreateObject("Scripting.FileSystemObject")
Set objts = objfso.GetFile(LocalArquivo).OpenAsTextStream(1, -2)
fncLerArquivo = objts.readall
objts.Close Set objfso = Nothing
End Function
Utilizamos então, a função acima para carregar o arquivo no corpo do email.
...
.BodyFormat = olFormatHTML .HTMLBody = fncLerArquivo(fncLocalBD & "\propagandas\" & Me!Lista.Column(1)) ...
Veja a propaganda na mensagem do Outlook:

Enviar relatórios do Access por email é a automação que mais uso para os meus clientes. O envio de orçamentos, propostas e pedidos de compra encabeçam a lista. O maior desafio é gerar um arquivo do relatório, que seja possível ao cliente fazer a leitura do mesmo, sem a necessidade de se ter Access, além, é claro, de não se perder a formatação original do relatório. O formato PDF é o preferido para isso.
Finalmente, após a atualização do Access 2007, com o pacote SP2, temos à nossa disposição a exportação de relatórios, usando o formato PDF, sem o uso de qualquer suplemento.
Veja no figura abaixo as opções de formato que você pode escolher para o envio de seus relatórios:

O mecanismo usado aqui é o seguinte:
é gerado um arquivo do relatório com a formatação escolhida e é armazenado em uma pasta, usando o comando OutPutTo;
gravamos o caminho e o nome do arquivo gerado na lista de anexos.
...
'-------------------------------------------
'Indicamos o caminho e o nome do arquivo
'a ser gerado
'-------------------------------------------
strCaminho = fncLocalBD & "\enviados\" & Me!Lista & ".pdf"
'------------------------------------------------------
'Gerando o arquivo no formato PDF no caminho indicado
'------------------------------------------------------ DoCmd.OutputTo acOutputReport, Me!Lista.Column(1), acFormatPDF, strCaminho, 0
'---------------------------------------------------
'Grava caminho e nome do arquivo na lista de anexos
'--------------------------------------------------- Me!txAnexo.AddItem strCaminho & ";" & Me!Lista, 0
...
Veja a mensagem lida no Outlook com o anexo do relatório em PDF. Outra novidade no Outlook 2007 é que ele permite visualizar o anexo.

No caso do arquivo, no formato HTML , optamos por enviar o relatório no corpo do email e não como um anexo, utilizando a função fncLerArquivo já descrita .
Observe na figura abaixo o relatório em html, inserido no corpo da mensagem, lida no Outlook:

Espero que o exemplo ajude a você.
Os dez artigos mais visitados
MontaRibbons v3.1 - Assistente completo para criar ribbons no Access
Utilizando Classe no Access - Introdução
Vídeo - Controle personalizado de Acesso de Usuários
Vídeo - Criando Ribbons parte 1 - Conhecendo a estrutura Xml
Vídeo - Segurança máxima, usando o OPEN
DVD - Coletânea de artigos, vídeos e exemplos do site
Vídeo - Manutenção e Sistema de Backup com Barra de Progresso
Vinculando tabelas com barra de progresso ( front-end x back-end )
Vídeo - Criando Ribbons parte 4 - Imagens externas em pasta local
Gerar relatórios em pdf e enviar por email
|
10 comentário(s) Maurício dos Santos 25/7/2009 09:33:41 Avelino, Parabéns!!!!! Parabéns mesmo!!!!! Um dos mais procurados temas de discussão em access explicado de forma simples e direta. Tutorial excelente com uma didática excelente e de uma simplicidade excelente. Mais uma vez, parabéns!!! Maurício dos Santos. Avelino Sampaio 27/7/2009 18:01:10 Maurício, Muito obrigado pelo seu apoio. Sucesso Alexandre 23/9/2009 00:40:00 muito bom! Leonardo Fantin 3/10/2009 17:20:34 Caro amigo, este é um exemplo muito bom! Vc tem algum exemplo para o 97? estou tentando criar um comando que anexe o relatório e gere um emial automático com alguns destinatários, só que o sistema operacional de msg não é o Outlook. Por exemplo, o access tem a opção em personalizar >> barra de ferramentas onde tem um botão para enviar o relatório que está na tela em forma de anexo. É isso que necessito, mas com alguns destinatários já listados no email. Obrigado, Leonardo n13543@cst.com.br Estevam 11/1/2010 13:28:37 Muito interessante. Obrigado pela dica. Dentro deste assunto tenho uma dificuldade. Fiz uma macro "enviar Objeto". Uso o Outlook 2007 Preenchi tudo direitinho. Ao rodar a macro vem uma mensagem: O Microsoft Office Access não pode enviar este email. Configure o computador parqa enviar e receber email. Acontece que está configurado. Uso o Outlook ormalmente. Não sei como resolver Avelino Sampaio 12/1/2010 08:04:08 Olá Estevam 1) Qual objeto está enviando ? relatório ? É pra eu simular um teste parecido com o seu 2) Mantenha o Outlook aberto e minimizado 3) Use o argumento "Editar mensagem" para sim - isso é pra ver se ele vai abrir a formulário de envio do Outlook 4) No Outlook, vá em: ferramentas > central de confiabilidade e verifique se não há nada configurado que possa esta interferindo no envio 5) Agora um chute - seu antivírus pode estar interferindo 6) Sua conta no Outlook é de que provedor ? Hotmail ? Fiz testes aqui com este comando e funcionou. Aguardo mais informações. Utilize o link "contato" e me passe o seu email Sucesso Avelino sampaio Estevam 12/1/2010 17:47:04 Olá Avelino Grato pelo seu interesse em ajudar. Veja só: Sobre: "Qual objeto está enviando ? relatório ?" - Isso é um relatório Sobre:"Use o argumento "Editar mensagem" para sim" - está assim mesmo. Sobre:"Sua conta no Outlook é de que provedor ? Hotmail ?" - O provedor é o OUL Sobre: "No Outlook, vá em: ferramentas > central de confiabilidade..." - já analisei tudinho e não encontro nada que possa está impedindo. O mais interessante aconteceu hoje: Abri uma nova conta no OutLook e NÃO defini com coanta padrão. Veja que ele abriu para enviar com a conta anterior do OUL. Rodei a macro - deu certo - abriu a tela do OutLook normalmente. Porém........ foi uma única vez. Depois não vai mais. Nem definindo esta conta como padrão. É um mistério Avelino - um mistério. Acho que é alguma configuração da minha máquina, do meu OutLook ou de eu e-mail no uol. Vamos continuar tentado. Grato Estevam Avelino Sampaio 12/1/2010 18:48:31 Estevam, você atualizou o seu Office com o pacote SP2 ? GILBERTO 15/7/2010 18:55:02 MUITO BOM, ME ATENDEU COMPLETAMENTE Denis 23/7/2010 10:10:32 Avelino, Muito obrigado pelo exemplo ! Tenho uma única questão. Não consegui fazê-lo funcionar com o outlook fechado. Há alguma maneira de reverter isto ? Grato, |