Javamail - Como faço para saber quando um email não foi enviado ou deu Erro?

seguinte galera eu tenho um programa que envia email que fiz para um amigo, e ele agora me pediu para que eu controle no programa os emails que foram enviados com sucesso, os que deram erro de envio e os que não foram enviados e se possível saber se o cara que recebeu o email leu o email ou deletou.Eu pesquisei bastante e descobri que no javamail vc pode incluir eventos para monitorar as mensagens enviadas, beleza só que quando adiciona os eventos eles não me mostram os emails com erro nem as outras coisas que quero saber, será que alguém já fez algo parecido ??? o código ta abaixo porfavor me ajudem resolvendo isso será últim pra todo mundo esse projeto.

import java.util.Properties;
import javax.mail.;
import javax.mail.event.TransportEvent;
import javax.mail.event.TransportListener;
import javax.mail.internet.
;
import java.io.*;
public class Class1 {

public static void main(String[] args) {
	/* Envia email com uma página html no corpo do email */
	String line1 = null;
	String smtpHost = "mail.weba.com.br";// args[0];
	String to = ""; // Argumento do arquivo txt de emails;
	String from = "odontologia@weba.com.br"; // args[1];
	String contentType = "text/html";
	String htmlFile = "C:/eclipse-SDK-3.2-win32/workspace/NewLaster/inco25.htm"; // arg2[2]
	String EmailTxt = "C:/eclipse-SDK-3.2-win32/testeemail.txt"; //args[3].toString();
	String LogArqEnv = "C:/eclipse-SDK-3.2-win32/workspace/NewLaster/LogArqEnv.txt";// args[4] arquivo de log dos emails enviados

// String EmailTxt = “C:/eclipse-SDK-3.2-win32/workspace/NewLaster/teste.txt”; //args[3].toString();
String msg = “”;
int Contador = 0;

	// Get properties object
	Properties props = System.getProperties();
	
	// Define SMTP host property
	props.put("mail.smtp.host", smtpHost);
	props.put("mail.smtp.auth", "true");
	props.put("mail.smtp.port", "25");
    
	try {
		//Criando o arquivo de log de emails gerados
		FileWriter writer = new FileWriter(LogArqEnv); 
		PrintWriter saida = new PrintWriter(writer);
		
		//Lendo arquivo de emails
		FileReader fr1 = new FileReader(EmailTxt);
		BufferedReader br1 = new BufferedReader(fr1);
		while ((line1 = br1.readLine()) != null) {
			  to = line1; //Recupera a linha a que contém o email a ser enviado 
		      Contador ++;

// Get a session
Session session = Session.getDefaultInstance(props);

			// Create a new message object
			MimeMessage message = new MimeMessage(session);

			message.setText(msg.toString(), "ISO-8859-1");
			message.setSubject("Boletim INC");
			message.setFrom(new InternetAddress(from,"WF - INC"));
			message.addRecipient(Message.RecipientType.TO,
					new InternetAddress(to));

// le o HTML e preapara ele para envio
int conta = 0;
String line = null;
FileReader fr = new FileReader(htmlFile);
BufferedReader br = new BufferedReader(fr);
while ((line = br.readLine()) != null) {
if (conta == 0)
msg = “Prezado Sr. Kleber”;
else
msg += line;

				conta++;
			}
			
			// adiciona o contéudo a mensagem 
			message.setContent(msg, contentType);

// Define transport
// obtém uma instância do objeto que vai fazer o envio da mensagem, setando
// o protocolo utilizado
Transport transport = session.getTransport(“smtp”);

			TransportListener listener = new TransportListener() {
		       public void messageDelivered(TransportEvent e) {
		    	   Address[] valid = e.getValidSentAddresses() ;
		    	   System.out.println("Email entregue com sucesso " + valid[0]);
		       }
		       public void messageNotDelivered(TransportEvent e) {
		    	   Address[] invalid = e.getInvalidAddresses() ;
		    	   System.out.println("Endereço de Email incorreto " + invalid[0]);
		       }
		       public void messagePartiallyDelivered(TransportEvent e) {
		    	   Address[] invalid2 = e.getValidUnsentAddresses() ;
		    	   System.out.println("Endereço Correto de Email mais o Email não foi recebido " + invalid2[0]);
		       }
		     };
		     transport.addTransportListener(listener);

// faz a conexao com o host
transport.connect(smtpHost, 25, “odontologia@webforma.com.br”, “cowf”);

			transport.sendMessage(message, message.getAllRecipients());
			
		}
	}catch (IOException ioe) {
			System.err.println(ioe.getMessage());
		}
	catch (MessagingException mex){
		System.err.println(mex.getMessage());
	}
		msg = "";
	}
	//Fecha os arquivos usados para gravar o log do emails enviados.
	//saida.println("Total de E-mails Enviados:" + Contador);  // grava o email no arquivo de saída
	//saida.close(); 
	//writer.close(); 
	//System.out.println("Total de E-mails Enviados:" + Contador);
	//} catch (Exception e) {
	//	System.err.println(e.getMessage() + e.getCause()
	//			+ e.getLocalizedMessage() + e.getStackTrace());
	//}
//}

}

Sugiro você estudar um pouco sobre o protocolo SMTP e de como funciona um SMTP server. Não tenho material para indicar.

Resumindo: alguns tipos de erros e eventos sobre o e-mail tem como resposta do servidor destino (não é o SMTP server) um e-mail de retorno com um código de erro no texto/subject. Ou seja, teria que monitorar a caixa postal do remetente para saber que tipo de evento ou erro ocorreu. Ou seja, a coisa toda é totalmente assincrona. Não é no momento que se conecta no SMTP server que se detecta estes erros e eventos.

Sem contar que (embora violando o protocolo SMTP) alguns servidores, por motivos de segurança, não indicam se um determinado endereço de destinatário é inválido (ou seja, inexistente).
É para evitar aqueles spams onde o spammer tenta enviar emails para "dick1@aol.com", "dick2@aol.com" etc. e checa se algum endereço é válido pela resposta do protocolo SMTP.

Ei Marcelo, tô com a mesma necessidade sua, vc conseguiu resolver isso ai?

Opa Marcelo.
Estou encontrando a mesma necessidade que a sua. Assim que conseguir algo, me avise, por favor?
Valeu.

Att

Esse negócio de tentar saber o que que o usuário fez com a sua mensagem na caixa de entrada dele me parece meio absurdo. Acho que só instalando um spyware que fique monitorando os browsers e organizadores de email do usuário ou tendo acesso à conta de email do usuário receptor. E tudo isso que citei para mim são práticas ilegais.

Inté.