VB .NET - Enviando emails para aniversariantes do dia


 Neste artigo vou mostrar como enviar emails para os aniversariantes do dia em uma aplicação Windows Forms usando a linguagem VB .NET.

Este artigo é um artigo para iniciantes na linguagem VB .NET que mostrar como enviar emails com base em um critério de data definido na aplicação.

Os conceitos abordados no exemplo do artigo são :

O recurso mais importante desta aplicação é a consulta que vamos fazer para selecionar os aniversariantes com base no dia e mês atual .

Para isso vamos definir uma consulta SQL Server usando a função DATEPART cuja sintaxe é :   DATEPART ( datepart , data )    Onde :

DatePart - É a parte de data (um valor de data ou hora) para o qual um inteiro será retornado. A seguinte tabela lista válida datepart argumentos. Equivalentes de variável definidos pelo usuário não são válidos.

DatePart Abreviações
ano AA, AAAA
trimestre qq, q
mês mm, m
DAYOFYEAR dy, y
dia dd, d
semana wk, ww
dia da semana data warehouse
hora hh
minuto min, n
segundo ss, s
milissegundos MS
microssegundos MCS
nanossegundos NS
TZoffset TZ
ISO_WEEK isowk, isoww

Data - É uma expressão que pode ser resolvida para um tempo, data, smalldatetime, datetime, datetime2, ou datetimeoffset valor. Pode ser uma expressão, expressão de coluna, variável definida pelo usuário ou cadeia de caracteres literal.

Para o nosso exemplo a consulta definida é :  "SELECT Nome, Email FROM Contatos WHERE DATEPART(DAY, nascimento) = @Day AND DATEPART(MONTH, nascimento) = @Month"

No exemplo vamos acessar a tabela Contatos do banco de dados Cadastro.mdf cuja estrutura é vista a seguir:


Então, ao trabalho...

 

Recursos Usados

Criando o projeto Windows Forms

Abra o VS 2015 Community e crie um novo projeto (File-> New Project) usando a linguagem Visual Basic e o template Windows Forms Application.

Informe um nome a seu gosto. Eu vou usar o nome Vbnet_EmailData;

Selecione o formulário Form1.vb e partir da ToolBox inclua os seguintes controles:

Disponha os controles conforme o leiaute da figura abaixo:

A seguir declare os seguintes namespaces no formulário:

Imports System.Data.SqlClient
Imports System.Configuration
Imports System.Net.Mail
Imports System.IO

Depois inclua uma referência ao namespace System.Configuration no projeto via menu Project-> Add Reference.

Defina no arquivo App.Config a string de conexão com o banco de dados SQL Server:

 .....
 <connectionStrings>
    <add name="conexaoContatos" connectionString="Data Source=.;Initial Catalog=Cadastro;Integrated Security=True"
         providerName="System.Data.SqlClient"/>
  </connectionStrings>
.....

Na janela de propriedades do projeto vamos definir a consulta SQL e o local e nome do arquivo log que vamos gerar no sistema.

Agora vamos definir o código do formulário do projeto.

1- Exibindo dados da tabela Contatos no DataGridView

No evento Click do botão de comando -  Enviar Email - inclua o código abaixo:

 Private Sub btnExibir_Click(sender As Object, e As EventArgs) Handles btnExibir.Click
        Dim connectionString As String =
            ConfigurationManager.ConnectionStrings("ConexaoContatos").ConnectionString
        Dim strSql As String = My.Settings.cmdSql
        Dim dtb As New DataTable
        Using cnn As New SqlConnection(connectionString)
            Using dad As New SqlDataAdapter(strSql, cnn)
                dad.Fill(dtb)
            End Using
            dgvContatos.DataSource = dtb
        End Using
    End Sub

2- Acessando os dados e selecionando os aniversariantes para enviar o email

No evento Click do botão de comando -  Exibir Dados - inclua o código abaixo:

      Private Sub btnEmail_Click(sender As Object, e As EventArgs) Handles btnEmail.Click
        Try
            Dim dt As New DataTable()

            Dim consulta As String = "SELECT Nome, Email FROM Contatos WHERE DATEPART(DAY, nascimento) =
@Day AND DATEPART(MONTH, nascimento) = @Month"

            Dim constr As String = ConfigurationManager.ConnectionStrings("ConexaoContatos").ConnectionString
            Using con As New SqlConnection(constr)
                Using cmd As New SqlCommand(consulta)
                    cmd.Connection = con
                    cmd.Parameters.AddWithValue("@Day", DateTime.Today.Day)
                    cmd.Parameters.AddWithValue("@Month", DateTime.Today.Month)
                    Using sda As New SqlDataAdapter(cmd)
                        sda.Fill(dt)
                    End Using
                End Using
            End Using

            If dt.Rows.Count > 0 Then
                For Each row As DataRow In dt.Rows

                    Dim nome As String = row("nome").ToString()
                    Dim email As String = row("email").ToString()

                    GeraLog("Tentando enviar um email para: " & nome & " email: " & email)

                    Using mm As New MailMessage("seu_email@gmail.com", email)

                        mm.Subject = "Parabéns !!!! Muitas Felicidades..."
                        mm.Body = String.Format("<b>Feliz Aniversário </b>{0}<br /><br />Muitas felicidades neste dia.", nome)
                        mm.IsBodyHtml = True

                        Dim smtp As New SmtpClient()
                        smtp.Host = "smtp.gmail.com"
                        smtp.EnableSsl = True

                        Dim credentials As New System.Net.NetworkCredential()
                        credentials.UserName = "seu_email@gmail.com"
                        credentials.Password = "<SuaSenha>"

                        smtp.UseDefaultCredentials = True
                        smtp.Credentials = credentials
                        smtp.Port = 587
                        smtp.Send(mm)

                        GeraLog("Email enviado com sucesso para : " & nome & " email : " & email)
                    End Using

                Next
            Else
                MessageBox.Show("Não existem aniversariantes para a data de hoje...")
            End If
        Catch ex As Exception
            GeraLog(" " + ex.Message + ex.StackTrace)
            MessageBox.Show("Erro : " + ex.Message + ex.StackTrace)
        End Try
    End Sub

O código do método GeraLog() é visto a seguir:

 Private Sub GeraLog(texto As String)
        Dim path As String = My.Settings.arqLog
        Using writer As New StreamWriter(path, True)
            writer.WriteLine(String.Format(texto, DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt")))
            writer.Close()
        End Using
End Sub

Pegue o projeto completo aqui : VBnet_EmailData.zip

O anjo do Senhor acampa-se ao redor dos que o temem, e os livra.
Salmos 34:7

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 ?

Referências:


José Carlos Macoratti