Como faço para controlar se um email foi bem-sucedido entre milhares (IIS 6, .NET 3.5)

4

Eu quero saber se um email enviado a um usuário foi bem-sucedido ou não.

Eu tentei examinar os logs do SMTP e parece não haver nenhuma maneira de vincular as solicitações do servidor com as respostas do servidor. Portanto, se eu obtiver um erro 550 e a tentativa de endereço não for incluída na resposta, não tenho como saber qual endereço ou qual solicitação ele falhou.

Procurando uma solução nos registros ou no código que envia.

    
por Micah B. 26.01.2011 / 18:07

2 respostas

7

Alguns antecedentes:
Um servidor configurado corretamente deve informar imediatamente se o e-mail não será entregue.

iirc: Originalmente, os servidores SMTP faziam isso, mas era considerado um buraco de segurança revelar se um usuário existia no sistema ou não, então eles começaram a aceitar todos e, em seguida, saltando. Mas o bouncing é usado por spammers para fornecer spam "devolvendo-o de volta ao alvo de spam". Então agora estamos de volta a recusar o e-mail imediatamente com base nas regras de revezamento.

Isso significa que, na maioria dos casos, você pode determinar se o email foi entregue ou não. Mas somente se você se comunicar diretamente com o servidor de e-mail dos destinatários. Isso significa que seu aplicativo precisa fazer muito trabalho: pesquisa de MX, conexão TCP a um servidor em potencial lento que pode usar tarpit por isso é muito lento, tempo limite de manuseio, etc. O problema é que você não vai lidar com servidores que estão temporariamente fora do ar muito bem.

Se você enviar o email entregando-o a um servidor de retransmissão (como seu servidor SMTP IIS local ou seu ISP), a única maneira de detectar retornos é definindo o cabeçalho de retorno no email e verificando a conta de rejeição de emails devolvidos. Esta não é uma abordagem incomum. No entanto, pode levar até (e mais) 5 dias para todos os retornos voltarem, dependendo das configurações de nova tentativa nos servidores SMTP da cadeia.

Esse problema geralmente é resolvido simplesmente adicionando url a uma imagem dentro da mensagem. Quando o usuário clica em "baixar conteúdo", a imagem é baixada e você pode confirmar o recebimento. A imagem pode ser link ou pode ser uma página aspx que usa Response.SendFile para enviar uma imagem (você pode querer definir Content-Type em Response.Header também).

    
por 26.01.2011 / 18:23
1

A única maneira que eu conheço é ignorar o servidor SMTP do IIS e enviá-lo diretamente. Você pode pesquisar no Google e encontrar alguns componentes que farão isso por você, e por outro lado, aqui está um link para uma versão TCP bruta :

Isso, obviamente, não significa que a mensagem foi recebida / entregue ou que não foi devolvida. Significa apenas que o SMTP listado nos registros MX aceitou a mensagem. Pode ter destruído, pode ser mais tarde, pode passar para o usuário.

    
por 26.01.2011 / 18:15

Tags