Javamail no Tomcat 6

Olá Pessoal,

Antes de abrir este novo tópico procurei muito na net uma solução, fiz vários testes e infelizmente não consegui.

Estou executando o seguinte código:

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendMail {

	private String mailSMTPServer;
	private String mailSMTPServerPort;

	public SendMail() {
		mailSMTPServer = "smtp.gmail.com";
		mailSMTPServerPort = "465";
	}

	public SendMail(String mailSMTPServer, String mailSMTPServerPort) {
		this.mailSMTPServer = mailSMTPServer;
		this.mailSMTPServerPort = mailSMTPServerPort;
	}

	public void sendMail(String to, String subject, String message)
			throws Exception {

		Properties props = new Properties();
		props.put("mail.transport.protocol", "smtp");
		props.put("mail.smtp.starttls.enable", "true");
		props.put("mail.smtp.host", mailSMTPServer);
		props.put("mail.smtp.auth", "true");
		props.put("mail.smtp.user", xxxx@gmail.com);
		props.put("mail.debug", "true");
		props.put("mail.smtp.port", mailSMTPServerPort);
		props.put("mail.smtp.socketFactory.port", mailSMTPServerPort);
		props.put("mail.smtp.socketFactory.class",
				"javax.net.ssl.SSLSocketFactory");
		props.put("mail.smtp.socketFactory.fallback", "false");

		SimpleAuth auth = null;
		auth = new SimpleAuth("xxxx@gmail.com", "xxxxx");

		Session session = Session.getDefaultInstance(props, auth);
		session.setDebug(true);

		Message msg = new MimeMessage(session);

		try {
			msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
			msg.setFrom(new InternetAddress(from));
			msg.setSubject(subject);
			msg.setContent(message, "text/plain");

		} catch (Exception e) {
			System.out.println(">> Erro: Completar Mensagem");
			e.printStackTrace();
		}

		Transport tr;
		try {
			tr = session.getTransport("smtp");
			tr.connect(mailSMTPServer, "xxxx@gmail.com",
					"xxxxx");
			msg.saveChanges();
			tr.sendMessage(msg, msg.getAllRecipients());
			tr.close();
		} catch (Exception e) {
			System.out.println(">> Erro: Envio Mensagem");
			e.printStackTrace();
		}
	}
}

class SimpleAuth extends Authenticator {
	public String username = null;
	public String password = null;

	public SimpleAuth(String user, String pwd) {
		username = user;
		password = pwd;
	}

	protected PasswordAuthentication getPasswordAuthentication() {
		return new PasswordAuthentication(username, password);
	}
}

Através de uma classe Main e envia o e-mail com sucesso. Porém ao chamar esse método através do contexto (Tomcat 6) não funciona.

Após ler a documentação do Tomcat 6, vi que deveria fazer uma chamada JNDI para enviar o e-mail e fiz as seguintes alterações:

1- Incluir no web.xml da minha aplicacao:

Session Mail mail/Session javax.mail.Session Container

2 - Incluir em TomcatHome/lib/ as libs do javamail (activation.jar e mail.jar)

3 - Incluir em TomcatHome/conf/context.xml

4 - Alterar minha classe de envio de email para:

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.naming.Context;
import javax.naming.InitialContext;

public class SendMail {

	private String mailSMTPServer;
	private String mailSMTPServerPort;

	public SendMail() {
		mailSMTPServer = "smtp.gmail.com";
		mailSMTPServerPort = "465";
	}

	public SendMail(String mailSMTPServer, String mailSMTPServerPort) {
		this.mailSMTPServer = mailSMTPServer;
		this.mailSMTPServerPort = mailSMTPServerPort;
	}

	public void sendMail(String to, String subject, String message)
			throws Exception {

		Context initCtx = new InitialContext();
		Context envCtx = (Context) initCtx.lookup("java:comp/env");
		Session session = (Session) envCtx.lookup("mail/Session");

		Message msg = new MimeMessage(session);

		try {
			msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
			msg.setFrom(new InternetAddress("xxxxx@gmail.com"));
			msg.setSubject(subject);
			msg.setContent(message, "text/plain");

		} catch (Exception e) {
			System.out.println(">> Erro: Completar Mensagem");
			e.printStackTrace();
		}

		Transport tr;
		try {
			tr = session.getTransport("smtp");
			tr.connect(mailSMTPServer, "xxxxx@gmail.com", "xxxxx");
			msg.saveChanges();
			tr.sendMessage(msg, msg.getAllRecipients());
			tr.close();
		} catch (Exception e) {
			System.out.println(">> Erro: Envio Mensagem");
			e.printStackTrace();
		}
	}
}

O erro que da agora é o seguinte:

Erro: Envio Mensagem
javax.mail.MessagingException: Exception reading response;
nested exception is:
javax.net.ssl.SSLKeyException: RSA premaster secret error
at com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:1462)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1260)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:370)
at javax.mail.Service.connect(Service.java:275)
at javax.mail.Service.connect(Service.java:156)
at br.com.bhaiyh.framework.modelo.base.util.SendMail.sendMail(SendMail.java:49)

Na teoria fiz tudo certo, porém não tem jeito de funcionar alguém sabe me dizer o que eu devo tentar agora?

Muito Obrigado.

Olá. Não cheguei a analizar o seu código a fundo.
Estou anexando um projeto exemplo usando tomcat.

Espero ter ajudado.

[EDITANDO]
No construtor da classe JavaMail, você deve alterar o usuário e a senha.

Funcionouuuu moçada. :smiley:

Bom exatamente não sei dizer o que fez funcionar, mais vou deixar registrado aqui o que foi feito para ajudar alguém num futuro.

Nos meus testes de envio eu instalei o JVM 6u22 e o JVM5u22, também estava com o Tomcat-5.5.31 e Tomcat-6.0.24. Após tentar de várias maneiras resolvi remover as JVMs e o os Tomcats. Pois bem, instalei o JVM 6u23 e o Tomcat-6.0.29, coloquei as libs activation.jar e mail.jar e resolvi rodar minha aplicação, para minha grata surpresa funcionou.

Resumindo não utilizei JNDI para concetar ao e-mail, ficando assim:

public class EmailUtil {

	public static final String SERVIDOR_DE_EMAIL = "smtp.gmail.com";

	public static final int SERVIDOR_PORTA = 587;

	public static final String REMETENTE_EMAIL = "XXXXX@gamil.com";

	public static final String REMETENTE_SENHA = "XXXXX";

	public static void enviarEmail(String emailPara, String tituloEmail,
			String mensagemEmail) throws Exception {

		Email email = new HtmlEmail();

		email.setSmtpPort(SERVIDOR_PORTA);
		email.setAuthenticator(new DefaultAuthenticator(REMETENTE_EMAIL,
				REMETENTE_SENHA));
		email.setDebug(true);
		email.setHostName(SERVIDOR_DE_EMAIL);
		email.getMailSession().getProperties().put("mail.smtps.auth", "true");
		email.getMailSession().getProperties().put("mail.debug", "true");
		email.getMailSession().getProperties()
				.put("mail.smtps.port", SERVIDOR_PORTA);
		email.getMailSession().getProperties()
				.put("mail.smtps.socketFactory.port", SERVIDOR_PORTA);
		email.getMailSession()
				.getProperties()
				.put("mail.smtps.socketFactory.class",
						"javax.net.ssl.SSLSocketFactory");
		email.getMailSession().getProperties()
				.put("mail.smtps.socketFactory.fallback", "false");
		email.getMailSession().getProperties()
				.put("mail.smtp.starttls.enable", "true");
		email.setFrom(REMETENTE_EMAIL, "XXXXX");
		email.setSubject(tituloEmail);
		email.setMsg(mensagemEmail);
		email.addTo(emailPara);
		email.setTLS(true);
		email.setSSL(true);
		email.send();
	}
}

Agora. Será que a solução foi a nova versão da JVM? do Tomcat?

Obrigado.