Enviar email com Excel sem usar o Outlook

47
Enviar email com Excel sem usar o Outlook

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") = "[email protected]"
    '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 = "[email protected]"
        'Seu email
        .From = "[email protected]"
        '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 = "[email protected]"
        '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

47 COMENTÁRIOS

  1. 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. 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. 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

  5. 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?

  6. 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.

  7. 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?

  8. 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

  9. 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?

    • 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

  10. 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

  11. 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 ([email protected]) 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?

  12. 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"
    ???

  13. 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?

  14. 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.

  15. 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

  16. 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.

  17. 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.

  18. 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!

  19. 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?

  20. 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,

    • 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

DEIXE UMA RESPOSTA

Please enter your comment!
Please enter your name here