Envio de email no Java

Qual biblioteca ou api usar para envio de e-mail no Java usando uma conta do Gmail?

Obs:Já usei o JavaMail e não funcionou

Pq não funcionou? O que aconteceu pra não funcionar? específica mais. Eu particularmente não gosto da api do GMAIL

@rodriguesabner

está dando erro de conexão vou postar me código aqui pra voce ver.:

import java.util.Properties;
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;

public class EnviarEmail {

private String emailDestinatario;

private String assunto;
private String msg;

public String getEmailDestinatario() {
    return emailDestinatario;
}

public void setEmailDestinatario(String emailDestinatario) {
    this.emailDestinatario = emailDestinatario;
}

public String getAssunto() {
    return assunto;
}

public void setAssunto(String assunto) {
    this.assunto = assunto;
}

public String getMsg() {
    return msg;
}

public void setMsg(String msg) {
    this.msg = msg;
}

public boolean enviarGmail() {
    boolean retorno = false;
    //Get the session object  
    Properties props = new Properties();
    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 s = Session.getDefaultInstance(props,
            new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {

                    return new PasswordAuthentication("teste@gmail.com", "teste");//email e senha usuário 
                }
            });

    //compose message  
    s.setProtocolForAddress("rfc821", "smtps");
    s.setDebug(true);
    try {
    	
        MimeMessage message = new MimeMessage(s);
        message.setFrom(new InternetAddress("teste@gmail.com"));
        message.addRecipient(Message.RecipientType.TO, new InternetAddress("teste@gmail.com"/*this.emailDestinatario*/));

        message.setSubject("Email de Teste"/*this.assunto*/);
        message.setContent("Email enviado pelo Java"/*this.msg*/, "text/html; charset=utf-8");

        //send message  
        Transport tr;
        tr = s.getTransport("smtp"); //define smtp para transporte
        tr.connect("smtp.gmail.com", "teste@gmail.com", "teste");

        retorno = true;

    } catch (MessagingException e) {
        retorno = false;
        e.printStackTrace();
    }
    return retorno;
} 
}

Mas está dando um erro de conexão recusada sendo que meu firewal eu desativei para ver e está com os parametros do e-mail certo e o acesso a apps menos seguro está ativado

Manda o erro aqui

@Jhonatas_Tomaz você desativou o antivirus? Eu ja tive esse problema algumas vezes, só tive que desativar para funcionar

estou usando o antivírus do windows mesmo só para teste

Esse é o erro:

DEBUG: setDebug: JavaMail version 1.4.4
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL false
220 smtp.gmail.com ESMTP h67sm5805393vka.25 - gsmtp
DEBUG SMTP: connected to host "smtp.gmail.com", port: 465

EHLO Teste
501-5.5.4 HELO/EHLO argument "Teste" invalid, closing connection.
501 5.5.4  https://support.google.com/mail/?p=helo h67sm5805393vka.25 - gsmtp
 HELO Teste
DEBUG SMTP: EOF: [EOF]
javax.mail.MessagingException: [EOF]
at com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:2023)
at com.sun.mail.smtp.SMTPTransport.helo(SMTPTransport.java:1440)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:644)
at javax.mail.Service.connect(Service.java:295)
at javax.mail.Service.connect(Service.java:176)
at envio2.EnviarEmail.enviarGmail(EnviarEmail.java:77)
at envio.principal.main(principal.java:19)

Antes ontem estava dando conexão recusada e agora só está dando este erro

Só um detalhe, você precisa fornecer os dados VÁLIDOS, o Remetente e Destinatário PRECISAM existir.

Eu faço assim:

public static void main(String[] args) {
        new ControleEmail().envioSimples(
                "Jhonatas Tomaz", //Remetente
                "Assunto Daquele Dia", //Assunto
                "Oi, tudo bem?", //Mensagem
                "email@email.com"); //Email do Destinatário (O EMAIL PRECISA SER VALIDO)
    }

    public void envioSimples(String nomeRemetente, String assunto, String mensagem, String destinatario) {
        try {
            ModeloEmail me = new ModeloEmail();
            String host = "smtp.gmail.com";
            String usuario = "seuEmail@gmail.com";
            String senha = "suaSenha";
            String remetente = "seuEmail@gmail.com"; //Pode trocar aqui pela String usuario
            me.setAssunto(assunto);
            me.setMensagem(mensagem);
            boolean sessionDebug = true;

            Properties props = System.getProperties();

            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.host", host);
            props.put("mail.smtp.port", "587");
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.starttls.required", "true");
            props.put("mail.smtp.ssl.trust", "smtp.gmail.com");

            java.security.Security.addProvider(new Provider(host, remetente, senha) {
            });
            Session mailSession = Session.getDefaultInstance(props, null);
            mailSession.setDebug(sessionDebug);
            Message msg = new MimeMessage(mailSession);
            msg.setFrom(new InternetAddress(remetente, nomeRemetente));
            msg.addRecipients(Message.RecipientType.TO, InternetAddress.parse(destinatario));
            msg.setSubject(assunto);
            msg.setSentDate(new Date());
            msg.setContent(mensagem, "text/html;charset=UTF-8");

            Transport transport = mailSession.getTransport("smtp");
            transport.connect(host, usuario, senha);
            transport.sendMessage(msg, msg.getAllRecipients());
            transport.close();

            System.out.println("Enviado com Sucesso");
        } catch (MessagingException ex) {
            //JOptionPane.showMessageDialog(null, "Erro ao enviar email. Você está sem conexão.");
        } catch (UnsupportedEncodingException ex) {
            JOptionPane.showMessageDialog(null, "Destinatário Inválido.");
        }
    }

@rodriguesabner
o Eclipse acusa uma sugestão dizendo que tem que converter a String remetente pra esse metodo que voce colocou:
sendo que importei a classe Provider do próprio java security

o que eu faço?

é só aviso?? se for, pode ignorar

Detalhe, não é pq a IDE tá sugerindo, que tem que fazer, beleza? É só uma sugestão mesmo!!

@rodriguesabner Está está aparecendo o X antes do comando e dizendo invalid arguments

onde ta dando invalid arguments?

java.security.Security.addProvider(new Provider(host, remetente, senha) {});

aqui? Quais argumentos ela sugere?

sim

O erro é esse :

Multiple markers at this line
- The constructor Provider(String, String, String) is undefined
- The serializable class does not declare a static final serialVersionUID field of 
 type long

Ai a sugestão é

change of 'remetente' to 'double'

O que eu faço?o que eu preciso adicionar?

Faz o seguinte então, troca por isso:

            java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
            Session mailSession = Session.getDefaultInstance(props, null);

da onde é essa importação porque está dando erro na hora de fazer a importação. Olha o erro:

com.sun.net.ssl.internal.ssl cannot be resolved to a type

Cara, qual a versão do seu JDK?

o jdk 8.

A classe é importada somente assim

 import com.sun.net.ssl.internal.ssl.*;`

Porém como obtendo o método Provider?

Beleza, então volta pro antigo e coloca esse import:

  import java.security.Provider;

Código

  java.security.Security.addProvider(new Provider(host, remetente, senha) {
            });
  Session mailSession = Session.getDefaultInstance(props, null);