Confirmando Leitura de E-mail com ASP.NET
Leonel Fraga de Oliveira 08/11/2008 12:34

Olá pessoal! E aí, tudo belezinha?

Este artigo, mais com cara de dica, vai tratar de como pegar uma confirmação de leitura de um e-mail enviado por um sistema, porém sem adicionar na mensagem uma solcitação de confirmação de leitura pelo cliente de e-mail do usuário.

Há N formas de fazer isso, vou citar duas delas, porém como vocês verão irão executar os mesmos procedimentos: Link de confirmação e iframe oculto na mensagem.

Porém já quero alertar que ambas as formas têm seus senões: A mensagem poderá ser interpretada pelo provedor (ou cliente de e-mail do usuário) como spam e o mesmo poderá bloquear a execução dos scripts que estarão sendo propostos aqui.

O artigo requer que você já tenha um conhecimento prévio de como enviar e-mail utilizando o .NET Framework (basicamente as classes MailMessage e SMTPMail), portanto, não irei destacar o uso delas.

Como este artigo é mais uma dica e o foco é na lógica do processo, dessa vez não teremos um código funcional de exemplo em nossa página de suporte :-(

Solução 1: Link na página

A solução mais simples é a de colocar um link na página, em que o usuário irá clicar e ao abrir a página no navegador irá ser gravado algum tipo de registro indicando que o usuário leu a mensagem.

Para isso, em primeiro lugar você deverá criar uma página em seu site com alguma mensagem para o usuário. O importante será o seu evento Page_Load. Mas, para a coisa funcionar, você precisará saber qual usuário está abrindo a mensagem, não é?

Supondo que você já tenha uma mailing-list, você deverá passar na querystring desta página alguma coisa para identificar o usuário, e deverá montar um link e colocá-lo no corpo da mensagem.

Como exemplo, vamos compor uma mensagem simples, através de uma classe que retorna uma lista de pessoas e envia uma mensagem padronizada para o usuário.

public void EnviaMailList(List<Usuarios> usuarios)
{
    string pMensagem = "Teste de mensagem padrão, clique no link http://www.meusite.com.br/Mensagem.aspx?m=1&u={0} para confirmar";
    foreach(Usuario u in Usuarios)
    {
        EnviarMensagem(String.Format(pMensagem,u.UsuarioID),u);
    }
}

O exemplo acima varre uma lista qualquer com um mailing qualquer, e temos a variável pMensagem com um link para um arquivo chamado Mensagem.aspx, que irá receber em sua querystring dois parâmetros, sendo o primeiro a mensagem que queremos controlar e o segundo o usuário que irá lê-la.

O String.Format do primeiro parâmetro (a mensagem a ser enviada) do método EnviarMensagem do nosso código irá colocar o ID do usuário no link que o usuário deverá clicar (esse é o problema... dependemos de uma ação do usuário para saber se ele leu a mensagem).

Agora veremos o que deve ser colocado no evento Page_Load da página Mensagem.aspx:

protected void Page_Load(object sender, EventArgs e)
{
    if( (Request.Params["m"] != null) && (Request.Params["u"] != null))
    {
        Newsletter n = new NewsLetter();
        n.ConfirmarLeitura(Request.Params["m"].ToString(),Request.Params["u"].ToString());
    }
}

Outra coisa simples! Primeiramente checamos se há os parâmetros na querystring, e se tiver, disparamos o processo que poderá gravar um registro em uma tabela em BD, por exemplo, indicando qual usuário leu aquela mensagem.

Mas lembre-se do senão: O usuário DEVERÁ clicar no link, além dos outros probleminhas já comentados acima (provedor ou cliente de e-mail achar que é spam, bloquear links, etc).

E não há uma forma "anônima", que não dependa tanto da ação do usuário para eu saber que ele leu a mensagem? Resposta: Há sim, utilizando iFrames (olha ele aí de novo!) na mensagem!

Solução 2: IFrames na mensagem

Para a coisa ficar mais anônima, iremos utilizar a mesma página Mensagem.aspx citada anteriormente, porém dessa vez ela deverá estar em branco. Para isso funcionar, a mensagem DEVERÁ estar em formato HTML, e o senão dessa vez é que o servidor de e-mail ou o cliente de e-mail poderá interpretar isso como uma página maliciosa, além dos outros já citados.
Neste código HTML, devemos colocar um iFrame cujo fonte seja a própria Mensagem.aspx, como segue o exemplo:

public void EnviaMailList(List<Usuarios> usuarios)
{
    string pMensagem = " bla bla bla bla bla...";
    pMensagem +- "<iframe src='link http://www.meusite.com.br/Mensagem.aspx?m=1&u={0}' style='width:0px;height:0px;visibility:hidden; border:0px' />"
    foreach(Usuario u in Usuarios)
    {
        EnviarMensagem(String.Format(pMensagem,u.UsuarioID));
    }
}

Como podemos ver, temos no código HTML da mensagem um iFrame cujo atributo src é a página Mensagem.aspx e ele é invisível para o usuário. Quando a página for aberta no cliente de e-mail, o iframe também será aberto e o evento Page_Load de Mensagem.aspx é executado.
Outra dica, é definir a mensagem principal na própria página Mensagem.aspx, ou seja, a mensagem na verdade irá vir de um ambiente externo (seu servidor web), e enviando somente o iframe e algumas instruções de "caso não consiga visualizar esta mensagem clique aqui..." para o usuário.

A não ser pelos senões, creio que estas soluções são bem simples e funcionais :-)

Um abraço!

Leonel Fraga de Oliveira Leonel Fraga de Oliveira é formado em Processamento de Dados na Faculdade de Tecnologia de São Paulo (FATEC-SP - 2002) e anteriormente em Técnico em Eletrônica, pela ETE Professor Aprígio Gonzaga (lá em 1999).
Atualmente trabalha como Analista de Sistemas na Prefeitura Municipal de São Caetano do Sul - SP
Tem como hobbies DJing (também trabalha como DJ freelancer) e ciclismo, além da manutenção dos sites NeoMatrix Light e NeoMatrix Tech.
Gosta de música eletrônica, tecnologia, cinema (super fã de Jornada nas Estrelas), gastronomia e outras coisas mais.


Compartilhe nas redes sociais

   

Deixe seu comentário

comments powered by Disqus