[RESOLVIDO] Problema usando JavaMail

Bom pessoal, sou novo aqui e também não tenho muita experiência em Java, porém, estou fazendo um projeto e quero que ele envie um e-mail para a pessoa quando ela se cadastrar no sistema. Para isso estou utilizando a biblioteca JavaMail. A seguir estou inserindo a classe que seria responsável por este envio de e-mail e também o erro que está surgindo.

package escambovirtual.model.service;

import java.util.Properties;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 *
 * @author Joao
 */
public class EmailService {

public void sendEmail() {
    Properties props = new Properties();
    /**
     * Parâmetros de conexão com servidor Gmail
     */
    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.smtp.socketFactory.port", "465");
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.port", "465");

    Session session = Session.getDefaultInstance(props,
            new javax.mail.Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("meu_email@gmail.com", "minha_senha");
        }
    });

    /**
     * Ativa Debug para sessão
     */
    session.setDebug(true);

    try {

        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("meu_email@gmail.com")); //Remetente

        Address[] toUser = InternetAddress //Destinatário(s)
                .parse("email_destino@gmail.com");

        message.setRecipients(Message.RecipientType.TO, toUser);
        message.setSubject("Enviando email com JavaMail");//Assunto
        message.setText("Enviei este email utilizando JavaMail com minha conta GMail!");
        /**
         * Método para enviar a mensagem criada
         */
        Transport.send(message);

        System.out.println("Feito!!!");

    } catch (MessagingException e) {
        throw new RuntimeException(e);
    }
}

}

E este é o erro que está surgindo:

HTTP Status 500 - Request processing failed; nested exception is java.lang.RuntimeException: javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465;

type Exception report

message Request processing failed; nested exception is java.lang.RuntimeException: javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465;

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.RuntimeException: javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465;
nested exception is:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

O método ainda não está adaptado para o que eu realmente quero fazer, por isso estou setando o email de destino dentro do próprio método. Mas acredito que desse jeito era pra funcionar.

Obs.: adicionei as bibliotecas mail.jar e activation.jar ao projeto.

Altera:

props.put("mail.smtp.host", "smtp.gmail.com");

Para:

props.put("mail.smtp.host", "smtp.googlemail.com");

O gmail tem uma proteção quanto a envio de e-mails por programas desconhecidos, tens que entrar nas configurações do gmail e desbloquear.

não sei se é por isto teu erro, mas provavelmente vais ter de fazer isto também.

veja se não recebeu um e-mail na conta do remetente a respeito da tentativa de envio.

Olá, mesmo fazendo essa alteração o erro persiste.

Mas obrigado!

Sim, antes mesmo de ter realizado a publicação aqui, enquanto eu pesquisava descobri que era provável que fosse necessário mudar essa configuração, mas mesmo mudando essa configuração não vai.

Mas obrigado!

Usa o apache commons, mais facil com mais recursos:

Dependência:

<dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-email</artifactId>
            <version>1.3.3</version>
        </dependency>

Exemplo de envio:

HtmlEmail htmlEmail = new HtmlEmail();
htmlEmail.setHtmlMsg("<h1>ola mundo</h1>");
htmlEmail.addTo("emaildestinatario@email.com");
htmlEmail.setSubject("Assunto");
htmlEmail.setFrom("seuemail@gmail.com");
htmlEmail.setHostName("smtp.googlemail.com");
htmlEmail.setSmtpPort(465);
htmlEmail.setTLS(true);
htmlEmail.setSSL(true);                
htmlEmail.setAuthenticator(new DefaultAuthenticator("usuario", "senha"));            
htmlEmail.send();

Você está realizando uma conexão ssl, e para isso é necessário que o Java possa validar o certificado que o servidor está retornando. Você está utilizando um Java atualizado?

Sim, estou utilizando o Java 8, em sua última atualização. As bibliotecas mail.jar e activation.jar também estão atualizadas.

Bom, venho até aqui dizer como estou prosseguindo.

Certifiquei que tanto o Java quanto as bibliotecas estão nas suas versões mais atualizadas, e por algum motivo, quando o método sendEmail é chamado, a aplicação Web fica carregando e não acontece mais nada. Depurando o código, certifiquei que está passando por todos os passos do método, inclusive o Transport.send(message); que logo após faz a autenticação com o email e a senha, a partir deste ponto não acontece mais nada com a aplicação.

Vou ver se meu professor pode me ajudar durante a aula, caso seja solucionado, volto aqui e compartilho com vocês. Porém, se mais alguém tiver alguma sugestão eu fico grato.

Olá,

Veja:

Atenciosamente.

Olá,

Foi exatamente esse tutorial que segui, porém ao executar o método a aplicação web fica apenas carregando e não acontece mais nada, muito menos o email é enviado.

Olá,

Fiz o seguinte projeto Java baseado em Maven: https://goo.gl/UiSBfc

Executei com sucesso no meu notebook.

Se seguiu as referências contidas dentro do arquivo Main.java e não está em ambiente de rede corporativa (escola/faculdade/universidade ou empresa) então deverá conseguir também, caso contrário muito provavelmente as restrições da rede de computadores desses locais está bloqueando o envio do seu e-mail. E nesse caso, deve solicitar autorização e esclarecimentos do administrador da rede.

Enviei e-mail para mim mesmo utilizando essa aplicação, abaixo o e-mail que recebi (em formato puro):

Return-Path: <cviniciusm@gmail.com>
Received: from rf511sd6br ([189.6.18.5])
        by smtp.gmail.com with ESMTPSA id x3sm5594677qkb.32.2016.07.27.16.06.51
        for <cviniciusm@gmail.com>
        (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128);
        Wed, 27 Jul 2016 16:06:52 -0700 (PDT)
Date: Wed, 27 Jul 2016 20:06:48 -0300 (BRT)
From: cviniciusm@gmail.com
To: cviniciusm@gmail.com
Message-ID: <1066516207.0.1469660808230.JavaMail.cviniciusm@rf511sd6br>
Subject: TestMail
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

This is a test mail ... :-)

Atenciosamente.

Olá,

Se você usar as seguintes linhas de código no seu projeto, então o administrador de rede agradece:

email.setSmtpPort(587);
email.setStartTLSRequired(true);

Atenciosamente.

Olá,

Sua solução usando o Commons resolveu o meu problema.

Muito obrigado!