Envio de email no Java

37 respostas
java
Jhonatas_Tomaz

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

37 Respostas

rodriguesabner

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

Jhonatas_Tomaz

@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("[email removido]", "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("[email removido]"));
        message.addRecipient(Message.RecipientType.TO, new InternetAddress("[email removido]"/*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", "[email removido]", "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

rodriguesabner

Manda o erro aqui

Mike

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

Jhonatas_Tomaz

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

Jhonatas_Tomaz

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

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

rodriguesabner

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 removido]"); //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 = "[email removido]";
            String senha = "suaSenha";
            String remetente = "[email removido]"; //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.");
        }
    }
Jhonatas_Tomaz

@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?

rodriguesabner

é só aviso?? se for, pode ignorar

rodriguesabner

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

Jhonatas_Tomaz

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

rodriguesabner

onde ta dando invalid arguments?

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

aqui? Quais argumentos ela sugere?

Jhonatas_Tomaz

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?

rodriguesabner

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);
Jhonatas_Tomaz

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
rodriguesabner

Cara, qual a versão do seu JDK?

Jhonatas_Tomaz

o jdk 8.

A classe é importada somente assim

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

Porém como obtendo o método Provider?

rodriguesabner

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);
Jhonatas_Tomaz

Porém da erro

tem alguma outra coisa que posso fazer?

rodriguesabner

Cara, manda o código todo aqui, eu tenho ele desse jeito e não dá nenhum erro. Manda aqui o fonte todo, por favor.

Jhonatas_Tomaz

@rodriguesabner
o código é esse do post acima

rodriguesabner

Eu sei, mas manda os imports também

T

O import utilizado é no JDK 8:
import java.security.Security;
e na linha onde está o Security.addPovider alterei para:
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
Funcionou para mim desta forma com o código compartilhado pelo @rodriguesabner.
@rodriguesabner obrigado por compartilhar seu código.

Jhonatas_Tomaz

Esses são os meu imports:

import java.io.UnsupportedEncodingException;
import java.security.Provider;
import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.swing.JOptionPane;

Quando eu tenho fazer igual está nesse post

aprece o X e aprece isso aqui:

Multiple markers at this line
- Access restriction: The constructor 'Provider()' is not API (restriction on required library 'C:
 \Program Files\Java\jre1.8.0_151\lib\jsse.jar')
- Access restriction: The type 'Provider' is not API (restriction on required library 'C:\Program 
 Files\Java\jre1.8.0_151\lib\jsse.jar')

E aprece isso nas sugestões

T

Só por curiosidade o seu JDK 8 está instalado neste computador?

rodriguesabner

Comigo acontecia isso quando eu instalei o JDK 13 na máquina e precisei fazer algumas alterações.

Tive que mudar isso:

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

JDK 8 Imports:

import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

JDK 13 imports:

import java.io.UnsupportedEncodingException;
import java.security.Provider;

import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
Jhonatas_Tomaz

sim

Jhonatas_Tomaz

ainda continua aparecendo o erro:

O que faço?vou ter que mudar de jdk?

rodriguesabner

Cara, manda o seu código, vc ainda não mandou. OK que é igual, mas manda aí.

Jhonatas_Tomaz

Ok então. Esse é meu código:

package envio2;

import java.io.UnsupportedEncodingException;
import java.security.Provider;
import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.swing.JOptionPane;
import java.security.Security;
//import java.security.Security;
public class ControleEmail {
public static void main(String[] args) {
    new ControleEmail().envioSimples(
            "Meu usuário", //Remetente
            "Assunto Daquele Dia", //Assunto
            "Oi, tudo bem?", //Mensagem
            "[email removido]"); //Email do Destinatário (O EMAIL PRECISA SER VALIDO)
}

public void envioSimples(String nomeRemetente, String assunto, String mensagem, String destinatario) {
    try {
        Email me = new Email();
        String host = "smtp.gmail.com";
        String usuario = "meu [email removido]";
        String senha = "minhasenha";
        String remetente = "[email removido]"; //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");
       
        //Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        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

Vamos lá, desinstalei o JDK 13 do meu pc:

Me deu esse erro:

Comentei a linha errada e funcionou


Com o JDK 13 instalado:
image

1
image

2
image

3
image

Peguei o seu código, fiz as alterações e funcionou normal…

Jhonatas_Tomaz

@rodriguesabner Precisa do protocolo oAuth 2 para enviar email para o gmail?
porque na documentação do javamail está isso:

https://javaee.github.io/javamail/FAQ#gmail
https://javaee.github.io/javamail/OAuth2

rodriguesabner

Não é necessário, o email é enviado normalmente com o código que passei. Você conseguiu usa-lo?

Jhonatas_Tomaz

não está dando
Eof e messagemException

rodriguesabner

Você conseguiu usar o código?? Parou de dar aquele bug?

que?

Jhonatas_Tomaz

sim consegui,parrou de dar bug do ssl
Mas está dando o seguinte erro:

javax.mail.MessagingException: [EOF]

Não sei porque está dando isso,já coloquei o ssl e tls e ainda está dando erro

Criado 5 de dezembro de 2019
Ultima resposta 11 de dez. de 2019
Respostas 37
Participantes 4