VB .NET - Enviando Email via OutLook 2007


 No artigo de hoje vou mostrar como podemos enviar emails a partir de uma aplicação Windows Forms usando a linguagem VB .NET e o Outlook, no meu caso, estou usando o Outlook 2007.

O modelo de objeto do OutLook possui as classes : MailItem, AppointmentItem,  MobileItem,  SharingItem, TaskItem e todas elas fornecem o método Send.

O método Send não aceita ou retorna qualquer valor ou objeto, ele apenas faz o seu trabalho que é enviar a mensagem.

No entanto para poder enviar uma mensagem usando o Outlook você precisa saber para quem entregar a mensagem, e , a propriedade Recipient é usada para tal tarefa, pois ela retorna uma instância da classe Recipients que contém todos os destinatários da sua mensagem, ou seja, instâncias da classe Recipient no Outlook.

A coleção de destinatários (Recipients) fornece o método Add que adiciona novos destinatários para a coleção sendo que o método aceita uma string que contém o nome de destinatário ou um endereço de email SMTP completo, e, retorna uma nova instância da classe Recipient. ( O nome do destinatário deve ser válido e tem que ter uma entrada correspondente no seu livro de endereços)

A coleção também fornece o método ResolveAll o qual não aceita qualquer parâmetro e retorna um valor Boolean  indicando se todos os destinatários na coleção foram resolvidos ou não. (Se um ou mais destinatário não for resolvido, ou seja, não corresponder às entradas do livro de endereços irá retornar false).

A classe Recipient também fornece a propriedade Resolved a qual pode ser usada ao invés do método ResolveAll.

Nota :  Se você especificar um endereço de e-mail SMTP, não vai precisar ter uma entrada "mapeada" no livro de endereços.

Vamos então criar uma aplicação Windows Forms usando a linguagem VB .NET e mostrar como enviar emails usando o Outlook.

Nota: Veja o artigo - Visual Basic 6 -  Chamando o Outlook e usando o preenchimento automático - que realiza a mesma tarefa usando o Visual Basic 6.

Recursos usados

Criando o projeto no VS Community

Abra o VS Community 2015  e clique em New Project;

A seguir selecione Visual Basic ->  Windows Forms Application

Informe o nome vbn_Outlook_Email e clique no botão OK;

A seguir a partir da ToolBox inclua no formulário form1.vb os seguintes controles:

Disponha os controles no formulário conforme o leiaute da figura abaixo:

Agora vamos incluir uma referência a biblioteca do Outlook em nosso projeto.

No menu Project clique em Add Reference e na janela Reference Manager clique na guia COM e selecione o pacote: Microsoft Outlook 12.0 Object Library

Agora vamos definir no formulário form1.vb a declaração do namespace:

Imports Microsoft.Office

Declare no início do formulário a variável a seguir que irá receber o nome do arquivo anexo:

Dim arquivoAnexo As String

No evento Click do botão de comando - Enviar Email via Outlook - inclua o código a seguir:

Private Sub btnEnviarEmail_Click(sender As Object, e As EventArgs) Handles btnEnviarEmail.Click
        'se não selecionou o anexo então atribui um arquivo sem nome
        If String.IsNullOrEmpty(arquivoAnexo) Then
            arquivoAnexo = ""
        End If
        'define o nome do anexo
        Dim nome As String = "Macoratti"
        If validaDados() Then
            EnviaEmail(txtAssunto.Text, txtMensagem.Text, txtDestino.Text, txtCC.Text, arquivoAnexo, nome)
        Else
            MessageBox.Show("Dados inválidos", "ERRO", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If
    End Sub

Neste código temos a rotina validaDados() que verifica se as informações para o envio do email foram informadas.

A seguir temos o código do método validaDados() :

   Private Function validaDados() As Boolean
        If String.IsNullOrWhiteSpace(txtAssunto.Text) Then
            Return False
        ElseIf String.IsNullOrWhiteSpace(txtDestino.Text) Then
            Return False
        ElseIf String.IsNullOrWhiteSpace(txtMensagem.Text) Then
            Return False
        Else
            Return True
        End If
    End Function

Se os dados foram informados então o método EnviaEmail() chamado passando os parâmetros necessários.

  Private Sub EnviaEmail(Assunto As String, Mensagem As String, Destino As String, ComCopia As String, NomeArquivo As String, 
Nome As String)
        Try
            Dim oApp As Interop.Outlook._Application
            oApp = New Interop.Outlook.Application
            Dim oMsg As Interop.Outlook._MailItem
            oMsg = oApp.CreateItem(Interop.Outlook.OlItemType.olMailItem)
            oMsg.Subject = Assunto
            oMsg.Body = Mensagem
            oMsg.To = Destino
            oMsg.CC = ComCopia
            Dim ArquivoAnexo As String = NomeArquivo
            Dim nomeDestino As String = Nome
            'se informar o nome do arquivo então anexa
            If NomeArquivo <> "" Then
                Dim tamanhoMensagem As Integer = Int(Mensagem.Length)
                Dim oAttachs As Interop.Outlook.Attachments = oMsg.Attachments
                Dim oAttach As Interop.Outlook.Attachment
                oAttach = oAttachs.Add(ArquivoAnexo, , tamanhoMensagem, nomeDestino)
            End If
            'apenas exibe o email ou envia diretamente via outlook
            If chkExibirOutlook.Checked Then
                oMsg.Display()
                MessageBox.Show("O email será aberto no Outlook. para enviar clique no botão Enviar.", Me.Text, MessageBoxButtons.OK, 
MessageBoxIcon.Exclamation)
            Else
                oMsg.Send()
                MessageBox.Show("Email enviado", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            End If
        Catch ex As Exception
            MessageBox.Show("Erro ao enviar o Email " & ex.Message, "ERRO", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

Este código usa o modelo de objetos do OutLook e  criar um objeto do tipo MailItem que representa uma mensagem de email usando o método CreateItem.

Criamos também um novo anexo na coleção Attachments usando o método Add :  oAttachs.Add(ArquivoAnexo, , tamanhoMensagem, nomeDestino)

Precisamos também definir o código no evento CheckedChanged do controle chkAnexo que será acionado quando o usuário marcar para enviar um anexo.

O método .Send envia o email diretamente enquanto o método .Display abre o Outllok e exibe o email preenchido e pronto para enviar.

Neste evento temos o código que permite selecionar um arquivo de anexo :

  Private Sub chkAnexo_CheckedChanged(sender As Object, e As EventArgs) Handles chkAnexo.CheckedChanged
        If chkAnexo.Checked Then
            Dim ofd1 As New OpenFileDialog
            ofd1.InitialDirectory = "C:\dados"
            ofd1.RestoreDirectory = True
            ofd1.ReadOnlyChecked = True
            ofd1.ShowReadOnly = True
            Dim dr As DialogResult = ofd1.ShowDialog()
            If dr = System.Windows.Forms.DialogResult.OK Then
                arquivoAnexo = ofd1.FileName
                txtAnexo.Text = arquivoAnexo
            End If
        End If
    End Sub

Temos também a opção de exibir o Email no Outlook marcando o CheckBox - Exibir no Outlook - conforme mostra o programa em execução na figura abaixo:

Dessa forma fizemos uma abordagem bem simples usando os recursos dos objetos do Outlook para enviar emails via VB .NET.

Pegue o projeto completo aqui :   vbn_OutLook_Email.zip

Aquele que diz: Eu conheço-o (Jesus), e não guarda os seus mandamentos, é mentiroso, e nele não está a verdade.
1 João 2:4

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

     Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti