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