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!