Criando um formulário de registro com ativação vai email.


Ao navegar pela web , com certeza você já entrou em sites que para conceder acesso solicitam o preenchimento de um formulário de registro. Muitos sites mantêm esta funcionalidade (alguns com extensos e irritantes forms..). Em alguns sites após você preencher o form um email é enviado para você, e, para que o registro esteja ativo você deverá responder ao email enviado.

Este procedimento tem como objetivo identificar o usuário e sua procedência e assim impedir que usuários mal intencionados participem das atividades oferecidas pelo site (geralmente fóruns , listas de discussão , etc...)

Neste artigo eu vou mostrar como você pode implementar um formulário de registro de usuário com ativação via email em páginas ASP.NET.

Para poder criar e executar os scripts deste artigo você vai precisar dos seguintes recursos:

Nota: o campo chave é uma chave primária e portanto não permite duplicação de valor.

Vou usar um banco de dados chamado Senhas.mdb com uma tabela chamada Membros com a estrutura acima.

Nosso projeto irá conter dois formulários que estão detalhados a seguir:

  1. registro.aspx - arquivo que contém o formulário que solicita a identificação do usuário, grava as informações na tabela e a seguir envia um email para usuário confirmar o registro
  2. ativaregistro.aspx - arquivo que contém o código que faz a ativação do registro do usuário. Isto é feito gravando na tabela Membros o campo ativado com o valor igual a True.

Agora vamos criar no registro.aspx o formulário com os dados que o usuário deverá preencher. O código do formulário é o seguinte:

Obs: Eu procurei deixar o código o mais limpo possível para você visualizar e entender a utilização dos componentes ASP.NET. Nada impede que você elabore um formulário mais sofisticado e com uma formatação mais 'caprichada'.

<<form Name="registro" runat="server">
<table>
<tr>
  <td align="right">Nome</td>
  <td> <asp:textbox id="chave" runat="server" /></td>
</tr>
<tr>
  <td align="right">Senha</td>
  <td> <asp:textbox id="senha" runat="server" /></td>
</tr>
<tr>
  <td align="right">Email</td>
  <td> <asp:textbox id="email" runat="server" /></td>
</tr>
<td ><asp:button ID="enviar" onclick="doInserir" Text="Submit" runat="server" />

<td ><asp:button ID="limpar" runat="server" Text="Limpar" OnClick="doLimpa" />
</td>
</tr>

 <tr>
<td><asp:label ID="lblmensagem" runat="server" Width="200"></asp:label></td>
</tr>
<tr>
<td><asp:label ID="lblmensagem2" runat="server" Width="200"></asp:label></td>
</tr>
</table>
</form>

Nota: No formulário estamos usando os componentes: TextBox , Label e button.

Perceba que temos duas rotinas vinculadas ao evento Click dos botões de comando , elas estão descritas abaixo:

A seguir vamos mostrar a rotina doInserir :

Sub doInserir(Source as Object, E as EventArgs)
 

dim erro as boolean
erro= false
 

Dim strConn as String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:/dados/senhas.mdb"
Dim MySQL as string = "Insert into MembrosForum (chave, senha, email) Values (@chave, @senha, @email)"

 

Dim MyConn as New OleDbConnection(strConn)
Dim Cmd as New OleDbCommand(MySQL, MyConn)

 

With Cmd.Parameters
   .Add(New OleDbParameter("@chave", chave.text))
   .Add(New OleDbParameter("@senha", senha.text))
   .Add(New OleDbParameter("@email", email.text))
End With

 

MyConn.Open()

 

try
   cmd.ExecuteNonQuery()
Catch ex as Exception
   erro = true
End try
 

MyConn.Close
if erro then
   lblmensagem.text="O nome informado já existe, tente outra identificação para o usuário."
   erro = false
else
   lblmensagem.text ="Registro realizado com sucesso.!"
   lblmensagem2.text ="Um email esta sendo enviado para você. Para ativar o seu registro apenas responda o email enviado."
   doEmail
End if
End Sub

Obs: Para trabalhar com banco de dados Access devemos importar os namespces:

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDB" %>

O código recebe os dados que o usuário informou e grava no banco de dados via instrução SQL :

"Insert into MembrosForum (chave, senha, email) Values (@chave, @senha, @email)"

Se o nome para o usuário já existir na base de dados ocorrerá um erro. O erro é capturado e exibimos uma mensagem ao usuário no componente Label inserido no formulário.

Se a gravação dos dados for realizada com sucesso invocamos a rotina doEmail que envia um email para o usuário informando do registro e solicitando a resposta para ativação do registro.

O código da rotina doLimpa é dado abaixo: Ele apenas atribui um valor vazio as caixa de texto.

Sub doLimpa(Source as Object, E as EventArgs)
  chave.text=""
  senha.text=""
  email.text=""
End Sub

O código da rotina doEMail é dado logo a seguir: Ela monta a mensagem de email para enviar o usuário. Para poder usar este recurso em páginas ASP.NET teremos que importar o namespace : System.Web.Mail.(<%@ Import Namespace="System.Web.Mail" %>)

Sub doEmail()


Dim objMail as New MailMessage


  objMail.To=email.text
  objMail.FROM="macoratti@yahoo.com"
  objMail.SUBJECT="Registro no - Forum Visual Basic - JcmSoft"
  objMail.BODY="Para ativar o seu registro no Forum - Visual Basic, " & _
  "clique no link abaixo" & vbcrlf & vbcrlf & _
  "http://www.macoratti.mat.br/forum/ativaregistro.aspx?chave=" & chave.text


  objMail.BodyFormat = MailFormat.Text
  SmtpMail.SmtpServer="seu_servidor_smtp"
  SmtpMail.Send(objMail)
End Sub
 

Executando o arquivo registro.aspx no seu navegador teremos o formulário exibido conforme abaixo.

Veja o demo em : http://www.visualbasic.mat.br/forum/registro.aspx

Criando o formulário de ativação de registro

Após o usuário preencher o formulário de registro e clicar em enviar , um email lhe será enviado para (por isto não adianta informar um email que não existe) . Neste Email teremos um link para o arquivo ativaregistro.aspx . Este é o formulário de ativação. O que ele faz ???

O formulário de ativação de registro simplesmente atualiza o campo - ativado - da tabela Membros do banco de dados senhas.mdb. Veja o seu código (arquivo ativaregistro.aspx) abaixo:

<%@ Import Namespace="System.Data.OleDB" %>
<%@ Import Namespace="System.Web.Mail" %>
<%@ Page Language="VB" Debug="true" %>

<!--#include file="header.asp" -->

<html>

<script language="VB" runat="server">

Dim schave as String
Dim retorno as Integer

Sub Page_Load(Source as Object, E as EventArgs)

schave = request.QueryString ("chave")
retorno = 0

Dim strConn as String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\inetpub\wwwroot\dados\senhas.mdb;"

Dim MySQL as string = "Update Membros Set ativado=True where chave='" & schave & "'"

Dim MyConn as New OleDbConnection(strConn)
Dim Cmd as New OleDbCommand(MySQL, MyConn)

MyConn.Open()
retorno = cmd.ExecuteNonQuery()

if retorno > 0 then
    lblaviso.text ="Obrigado !. Seu registro foi concluído com sucesso !."
    lblaviso2.text="Agora você pode usar sua Chave e Senha para ter acesso ao - Fórum Visual Basic - JcmSoft."
    lblaviso3.text="<a href='http://www.visualbasic.mat.br/forum/login.aspx'>Login</a>"
else
    lblaviso.text=" Opa !! . Não foi possível ativar o seu registro. Verifique se sua chave esta correta !"
    lblaviso2.text= "<a href='http://www.visualbasic.mat.br/forum/'>Retorna</a>"
end if

MyConn.Close

End Sub

</script>
<body>

<table width="100%" border="0" cellpadding="1" bgcolor="#FFFFFF">
<tr>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
</tr>
<tr>
<td><center>
<asp:label ID="lblaviso" runat="server" Width="800"> </asp:label>
</center></td>
</tr>
<tr>
<td><center>
<asp:label ID="lblaviso2" runat="server" Width="800"> </asp:label>
</center></td>
<font color="#000000" size="3" face="Arial, Helvetica, sans-serif"></td></font></tr>
<tr>
<td>&nbsp;</td>
</tr>
<tr>
<td width="100%"><center>
<font face="Arial, Helvetica, sans-serif">
<asp:label ID="lblaviso3" runat="server" Width="800"> </asp:label>
</font></center></td>
</tr>
<tr>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
</tr>
</table>
<!--#include file="footer.asp" -->

</body>
</html>

Nota : No código acima eu estou usando os controles Label (3 controles) para exibir as mensagens ao usuário.

A linha de código: retorno = cmd.ExecuteNonQuery() vai executar a atualização do campo conforme definido na instrução SQL : "Update Membros Set ativado=True where chave='" & schave & "'"

O comando ExecuteNonQuery() não retorna registros apenas o número de linhas afetadas pela instrução UPDATE , logo se o retorno for maior que zero exibimos a mensagem pertinente e exibimos o link para fazer o login. Cujo resultado exibimos a seguir:

Não sei se você percebeu , mas eu estou usando uma inclusão de arquivo para o cabeçalho e para o rodapé. Nestes includes eu estou usando os arquivos ASP : header.asp e footer.asp. Como podemos ver não há problema algum usarmos arquivos ASPX e ASP na mesma aplicação.

Nota: Para saber mais sobre arquivos com inclusão do lado do servidor (includes) - leia o artigo : ASP - Usando Server-Side Includes

Boa noite ! e , aguarde mais artigos sobre ASP.NET ...


José Carlos Macoratti