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).