Enviar email com Excel sem usar o Outlook

Tradução das fórmulas Excel Inglês - Português
Tradução das fórmulas Excel Inglês – Português
23 de dezembro de 2010
Formatação Condicional Excel 2007 e 2010
Formatação Condicional Excel 2007 e 2010
26 de dezembro de 2010

Objetivo: Enviar email a partir do Excel utilizando VBA.

Procurando pela internet um assunto interessante encontrei um código VBA no qual me baseei e realizei algumas alterações como a inclusão de anexos nos emails enviados pelo Excel. Para utilizar este código a primeira coisa que você deve fazer é abrir o VBA e clicar em Ferramentas->Referências->Microsoft CDO for Windows 2000 Library marcando este último, que é o componente do Windows para envio de emails. O segundo passo é criar um módulo e incluir o código fonte abaixo que foi comentado e identado para melhor entendimento. Substitua os pontos aonde está escrito teste pelos dados correspondentes e você conseguirá enviar e-mails a partir do Excel. Este exemplo está configurado para envio de emails a partir de uma conta do GMAIL.

'Baseado no código disponibilizado em: http://www.a1vbcode.com/snippet-3691.asp
Function EnviaEmail2()
    Dim iMsg, iConf, Flds

    'Seta as variáveis, lembrando que o objeto Microsoft CDO deverá estar habilitado em Ferramentas->Referências->Microsoft CDO for Windows 2000 Library
    Set iMsg = CreateObject("CDO.Message")
    Set iConf = CreateObject("CDO.Configuration")
    Set Flds = iConf.Fields

    'Configura o componente de envio de email
    schema = "http://schemas.microsoft.com/cdo/configuration/"
    Flds.Item(schema & "sendusing") = 2
    'Configura o smtp
    Flds.Item(schema & "smtpserver") = "smtp.gmail.com"
    'Configura a porta de envio de email
    Flds.Item(schema & "smtpserverport") = 465
    Flds.Item(schema & "smtpauthenticate") = 1
    'Configura o email do remetente
    Flds.Item(schema & "sendusername") = "seuemail@gmail.com"
    'Configura a senha do email remetente
    Flds.Item(schema & "sendpassword") = "suasenha"
    Flds.Item(schema & "smtpusessl") = 1
    Flds.Update

    With iMsg
        'Email do destinatário
        .To = "destino@gmail.com"
        'Seu email
        .From = "seuemail@gmail.com"
        'Título do email
        .Subject = "Isto é um teste de Envio de email"
        'Mensagem do e-mail, você pode enviar formatado em HTML
        .HTMLBody = "Mensagem enviada com o gmail."
        'Seu nome ou apelido
        .Sender = "Teste"
        'Nome da sua organização
        .Organization = "Empresa Teste"
        'email de responder para
        .ReplyTo = "teste@gmail.com"
        'Anexo a ser enviado na mensagem
        .AddAttachment ("c:\fatura.txt")
        'Passa a configuração para o objeto CDO
        Set .Configuration = iConf
        'Envia o email
        .Send
    End With

    'Limpa as variáveis
    Set iMsg = Nothing
    Set iConf = Nothing
    Set Flds = Nothing
End Function

Este código pode ser facilmente adaptado para enviar emails com informações de células do Excel e uma mensagem formatada em HTML.

Marcos Rieper

53 Comentários

  1. CARLOS LINS disse:

    Caro amigo,

    Gostaria de saber se há uma possibilidade de condicionar o envio do e-mail (sem anexo) apenas com a informação de que um tempo esta excedido.

    Ex. ABERTURA: 19/02/2011 17:00
    PRAZO: 19/02/2011 18:00
    CONTAGEM: 19/02/2011 17:10 (USANDO A FORMULA “=AGORA()”)

    Baseando-se na célula de contagem, ao chegar em 18:00 fazer o envio do e-mail.

    Muito obrigado e um grande abraço!

  2. Bom dia Marcos. Sei que o texto acima já é de uma data passada, mas o hoje o assunto foi levantado pelo meu coordenador e segundo a pergunta feita pelo outro usuário é minha mesma dúvida.
    Nós utilizamos uma tabela no excel onde são preenchidos alguns dados sobre relatórios de não conformidade e automaticamente gera um relatório.
    O que nós queriamos era que se passada a data de conclusão ou retorno fosse enviado um e-mail às pessoas definidas avisando do atraso.
    Imagino que possa ser feito isso, será que você tem como nos dar uma mão nisso???

    Obrigado. E só tenho elogios ao seu site, muito bom, tenho aprendido muito sobre excel.

  3. Vinicius Leite disse:

    Quando eu tento executar o código acima ele dá um erro em tempo de execução: “the transport failed to connect to the server”, a minha internet está associada a um login e uma senha para se conectar, tem alguma coisa relacionada disso a esse erro?

  4. Vladimir disse:

    Parabens!! Assim deveria ser outros Sites.

  5. Silas Toledo disse:

    Marcos,

    Copiei do seu site o código de envio de e-mail por vba, a partir do excel, sem o uso do outlook.
    Ele dá o seguinte erro: “the transport failed to connect to the server”, que Vinicius Leite já havia lhe relatado. Você concluiu, no caso dele, que seria problema no servidor.
    Você saberia me dizer como eu posso resolver isto?

    Silas

  6. jonatas disse:

    olá Marcos Rieper, Coloquei esse código em um modulo, depois de ter editado como eu faço pra enviar. QUAL BOTÃO APERTO!

  7. Felipe Sousa de Almeida disse:

    Prezado Marcos, estou configurando a Macro para enviar o e-mail via Lotus Notes; Mas ao final apresenta-se o erro de ““the transport failed to connect to the server”. Eu modifiquei o smtp para o servidor. Mas ele depura no código SendEmailGamil = .Send

    Você tem ideia do que pode estar acontecendo?

  8. Alex disse:

    Bom dia!
    Testando o código, com todas as informações corretas o e-mail é enviado, no entanto, testando com informações incorretas, como por exemplo, a porta SMTP, o sistema gera erro no comando .SEND. Definindo ON ERROR RESUME NEXT, o erro é suprimido, mas não consegui obter retorno de e-mail não enviado. Há uma forma de tratar este tipo de inconsistência nos dados para envio, no momento de envio?
    Obs.: criei um cadastro de dados para envio de e-mail (e-mail, SMTP, porta e senha), e defini variáveis no código proposto para que o e-mail seja enviado com base nesse cadastro.

  9. Antonio disse:

    Marcos, Bom dia tudo bem com você
    olha copiei o seu código para envio de email, porém ele está dando erro, quando chega no SendEmailGmail = .Send
    o erro que dá é: erro em tempo de execução ‘-2147220973 (80040213)’:
    falha na conexão do transporte com o servidor
    O que preciso fazer para dar certo?

  10. José Carlos disse:

    Boa tarde estava dando uma olhada neste código embora tenha tempo qu epublicou achei interessante. fiz tudo como descrito sustituí os dados onde existe a palavra teste por meu e-mail. Aparentemente tudo ocorreu bem mas no comando SendEmailGmail = .Send
    Vem a mensagem pelo menos um dos campos de ou remetente deve estar preenchido o que pode ser ?
    Agora tem como na chamada da function eu passar os parâmetros como para remetente arquivo a ser enviado etc ?

    Obrigado e muito bom e simples

  11. Jose Carlos disse:

    Colega funcionou perfeitamente obrigado

  12. Nonato disse:

    Não consegui enviar sempre erro na linha
    SendEmailGmail = .send
    o que fazer

  13. +Marcos Rieper, como eu crio um botão para executar esta função?

  14. Henrique Silveira disse:

    Bom dia Marcos. Primeiramente Parabéns pelo trabalho. Me ajudou muito no serviço.
    Eu rodei com meu proxy desativado em casa, sem problemas. Foi perfeita. Quando eu ativo o proxy na empresa, dá erro de comunicação com o transporte.
    Vi acima que o problema ocorre pelo acesso a rede e meu servidor, porém troquei a porta e não rodou.

    Existe uma forma de resolver este problemas?

    • Marcos Rieper disse:

      Boa tarde Henrique,

      Obrigado pelo elogio, fico muito feliz pelo feedback.

      Sobre a sua dúvida, deve ser um problema de permissão, fale com o departamento do TI da sua empresa e veja se você tem acesso para esta tarefa.

      Abraço
      Marcos Rieper

  15. karenabecia disse:

    olá, tentei fazer de tudo, meu código é esse, e não funciona!!

    recebo o erro:
    erro de automação
    erro do instalador de software microsoft

    ___

    Sub Envio()
    Dim OutApp As Outlook.Application
    Dim OutMail As Outlook.MailItem

    Set OutApp = CreateObject(“Outlook.Application”)
    Set OutMail = OutApp.CreateItem(olMailItem)

    Dim Vdestino As String
    Dim VCaminhoA As String
    Dim VarquivoA As String
    Dim Vassunto As String
    Dim Vmensagem As String
    Dim Vlinha As String

    Application.DisplayAlerts = False

    Vlinha = 2

    Vdestino = Range(“G” & Vlinha).Text
    VCaminhoA = Range(“j” & Vlinha).Text
    VarquivoA = Range(“K” & Vlinha).Text
    Vassunto = Range(“i” & Vlinha).Text
    Vmensagem = Range(“l” & Vlinha).Text

    ‘—-

    While Len(Range(“d” & Vlinha)) > 0 And Range(“h” & Vlinha) = “sim”

    Dim olMail As Variant
    Set olMail = olApp.CreateItem(olMailItem)

    With OutMail

    .To = Vdestino
    .CC = “”
    .BCC = “”
    .Subject = Vassunto
    .Body = Vmensagem
    .Attachments.Add (VCaminhoA & VarquivoA)
    .Send

    End With

    Vlinha = Vlinha + 1

    Wend
    ‘ENCERRE O LAÇO FOR AQUI

    Set olApp = Nothing
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    ‘——

    Application.DisplayAlerts = True

    Set OutMail = Nothing

    Set OutApp = Nothing

    Set OutApp = Nothing

    End Sub

  16. Renan disse:

    Olá Marcos,

    Ótimo seu artigo, consegui fazer funcionar direitinho.

    Gostaria de tirar uma dúvida. É possível colocar no campo destinatário em vez do email completo (xxx@teste.com) colocar o nome da pessoa ou número único pessoal, no caso da minha empresa (Y331245) e ele “resolver” qual o e-mail do destinatário com base no nome?

  17. Almeida disse:

    Bom dia
    .AddAttachment (“c:\fatura.txt”) << aqui no lugar do endereço posso utilizar uma célula onde vai se encontrar a informação da origem do arquivo. No caso estou criando um sistema onde ao enviar ele gera um arquivo pdf. O nome deste arquivo vai aparecer em uma célula que vou utilizar como referencia do arquivo "variavel" & ".pdf"
    ???

  18. Rafael Monteiro disse:

    Amigo, código excelente. Só que observei que na caixa “Enviados” do Gmail, não fica registrado quando envio pelo VBA. Tem como registrar isso?

  19. Rico Santos disse:

    Pessoal, ref. aos erros de envio automático para o gmail, encontrei o link abaixo e alterei permissão para que de acesso de aplicativos menos seguros. Desta forma funcionou perfeito.

    https://productforums.google.com/forum/#!topic/gmail-pt/eQs9NgVS5ys

  20. Milton disse:

    Marcos, fiz todos os procedimentos descritos, mas a “Function” criada não fica disponível para execução. Eu só consigo executar ou associar a botões uma “Sub” existente em uma pasta Módulo do VBA. Como tornar esta “Function” disponível para execução? Obg.

  21. Marcos disse:

    Marcos, bom dia

    Testei a função que você escreveu acima e funcionou perfeitamente. Porém gostaria de acrescentar uma figura.jpg no corpo do e-mail. Mesmo colocando o comando “” , a imagem não chega no destino. Somente consigo mandar o arquivo com o comando .AddAttachment. Porém preciso colocar no corpo do email. É possível?
    Grato

  22. Marcos disse:

    Marcos, o comando utilizado no fórum indicado funciona bem quando utilizamos como saída o outlook. Porém no outlook não consigo alterar o email do remetente entre uma mensagem e outra. Enviando pelo excel posso utilizar para cada destinatário escolhido um e-mail do remetente diferente, através de variáveis. Mas a função utilizada no fórum somente funciona quando usamos a saída pelo outlook. Quando coloco a mesma função com saída pelo excel, a imagem não chega no destino. Grato pela ajuda.

  23. Marcos disse:

    Marcos,
    Consegui. Achei a resposta no site http://www.w3schools.com
    Grato pela ajuda.

  24. Reinaldo Aparecido Carlos disse:

    Boa noite.

    Marcos, tem como enviar um e-mail do Excel pelo G-mail, mas com uma imagem do computador ou do próprio Excel, como um gráfico, ou uma apresentação, mas que ela apareça no corpo do e-mail e não como anexo ?

    Obrigado.

  25. Edelson martins disse:

    Marcos,

    Primeiramente quero agradecer pela enciclopédia que se tornou o Guia do Excel.
    Tenho aprendido muito por aqui.
    O código funcionou perfeitamente, parabéns!
    Segui o link da w3shools, indicado pelo Marcos, na tentativa de inserir uma imagem no corpo do e-mail.
    Porém, não conheço nada de HTML e gostaria de saber se você pode postar o código acima com um exemplo de .HTMLBody enviando uma imagem ou apenas descrever aqui a sintaxe correta que deve ser adicionada após .HTMLBody = “”

    Obrigado e um abraço!

  26. Edelson martins disse:

    Marcos,

    Consegui ajustar o código para o .HTMLBody, mas ele envia apenas um retângulo vazio. A mesma imagem é enviada sem problemas como anexo no pelo .AddAttachment.

    .HTMLBody = “”

    .AddAttachment (“C:\Fotos\Foto_6.jpg.jpg”)

    Tem alguma dica?

  27. Zanaldo Borba disse:

    Caro Marcos Rieper, boa noite.
    O código que publicou funciona sem problema no Excel 2007, já no Excel 2010 e 2013, informa o erro:
    “Erro em tempo de execução ‘-2147220975 (80040211)’:
    Não foi possível enviar a mensagem para o servidor SMTP. O Código de erro de trasporte foi 0x80040217. A resposta do servidor foi not available.”
    Para na linha com o comando .Send
    Você saberia o que acontece de errado?
    Atenciosamente,

    • Marcos Rieper disse:

      Boa tarde Zanaldo,

      Este erro que ele está exibindo é referente ao servidor de SMTP, aparentemente está errado ou indisponível.

      Você testou a mesma planilha em várias versões do Excel?

      At.
      Marcos Rieper

    • Gustavo Souza disse:

      Se você estiver usando Gmail, pode ser que o envio esteja sendo bloqueado. Você tem que dar permissão para “apps menos seguros” na sua conta do Gmail.

  28. Roberto disse:

    Boa tarde, estou tentando adicionar uma imagem no corpo do e-mail, verifiquei nos comentários que é para utilizar HTML no corpo do e-mail, porém não estou conseguindo.
    Você poderia descrever o código?

  29. Gustavo Souza disse:

    Ótimo código Marcos! Irá me ajudar muito. Tenho costume de usar o Outlook, mas quando alguém que não tem o Outlook já configurado no PC precisava usar minhas planilhas sempre dava problema. Agora com esse código será bem mais fácil.

  30. Deivison Vicente disse:

    Boa noite,

    Preciso de uma ajuda. A macro copia o texto, transforma em imagem e copia a imagem, só que ele não abre o Outlook com um novo email e as informações no VBA. Poderia dar um help ?

    Segue:

    Public E_Mail As String
    Sub Copy_Paste_Picture()
    ‘Transforma o range em imagem e cola na pasta imagem
    Worksheets(“GRADE ATUAL”).Select
    Range(“b1:n37”).Copy
    Worksheets(“Imagens”).Select
    ActiveSheet.Pictures.Paste.Name = “Grade”

    End Sub

    Sub Cut_Picture()
    ‘copia a imagem com o nome dado na primeira sub
    Worksheets(“Imagens”).Select
    ActiveSheet.Shapes.Range(Array(“Grade”)).Select
    Selection.Cut
    End Sub

    Sub Send_Msg2()
    Dim OutApp As Object
    Dim OutMail As Object

    E_Mail = Worksheets(“Anotações”).Range(“A2”) & “;” & Worksheets(“Anotações”).Range(“A3”) & “;” & Worksheets(“Anotações”).Range(“A4”) & “;” & Worksheets(“Anotações”).Range(“A5”) & “;” & Worksheets(“Anotações”).Range(“A6”) & “;” & Worksheets(“Anotações”).Range(“A7”) & “;” & Worksheets(“Anotações”).Range(“A8”) & “;” & Worksheets(“Anotações”).Range(“A9”) & “;” & Worksheets(“Anotações”).Range(“A10”) & “;” & Worksheets(“Anotações”).Range(“A11”) & “;” & Worksheets(“Anotações”).Range(“A12”) & “;” & Worksheets(“Anotações”).Range(“A13”) & “;” & Worksheets(“Anotações”).Range(“A14”) & “;” & Worksheets(“Anotações”).Range(“A15”) & “;” & Worksheets(“Anotações”).Range(“A16”) & “;” & Worksheets(“Anotações”).Range(“A17”) & “;” & Worksheets(“Anotações”).Range(“A18”) & “;” & Worksheets(“Anotações”).Range(“A19”) & “;” & Worksheets(“Anotações”).Range(“A20”) & “;” & Worksheets(“Anotações”).Range(“A21”) & “;” & Worksheets(“Anotações”).Range(“A22”)
    E_Mail2 = Worksheets(“Anotações”).Range(“B2”) & “;” & Worksheets(“Anotações”).Range(“B3”) & “;” & Worksheets(“Anotações”).Range(“B4”) & “;” & Worksheets(“Anotações”).Range(“B5”) & “;” & Worksheets(“Anotações”).Range(“B6”) & “;” & Worksheets(“Anotações”).Range(“B7”) & “;” & Worksheets(“Anotações”).Range(“B8”) & “;” & Worksheets(“Anotações”).Range(“B9”) & “;” & Worksheets(“Anotações”).Range(“B10”) & “;” & Worksheets(“Anotações”).Range(“B11”) & “;” & Worksheets(“Anotações”).Range(“B12”) & “;” & Worksheets(“Anotações”).Range(“B13”) & “;” & Worksheets(“Anotações”).Range(“B14”) & “;” & Worksheets(“Anotações”).Range(“B15”) & “;” & Worksheets(“Anotações”).Range(“B16”) & “;” & Worksheets(“Anotações”).Range(“B17”) & “;” & Worksheets(“Anotações”).Range(“B18”) & “;” & Worksheets(“Anotações”).Range(“B19”) & “;” & Worksheets(“Anotações”).Range(“B20”) & “;” & Worksheets(“Anotações”).Range(“B21”) & “;” & Worksheets(“Anotações”).Range(“B22”)

    ‘MsgBox E_Mail
    ‘Para ser usado o Shift-Print Screen
    ‘Application.SendKeys “(%{1068})”

    ‘Chama a Sub de copiar a imagem
    Call Copy_Paste_Picture
    Call Cut_Picture

    On Error Resume Next

    ‘Prepara o E-MailPrepare the email
    ‘Nesse ponto Abre o Outlook
    Set OutApp = CreateObject(“Outlook.Application”)
    OutApp.Session.Logon
    ‘Neste outro cria uma nova mensagem
    Set OutMail = OutApp.CreateItem(0)

    On Error Resume Next

    With OutMail
    .To = E_Mail
    .CC = E_Mail2
    .Subject = “PATIO VIRTUAL – Pré Separação”
    .Body = “Favor fazer a pré separação da carga abaixo;”
    .Display

    ‘Vai para proxima linha abaixo
    Application.SendKeys “{DOWN}”
    ‘Vai para proxima linha abaixo
    Application.SendKeys “{DOWN}”
    ‘Vai para o fim da linha
    Application.SendKeys “{END}”
    ‘Da um enter no fim da palavra
    Application.SendKeys “~”
    ‘Cola a imagem no e-mail

    Application.SendKeys “(^v)”

    End With
    On Error GoTo 0

    OutApp.Session.Logoff
    Set OutMail = Nothing
    Set OutApp = Nothing

    End Sub

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Inscreva-se no nosso canal do Youtube!


Junte-se ao nosso canal do Youtube. Começamos em abril de 2016, mas já temos mais de 06:00 h de treinamentos gratuitos e este número irá aumentar. Vídeos novos todos os sábados.