Confirmando Leitura de E-mail com ASP.NET
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.
1: public void EnviaMailList(List<Usuarios> usuarios)
2: {
3: string pMensagem = "Teste de mensagem padrão, clique no link http://www.meusite.com.br/Mensagem.aspx?m=1&u={0} para confirmar";
4: foreach(Usuario u in Usuarios)
5: {
6: EnviarMensagem(String.Format(pMensagem,u.UsuarioID),u);
7: }
8: }
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:
1: protected void Page_Load(object sender, EventArgs e)
2: {
3: if( (Request.Params["m"] != null) && (Request.Params["u"] != null))
4: {
5: Newsletter n = new NewsLetter();
6: n.ConfirmarLeitura(Request.Params["m"].ToString(),Request.Params["u"].ToString());
7: }
8: }
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:
1: public void EnviaMailList(List<Usuarios> usuarios)
2: {
3: string pMensagem = " bla bla bla bla bla...";
4: pMensagem +- "<iframe src='link http://www.meusite.com.br/Mensagem.aspx?m=1&u={0}' style='width:0px;height:0px;visibility:hidden; border:0px' />"
5: foreach(Usuario u in Usuarios)
6: {
7: EnviarMensagem(String.Format(pMensagem,u.UsuarioID));
8: }
9: }
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!
0 comentários:
Postar um comentário