Como enviar um e-mail usando ASP .NET e um servidor SMTP
Neste tutorial vamos aprender como enviar um e-mail numa aplicação Web usando a classe System.Web.Mail, não podia ser mais fácil. :)
Pegando num exemplo práctico, na imagem abaixo está uma página da administração da aplicação Web Thalassa VII.net que permite enviar um e-mail a um utilizador, podem utilizar por exemplo numa página de contactos para que os visitantes do vosso site possam enviar uma mensagem fácilmente ou indo mais além, porque não fazer a vossa aplicação enviar uma mensagem ao webmaster sempre que acontece um erro?

1) Mãos ao trabalho
A técnica que vou descrever utiliza a classe System.Web.Mail como já foi referido, vamos também usar a System.Text no nosso exemplo.
Exemplo 1) Uma página simples para enviar um e-mail
Criem uma nova aplicação Web, vão adicionando textboxes e label’s conforme o exemplo abaixo, eu dei um nome personalizado às textboxes para facilitar a sua compreensão, por ordem de cima para baixo temos:
- txt_destino;
- txt_cc;
- txt_bcc;
- txt_titulo;
- txt_corpo;
- bt_enviar (o botão).

O aspecto do vosso código html deverá ser algo assim do género:
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" Runat="server" Text="Destinatario"></asp:Label><br />
<asp:TextBox ID="txt_destino" Runat="server"></asp:TextBox>
<br />
<asp:Label ID="Label2" Runat="server" Text="CC"></asp:Label><br/>
<asp:TextBox ID="txt_cc" Runat="server"></asp:TextBox>
<br />
<asp:Label ID="Label3" Runat="server" Text="BCC"></asp:Label><br />
<asp:TextBox ID="txt_bcc" Runat="server"></asp:TextBox>
<br />
<asp:Label ID="Label4" Runat="server" Text="Titulo"></asp:Label><br />
<asp:TextBox ID="txt_titulo" Runat="server" Width="294px"></asp:TextBox>
<br />
<asp:Label ID="Label5" Runat="server" Text="Corpo"></asp:Label><br />
<asp:TextBox ID="txt_corpo" Runat="server" TextMode="MultiLine" Width="294px" Height="161px"></asp:TextBox>
<br />
<br />
<asp:Button ID="bt_enviar" Runat="server" Text="Enviar" OnClick="bt_enviar_Click" />
</div>
</form>
</body>
Agora vamos passar ao ficheiro code-behind, no topo do ficheiro só precisamos de colocar as seguintes linhas de código:
Imports System.Text
Imports System.Web.Mail
Ou seja, vamos importar as classes system.text e system.web.mail que possuem as funções necessárias para podermos enviar e-mail.
A seguir, só precisamos de adicionar o seguinte pedaço de código à função que acciona o botão bt_enviar:
Sub bt_enviar_Click(ByVal sender As Object, ByVal e As System.EventArgs)
'MailMessage class
Dim objMM As New MailMessage
'to whom? quem é o destinatário?
objMM.To = txt_destino.Text
'carbon copy ou seja cópia do e-mail
objMM.Cc = txt_cc.Text
'blind carbon copy ou seja cópia anonima do mail
objMM.Bcc = txt_bcc.Text
'Assunto
objMM.Subject = txt_titulo.Text
'Corpo
objMM.Body = txt_corpo.Text
'email do admin -> ver web.config
objMM.From = "toto@mail.com"
'formato do email - texto ou html
objMM.BodyFormat = MailFormat.Text
'prioridade -> High, Low, Normal
objMM.Priority = MailPriority.Normal
'Smtp Server -> ver web.config
SmtpMail.SmtpServer = "mail.netcabo.pt"
Try
'Send method
SmtpMail.Send(objMM)
Catch ex As Exception
Throw ex
End Try
End Sub
Parece muito grande mas vão ver que é bastante simples, vamos começar devagar do topo.
A primeira coisa que fizemos foi declarar um objecto do tipo mailmessage, ou seja, a nossa mensagem de e-mail.
'MailMessage class
Dim objMM As New MailMessage
De seguida, utilizamos os métodos To, Cc, Bcc, Subject e Body para igualarmos o destinatário, titulo, corpo, etc do nosso recém-criado objecto aos que escrevemos nas textboxes.
'to whom? quem é o destinatário?
objMM.To = txt_destino.Text
'carbon copy ou seja cópia do e-mail
objMM.Cc = txt_cc.Text
'blind carbon copy ou seja cópia anonima do mail
objMM.Bcc = txt_bcc.Text
'Assunto
objMM.Subject = txt_titulo.Text
'Corpo
objMM.Body = txt_corpo.Text
Existem ainda outras propriedades do nosso objecto de e-mail que não escrevemos nas textboxes, vamos começar com o remetente. :)
Ao usarmos o método From podemos atribuir o e-mail do remetente:
'email do admin
objMM.From = "admin@toto.net"
Podemos também definir em que formato queremos o e-mail, em texto simples ou html e qual a prioridade.
Não nos podemos esquecer do servidor de SMTP, este é usado para juntamente com a vossa conta de e-mail (remetente) enviar a mensagem.
'formato do email - texto ou html
objMM.BodyFormat = MailFormat.Text
'prioridade -> High, Low, Normal
objMM.Priority = MailPriority.Normal
'Smtp Server -> ver web.config
SmtpMail.SmtpServer = "mail.netcabo.pt"
Por fim, o método Send envia a vossa mensagem de e-mail, se tudo correr bem.
'Send method smtpMail class
SmtpMail.Send(objMM)
Por favor reparem que eu não verifiquei por erros por parte de quem escreve o formulário, isso fica para voçês. ;)
Exemplo 2) Enviar mail cada vez que ocorre um erro
Só testei isto na framework 1.1, basta abrirem o ficheiro Global.asax.vb e no colocar o seguinte código na função Application_Error, não se esqueçam de importar a classe system.web.mail.
Imports System.Web.Mail
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
'' fires when an error occurs
Dim message As String = "<font face=verdana color=red>" _
& "<h4>" & Request.Url.ToString() & "</h4>" _
& "<pre><font color=red>" & Server.GetLastError().ToString() & "</pre>" _
& "</font>"
Response.Write("Ocorreu um erro grave, o nosso laxismo não nos permite corrigir mas vamos arquivar um papel com o acontecimento.")
Dim mail As New MailMessage
mail.From = "toto@somostodos.net"
mail.To = "admin@somostodos.net"
mail.Cc = "admin2@naochateies.net"
mail.Subject = "Site XPTO: Outro Erro"
mail.Body = message
mail.BodyFormat = MailFormat.Html
SmtpMail.SmtpServer = "mail.toto.pt"
SmtpMail.Send(mail)
Server.ClearError()
End Sub
Assim, qualquer exception não tratada será reportada por e-mail a quem voçes quiserem, podemos também redireccionar o utilizador para outra página onde se trata os erros. Nota: estamos a tratar os erros a nível da aplicação se for desejável podemos também tratar página a página criando uma função do tipo:
Sub Page_Error(sender As Object, e As EventArgs)
…
End Sub
O fim. Por hoje é tudo, desculpem lá se está um pouco trapalhão.
Se tiverem alguma dúvida, sugestão, ameaça ou dinheiro que queiram deitar fora não hesitem em me contactar.
Pedro Sousa
http://pedro.thalassavii.net