locked
Macro para ler o conteudo de um email recebido no Outlook e salva em um banco Access. RRS feed

  • Pergunta

  • Bom dia Pessoal,

    Tenho um sistema de chamados(Helpdesk) aqui na minha empresa em asp com banco Access, gostaria de criar um aplicativo ou macro, que pegue os e-mails recebidos no outlook e automáticamente salve o corpo do email no banco de dados Access do meu sistema.

    Exemplo:

    No assunto dos Emails trocados sobre um determinado chamado teria sempre o numero do chamado, assim toda vez que for enviado ou recebido um email como um numero de chamado a macro ou aplicativo faria um insert com essas informações no banco access.

    Será que isso é viável?

    Obrigado.

    • Editado Gilson.Bueno sexta-feira, 24 de agosto de 2012 16:06 Alteração para Facilitar a compreensão
    sexta-feira, 24 de agosto de 2012 11:14

Respostas

  • É possível criar uma rotina em VBA para atender sua necessidade. Crie um módulo no VBE do Outlook (Alt+F11) e adapte o código abaixo:

    Sub GerarLista()
    
        Dim olNS As Outlook.NameSpace
        Dim olFolder As Outlook.Folder
        
        Set olNS = Application.GetNamespace("MAPI")
        'Troque a constante abaixo se desejar que se faça varredura em outra pasta.
        Set olFolder = olNS.GetDefaultFolder(olFolderInbox)
        
        'Limpa Planilha
        DescePasta olFolder
        
        Set olFolder = Nothing
        Set olNS = Nothing
        
    End Sub
    
    Sub DescePasta(olFolder As Outlook.Folder)
        
        Dim olSubFolder As Outlook.Folder
        'Agora será necessário declarar um objeto do tipo arquivo
        'para realizar um loop de leitura de arquivos numa pasta
        Dim olItem As MailItem
        
        For Each olItem In olFolder.Items
            'Você pode visualizar uma série de propriedades de um objeto MailItem. Exemplos:
            Debug.Print olItem.Subject 'Assunto do e-mail
            Debug.Print olItem.SenderEmailAddress 'E-mail do remetente
            Debug.Print olItem.To 'E-mail do destinatário
            Debug.Print olItem.ReceivedTime 'Data/Hora de recebimento
            Debug.Print olItem.Attachments.Count 'Número de anexos
            Debug.Print olItem.Size 'Tamanho da mensagem em bytes
            Debug.Print olItem.Body 'Corpo do documento
            
            '***A rotina para adicionar o corpo do email à sua base de dados ficaria aqui***
        Next olItem
        
        For Each olSubFolder In olFolder.Folders
            DescePasta olSubFolder
        Next olSubFolder
        
    End Sub

    Como não sei como você adiciona os dados à sua base de dados, reservei o espaço no código para você completar.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta Gilson.Bueno segunda-feira, 27 de agosto de 2012 13:10
    sábado, 25 de agosto de 2012 12:24
    Moderador

Todas as Respostas

  • É possível criar uma rotina em VBA para atender sua necessidade. Crie um módulo no VBE do Outlook (Alt+F11) e adapte o código abaixo:

    Sub GerarLista()
    
        Dim olNS As Outlook.NameSpace
        Dim olFolder As Outlook.Folder
        
        Set olNS = Application.GetNamespace("MAPI")
        'Troque a constante abaixo se desejar que se faça varredura em outra pasta.
        Set olFolder = olNS.GetDefaultFolder(olFolderInbox)
        
        'Limpa Planilha
        DescePasta olFolder
        
        Set olFolder = Nothing
        Set olNS = Nothing
        
    End Sub
    
    Sub DescePasta(olFolder As Outlook.Folder)
        
        Dim olSubFolder As Outlook.Folder
        'Agora será necessário declarar um objeto do tipo arquivo
        'para realizar um loop de leitura de arquivos numa pasta
        Dim olItem As MailItem
        
        For Each olItem In olFolder.Items
            'Você pode visualizar uma série de propriedades de um objeto MailItem. Exemplos:
            Debug.Print olItem.Subject 'Assunto do e-mail
            Debug.Print olItem.SenderEmailAddress 'E-mail do remetente
            Debug.Print olItem.To 'E-mail do destinatário
            Debug.Print olItem.ReceivedTime 'Data/Hora de recebimento
            Debug.Print olItem.Attachments.Count 'Número de anexos
            Debug.Print olItem.Size 'Tamanho da mensagem em bytes
            Debug.Print olItem.Body 'Corpo do documento
            
            '***A rotina para adicionar o corpo do email à sua base de dados ficaria aqui***
        Next olItem
        
        For Each olSubFolder In olFolder.Folders
            DescePasta olSubFolder
        Next olSubFolder
        
    End Sub

    Como não sei como você adiciona os dados à sua base de dados, reservei o espaço no código para você completar.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta Gilson.Bueno segunda-feira, 27 de agosto de 2012 13:10
    sábado, 25 de agosto de 2012 12:24
    Moderador
  • obrigado pela resposta Benzadeus, está ajudando bastante.

    Bom fiz um teste, na verdade acho que pode ser até mais simples.

    acho que posso criar uma macro que será executada toda vez que um email for baixado.

    segue um exemplo, vê o que você acha.

    Sub GerarLista()
    
        Dim olNS As Outlook.NameSpace
        Dim olFolder As Outlook.Folder
        
        Set olNS = Application.GetNamespace("MAPI")
        'Troque a constante abaixo se desejar que se faça varredura em outra pasta.
        Set olFolder = olNS.GetDefaultFolder(olFolderInbox)
      
        'pega o 1 email da caixa de entrada
         Set myItem = olFolder.Items(1)
    
    'verifica se existe no assunto um chamado, a ideia aqui é pegar o numero que fica entre as ##, mais não sei como fazer
     
        If myItem.Subject Like "*#numero_chamado#*" Then
    
       'Código para inserir os dados do email no banco access
        End If
    
    
       Set olFolder = Nothing
       Set olNS = Nothing
        
    End Sub

    Problemas que eu encontrei:

    1) quando tento criar uma regra no outlook utilizando a aopção executar um Scritp a caixa de seleção do script no wizard de criação das regras fica vazio, tentei alterar a segurança das macros mais mesmo assim não aparece.

    2) pegar o numero do chamado no assunto entre as ## tags.

    3) não consegui fazer a conexão com o meu banco access, o banco fica em outro servidor no caminho \\webserver\db\banco.mdb.

    segunda-feira, 27 de agosto de 2012 13:28
  • 1 - Você quer criar um código que faça uma ação em massa nos seus e-mails já existentes ou quer criar uma regra de Outlook que faça essa inserção em seu banco de dados a cada e-mail que chega? A minha resposta anterior trabalha na primeira premissa. Se deseja fazer isso através de regras, verifique http://www.ambienteoffice.com.br/outlook/executar_macro_ao_receber_e-mail/

    2 - Vi que você fez o uso correto do operador Like no código. Dê o exemplo de um assunto de e-mail de número de chamado real para eu propor uma solução. Provavelmente você fará uso das funções Instr e Mid.

    3 - Segue um exemplo para fazer uma conexão ADO a um banco de dados Access através do Outlook. Para que o código funcione, você deve adicionar uma referência à biblioteca Microsoft ActiveX Data Objects 2.0 ou superior (no VBE, menu Ferramentas >> Referências:

    Private Sub ADO_ACCDB()
        
        Dim cn As ADODB.Connection
        
        Dim strDB As String
        Dim strSQL As String
        
        Set cn = New ADODB.Connection
        Set rs = New ADODB.Recordset
        
        strDB = "\\webserver\db\banco.mdb."
        cn.ConnectionString = _
              "Provider=Microsoft.ACE.OLEDB.12.0;" & _
              "Data Source=" & strDB & ";"
        cn.Open
        
        strSQL = _
          "INSERT ..."
        
        cn.Execute strSQL
        cn.Close
    End Sub


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    segunda-feira, 27 de agosto de 2012 21:54
    Moderador
  • Boa Noite Felipe, obrigado mais uma vez pela força.

    Bom preciso que a regra seja aplicada toda vez que chegar um email novo, já tinha visto o seu post abaixo, e é perfeito para o que eu quero, porém quando tento criar a regra a caixa de seleção do Script fica vazia e não tenho como concluir o wizard como no seu exemplo, sabe o que pode ser ?

    http://www.ambienteoffice.com.br/outlook/executar_macro_ao_receber_e-mail/

    A conexão com o banco de dados ficou perfeita, muito obrigado.

    Estou tentando trabalhar em cima do Instr e Mid para pegar o numero do chamado no assunto.

    O email que devo receber deve ser mais ou menos assim.

    De: cliente@dominio.com.br

    Para:suporte@meudominio.com.br

    Assunto: chamado: #18752#

    Corpo do email

    segunda-feira, 27 de agosto de 2012 23:09
  • Felipe, descobri onde estava errando, no exemplo do link http://www.ambienteoffice.com.br/outlook/executar_macro_ao_receber_e-mail/ o codigo tem que estar dentro de "ThisOutlookSession" do contrario não aparece na caixa de seleção do script na hora de criar as regras. Vou tentar desenvolver um pouco aqui, se tiver duvidas ou algo para compartilhar posto novamente. Obrigado.
    segunda-feira, 27 de agosto de 2012 23:23
  • Eu vou atualizar minha página para certificar que se crie a macro na classe ThisOutlookSession, obrigado.

    Sobre o chamado, veja um exemplo, para extrair o número:

    Sub Exemplo()
        Dim lIni As Long
        Dim lFim As Long
        Dim sAssunto As String
        Dim sChamado As String
        
        sAssunto = "Assunto: chamado: #18752#"
        lIni = InStr(1, sAssunto, "#")
        lFim = InStrRev(sAssunto, "#")
        sChamado = Mid(sAssunto, lIni + 1, lFim - lIni - 1)
        
        MsgBox sChamado
    End Sub


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    terça-feira, 28 de agosto de 2012 21:17
    Moderador
  • Olá Felipe, legal o exemplo de "InStr" com certeza vou usar, muito obrigado.

    Vou colocar o Codigo completo aqui, caso alguem mais precise.

    O Código abaixo é para uma MACRO que salva em um banco de dados Access algumas informações dos emails recebidos retirando do assunto o numero que fica entre as ##. a Ideia é automatizar as interações em um sistema de chamados Helpdesk.

    O Codigo deve ser colocado em "ThisOutlookSession" e depois criar uma regra para executar esse script para todos os emails recebidos, como no exemplo do Felipe ( http://www.ambienteoffice.com.br/outlook/executar_macro_ao_receber_e-mail/ )

    Sub MensagemRecebida(Item As MailItem)
    
    'verifica se existe no assunto do email possui a palavra "CHAMADO:"
    If Item.Subject Like "*CHAMADO:*" Then
        Dim lIni As Long
        Dim lFim As Long
        Dim sAssunto As String
        Dim sChamado As String
        
        'Retira o numero do chamado do assunto do email, ex: neste "Assunto: CHAMADO: #18752#" pegaria o numero 18752
        sAssunto = Item.Subject
        lIni = InStr(1, sAssunto, "#")
        lFim = InStrRev(sAssunto, "#")
        sChamado = Mid(sAssunto, lIni + 1, lFim - lIni - 1)
        
        'Exibi o numero do chamado retirado do assunto (para debug)
        MsgBox sChamado
        
        'Conexão com banco de dados Access
        Dim cn As ADODB.Connection
        Dim strDB As String
        Dim strSQL As String
        Set cn = New ADODB.Connection
        Set rs = New ADODB.Recordset
        
        'caminho do banco access
        strDB = "d:\teste.mdb."
        
        'Importante: como Informado pelo Felipe no post acima é necessário
        'adicionar uma referência à biblioteca Microsoft ActiveX Data Objects 2.0 ou superior (no VBE, menu Ferramentas >> Referências:
        cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & strDB & ";"
        cn.Open
        
        strSQL = "INSERT into email_outlook (numero,de,para,corpo) values(" & sChamado & ",'" & Item.Sender & "','" & Item.To & "','" & Item.Body & "')"
        
        cn.Execute strSQL
        cn.Close
        End If
    End Sub
    

    quinta-feira, 30 de agosto de 2012 00:56
  • Boa tarde Prezados.

    Primeiramente, tenho pouco conhecimento em VB, mas preciso adaptar essa macro para o que preciso.

    Necessito que sempre que eu receber um email com o assunto "*Ligações URA*", automaticamente ele salva o corpo do email em .txt em C://teste.txt.

    Podem me ajudar?

    abs.

    quarta-feira, 26 de março de 2014 18:03
  • Sei que o post é antigo, mas me ajudem por favor.

    Copiei a rotina inteira acima, mas sem da erro "Tipos incompatíveis" linha:

    For Each olItem In olFolder.Items

    O que estou fazendo de errado????

    quarta-feira, 25 de junho de 2014 16:24
  • Amigos, este tópico é de dois anos atrás. Sugiro que criem um novo tópico com a dúvida de vocês, assim o fórum ficará organizado.

    Vou bloquear este tópico.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    quinta-feira, 26 de junho de 2014 01:33
    Moderador