Olá pessoas Excelentes!

Tenho recebido muitos comentários, pedidos e dúvidas acerca do tema “enviar emails pelo Excel“, por isso, há tempos desejo escrever um tutorial bacana sobre um modo mais avançado e aprimorado de realizar esta tarefa diretamente de suas planilhas.

Já ensinei, aqui no site, esta outra maneira de enviar emails pelo Excel, contudo, apesar de bem funcional, este método é bem limitado e dependente de um processador de emails instalado na máquina. Resolve em muitos casos mais simples e que não exijam muitas alternativas, como por exemplo, escrever uma mensagem personalizada no corpo do email.

Na dica de hoje, vamos utilizar um processo de envio de emails baseado em configurações de SMTP, as mesmas que você utiliza em qualquer aplicativo de envio de emails, como o Outlook, por exemplo. Desse modo, não será necessário nenhum software externo para auxiliar na execução desta tarefa. Tudo será gerenciado pela própria macro do Excel.

Vamos começar, pois temos bastante coisa para fazer.

Iniciando o projeto

O processo de envio de email que iremos criar com nossa macro VBA é totalmente independente que qualquer programa de emails instalado na sua máquina, ou seja, não requer o Outlook configurado, Live Mail ou qualquer outro. Essa liberdade para manipular o tratamento das mensagens será possível com o auxílio da biblioteca Cdonts (cdosys.dll) que já está presente em seu computador.

Vamos referenciá-la dinamicamente em nosso projeto através das linhas de comando abaixo:

Set iMsg = CreateObject("CDO.Message")
Set iConf = CreateObject("CDO.Configuration")

Para que possamos ter uma melhor compreensão e aproveitamento da nossa rotina de envio de emails, vamos organizar a macro em duas partes principais:

  1. Uma classe de configuração e envio da mensagem
  2. Um módulo onde criaremos o conteúdo da mensagem e os destinatários da mensagem

Isto é bom porque não precisamos ficar configurando o objeto CDO a cada método que criarmos. Enfim, um pouco do conceito de OOP (Object-oriented programming) que tentamos aplicar aqui no VBA.

 

Criando a classe de envio de emails

Abra o painel de edição de macros (ALT+F11) e insira um módulo de classe.

 

Altere o nome da Classe1 para clsEmail.

Em seguida, digite o código abaixo.

Option Explicit

Private iConf                   As Object
Private iMsg                    As Object
Private confEmailFromNome       As String
Private confEmailFrom           As String
Private confEmailSenha          As String
Private confEmailServidor       As String
Private confEmailPorta          As String
Private confEmailSSL            As Boolean
Private emailTo                 As String
Private emailToNome             As String
Private emailTitulo             As String
Private emailConteudo           As String
Private emailAnexo              As Variant

Public Property Let setConfEmailFromNome(value As String)
    confEmailFromNome = Trim(value)
End Property
Public Property Let setConfEmailFrom(value As String)
    confEmailFrom = Trim(value)
End Property
Public Property Let setConfEmailSenha(value As String)
    confEmailSenha = Trim(value)
End Property
Public Property Let setConfEmailServidor(value As String)
    confEmailServidor = Trim(value)
End Property
Public Property Let setConfEmailPorta(value As String)
    value = Trim(value)
    If Len(value) = 0 Then value = "25"
    confEmailPorta = value
End Property
Public Property Let setConfEmailSSL(value As Boolean)
    confEmailSSL = value
End Property
Public Property Let setEmailTitulo(value As String)
    emailTitulo = Trim(value)
End Property
Public Property Let setEmailConteudo(value As String)
    emailConteudo = Trim(value)
End Property
Public Property Let setEmailAnexo(value As Variant)
    emailAnexo = value
End Property
Public Property Let setEmailTo(value As String)
    emailTo = Trim(value)
End Property
Public Property Let setEmailToNome(value As String)
    emailToNome = Trim(value)
End Property

Public Property Get getEmailTo() As String
    getEmailTo = emailTo
End Property
Public Property Get getEmailToNome() As String
    getEmailToNome = emailToNome
End Property

Public Function Configurar() As Boolean
Dim Flds As Variant
On Error GoTo Err_Class

    Set iMsg = CreateObject("CDO.Message")
    Set iConf = CreateObject("CDO.Configuration")

    iConf.Load -1
    Set Flds = iConf.Fields
    With Flds
        .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = confEmailServidor
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = confEmailPorta
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
        .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = confEmailFrom
        .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = confEmailSenha
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = confEmailSSL

        .Update
    End With

    With iMsg
        Set .Configuration = iConf
    End With

    Configurar = True

Err_Exit:
    Exit Function
Err_Class:
    Configurar = False
    MsgBox "Ocorreu um erro. [" & Err.Number & "]", vbExclamation
    GoTo Err_Exit
End Function

Public Function EnviarEmail() As Boolean
Dim strbody As String
Dim i As Integer

On Error GoTo Erro

    'adiciona quebras de linha
    strbody = Replace(emailConteudo, "<br>", "<br>" & vbCrLf)

    With iMsg
        .To = emailToNome & " <" & emailTo & ">"
        .CC = ""
        .BCC = ""
        .FROM = confEmailFromNome & " <" & confEmailFrom & ">"
        .Subject = emailTitulo
        .HTMLBody = emailConteudo

        'Anexa arquivos ao email
        .attachments.DeleteAll
        If IsArray(emailAnexo) Then     'Se mais de um arquivo para anexar
            For i = 1 To UBound(emailAnexo)
                .AddAttachment emailAnexo(i)    'anexa um por um dos arquivos
            Next i
        Else        'Se apenas um arquivo para anexar
            If Len(emailAnexo) > 0 Then
                .AddAttachment emailAnexo
            End If
        End If

        .Send       'Comando para enviar o email
    End With

    EnviarEmail = True

Exit Function
Erro:
    EnviarEmail = False
    MsgBox "Falha no envio do Email." & vbCrLf & Err.Description, vbExclamation
    Exit Function
End Function

Private Sub Class_Terminate()
On Error GoTo Err_Class

    Set iMsg = Nothing
    Set iConf = Nothing

Err_Exit:
    Exit Sub
Err_Class:
    MsgBox "Ocorreu um erro. [" & Err.Number & "]", vbExclamation
    GoTo Err_Exit
End Sub

Essa classe será responsável pelas configurações do servidor SMTP,  login e senha do email do remetente. E também fará o envio da mensagem, ou seja, toda a rotina que é executada ao clicar no botão enviar, por exemplo, é processada nela, de acordo com o conteúdo e destinatário do email passado para a classe através dos parâmetros solicitados.

Vejamos a seguir como criar nossa rotina de envio de emails e fazer a chamada a classe clsEmail.

 

Criando a rotina para enviar emails

Agora que já temos a classe que fará todo o trabalho para tratar o envio de mensagens, podemos utilizá-la de acordo com nossas necessidades que podem ser as mais diversas, como enviar um relatório de vendas para cada vendedor de uma lista em sua planilha, ou para os gerentes de cada departamento com uma frequência previamente determinada. Isso vai depender, como disse, da necessidade do seu projeto. Você é quem vai determinar e desenvolver a rotina que mais se aplicará ao teu caso.

Neste tutorial, vou ensinar uma maneira básica de enviar um email utilizando nossa macro. A rotina a seguir mostra como enviar uma mensagem pré-configurada, no formato HTML, para o endereço de email informado na célula C8 da planilha Plan1.

Adicione um Módulo ao projeto e digite o código abaixo.

Sub EnviarEmail()
Dim objEmail As clsEmail
Dim sh As Worksheet
On Error GoTo Erro_Sub

    Set objEmail = New clsEmail     'Inicializa a classe clsEmail
    Set sh = Sheets("Plan1")        'Define a planilha

    With objEmail
        .setConfEmailServidor = "smtp.seuservidor.com.br"       'Servidor de saída de emails. Ex: smtp.uol.com.br
        .setConfEmailPorta = "25"                               'Porta. Padrão é a porta 25
        .setConfEmailSSL = false                                'Se necessita conexão segura SSL
        .setConfEmailFrom = "seu-email@seuservidor.com.br"      'Seu email: O remetente do email. Ex: seunome@uol.com.br
        .setConfEmailSenha = "sua-senha"                        'Sua senha: A senha que você usa para acessar seus emails
        .setConfEmailFromNome = "Seu Nome"                      'Seu nome: O nome que será exibido no campo De:
        .Configurar     'Executa a configuração

        .setEmailTo = sh.Range("C8")                            'Email do Destinatário
        .setEmailToNome = sh.Range("C6")                        'Nome do Destinatário

        .setEmailTitulo = "Aprendendo a enviar emails diretamente do Excel"     'Título da mensagem

        'Aqui, você deve digitar o conteúdo. Pode utilizar formatação HTML.
        .setEmailConteudo = "Olá, <strong>" & .getEmailToNome & "</strong>.<br><br>Estou aprendendo muito aqui no site <a href=""http://www.exceldoseujeito.com.br"">Excel do Seu Jeito</a>." _
                            & "<br><br>Acesse <a href=""http://www.exceldoseujeito.com.br"">http://www.exceldoseujeito.com.br</a> e fique expert no Excel."

        .EnviarEmail

    End With

    Set objEmail = Nothing
    Set sh = Nothing

    MsgBox "Email enviado com sucesso!", vbInformation

Exit Sub
Erro_Sub:
    MsgBox Err.Description, vbExclamation
    Exit Sub
End Sub

Após criar a rotina acima (que pode ser utilizada teclando ALT+F8), podemos definir que a sua utilização seja iniciada com um clique num botão Enviar na própria planilha. Para isso, crie uma planilha semelhante a mostrada na figura a seguir e atribua a macro EnviarEmail ao botão “Enviar“, clicando com o botão direito do mouse no retângulo inserido e selecionando a opção “Atribuir macro“.

 

Feito isso, digite o nome e o email na planilha e clique no botão enviar. Pronto! Seu email foi enviado com sucesso.

 

Bom pessoal, vou terminar essa primeira parte por aqui. Amanhã postarei a continuação, onde falarei como anexar arquivos e enviar vários emails de uma lista.

Deixem seus comentários sobre este artigo e compartilhem com seus amigos do twitter e do facebook, ok.

E, pra quem ainda não adquiriu meu ebook Aprenda as 7 Fórmulas que podem salvar a sua vida, clique aqui para ver mais detalhes e adquirir o seu ebook agora. Nele você vai encontrar exemplos e ensinamentos sobre as fórmulas mais usadas em qualquer planilha do Excel e vai poder tirar onda com seus colegas de trabalho, apresentando sempre planilhas perfeitamente profissionais, de dar inveja a quem utilizá-las.

 

Até a próxima pessoal.

Antes de efetuar o download do arquivo de exemplo, convido você a socializar conosco.

Escolha uma das opções abaixo. Seguir no twitter, assinar nossa Newsletter...

Isso nos ajuda na divulgação do site e te permite ficar sempre atualizado das novidades. Fico muito grato pela sua colaboração.

Digite seu email:

Você receberá um email para ativar o cadastro, ok!