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. 

Usando Access

 

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

Usando Access

 

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:

Usando Access

 

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

Usando Access

 

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

Usando Access

 

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:

Usando Access

 

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.

Usando Access

 

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.

Usando Access

 

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.

Usando Access

 

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:

Usando Access

 

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:

Usando Access

 

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:

Usando Access

 

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.

Usando Access

 

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:

Usando Access

Espero que o exemplo ajude a você.

 


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,


Envie seu comentário: