Como eu posso enviar emails no java?

Olá, eu gostaria de saber neste tópico como eu faço para enviar emails no java? Eu já coloquei no meu projeto esta biblioteca, esta, e esta, já tentei todo tipo de exemplo na internet e todos é lançado uma exceção dizendo que não foi possível se conectar ao servidor smtp, alguém pode me explicar como eu faço enviar o email?

Ta aqui um exemplo de envio utilizando o Commons Mail. Caso não funcione, coloque seu código aqui para que possamos verificar o que você está fazendo de errado.

SimpleEmail mail = new SimpleEmail();
mail.setFrom("meuemail@gmail.com", "Meu nome");
mail.setSubject("E-mail exemplo");
mail.setMsg("E-mail de exemplo");
mail.setSSLOnConnect(true);
mail.setAuthentication("meuemail@gmail.com", "minhasenha");
mail.setHostName("smtp.gmail.com");
mail.setSmtpPort(465);
mail.addTo("usuario@gmail.com", "Nome do usuario");
mail.send();
1 curtida

É necessário nome de usuário ou só o endereço de email já funciona?

Tá falando do “mail.addTo”, certo?
Esse método aceita apenas email, se preferir:

1 curtida

Eu estava falando tanto do mail.addTo quanto do mail.setFrom

O mesmo vale para o setFrom.

Provavelmente você já deve ter feito isso, mas é sempre bom reforçar.
Dá uma olhada no fórum, essa dúvida sobre envio de e-mail aparece constantemente e tem inúmeras threads que podem te ajudar:

http://www.guj.com.br/search?q=email%20java

Da uma olhada nos resultados, veja os exemplos, as duvidas dos outros usuários, tente implementar e ai se ainda assim algo não der certo… poste o problema p/ pessoal poder continuar te ajudando a partir do ponto que você “empacou”.

No seu primeiro post você reclamou sobre não conseguir se conectar ao servidor SMTP, então preste muita atenção ao IP e a PORTA e se é necessário conexão segura TTL/SSL ou não.

O Ideal é você testar esses parâmetros todos em um cliente de E-mail, tipo Thunderbird (https://www.mozilla.org/pt-BR/thunderbird/) e se essas configurações SMTP funcionarem, é uma preocupação a menos na sua programação.

E COM CERTEZA, você irá precisar dos dados de autenticação deste SMTP para poder realizar o envio.
A um bom tempo que os servidor não aceitam mais envios sem autenticação.

Abs e bons estudos.

Aproveitando o Tópico tenho 2 duvidas:

  1. quanto cobrar para implementar este método em programa já criado ( tipo atualização)?
  2. nos meus testes o programa esta enviando o email 3 vezes?

botão para enviar:

CommonsMail enviar;
try {
enviar = new CommonsMail();
enviar.enviaEmailSimples();

    } catch (EmailException ex) {
        Logger.getLogger(menuprincipal.class.getName()).log(Level.SEVERE, null, ex);
    } catch (MalformedURLException ex) {
        Logger.getLogger(menuprincipal.class.getName()).log(Level.SEVERE, null, ex);
    }

classe que envia:

public class CommonsMail {

public CommonsMail() throws EmailException, MalformedURLException {
enviaEmailSimples();
//enviaEmailComAnexo();
enviaEmailFormatoHtml();
}
/**

  • envia email simples(somente texto)
  • @throws EmailException
    /
    public void enviaEmailSimples() throws EmailException {
    SimpleEmail email = new SimpleEmail();
    email.setHostName(“smtp.gmail.com”); // o servidor SMTP para envio do e-mail
    email.addTo("contato@xxxxxxxxx.com.br"); //destinatário
    email.setFrom("xxxxxxxxx@gmail.com"); // remetente
    email.setSubject(“Teste email simples”); // assunto do e-mail
    email.setMsg(" Esta é uma mensagem simples de email sem formatação"); //conteudo do e-mail
    email.setAuthentication("xxxxxxxxx@gmail.com",“xxxxxxxx”);
    email.setSmtpPort(465);
    email.setSSL(true);
    //email.setTLS(true);
    email.send();
    JOptionPane.showMessageDialog(null, “email enviado com sucesso!”);
    }
    /
    *
  • envia email com arquivo anexo
  • @throws EmailException
    /
    /public void enviaEmailComAnexo() throws EmailException{
    // cria o anexo 1.
    EmailAttachment anexo1 = new EmailAttachment();
    anexo1.setPath("teste/teste.txt"); //caminho do arquivo (RAIZ_PROJETO/teste/teste.txt)
    anexo1.setDisposition(EmailAttachment.ATTACHMENT);
    anexo1.setDescription("Exemplo de arquivo anexo");
    anexo1.setName("teste.txt");
    // cria o anexo 2.
    EmailAttachment anexo2 = new EmailAttachment();
    anexo2.setPath("teste/teste2.jsp"); //caminho do arquivo (RAIZ_PROJETO/teste/teste2.jsp)
    anexo2.setDisposition(EmailAttachment.ATTACHMENT);
    anexo2.setDescription("Exemplo de arquivo anexo");
    anexo2.setName("teste2.jsp");
    // configura o email
    MultiPartEmail email = new MultiPartEmail();
    email.setHostName("smtp.gmail.com"); // o servidor SMTP para envio do e-mail
    email.addTo("teste@gmail.com", "Guilherme"); //destinatário
    email.setFrom("teste@gmail.com", "Eu"); // remetente
    email.setSubject("Teste -> Email com anexos"); // assunto do e-mail
    email.setMsg("Teste de Email utilizando commons-email"); //conteudo do e-mail
    email.setAuthentication("teste", "xxxxx");
    email.setSmtpPort(465);
    email.setSSL(true);
    email.setTLS(true);
    // adiciona arquivo(s) anexo(s)
    email.attach(anexo1);
    email.attach(anexo2);
    // envia o email
    email.send();
    }
    /
  • Envia email no formato HTML
  • @throws EmailException
  • @throws MalformedURLException
    */
    public void enviaEmailFormatoHtml() throws EmailException, MalformedURLException {
    HtmlEmail email = new HtmlEmail();
    // adiciona uma imagem ao corpo da mensagem e retorna seu id
    URL url = new URL(“http://www.apache.org/images/asf_logo_wide.gif”);
    String cid = email.embed(url, “Apache logo”);
    // configura a mensagem para o formato HTML
    email.setHtmlMsg(" Logo do Apache - “);
    // configure uma mensagem alternativa caso o servidor não suporte HTML
    email.setTextMsg(“Seu servidor de e-mail não suporta mensagem HTML”);
    email.setHostName(“smtp.gmail.com”); // o servidor SMTP para envio do e-mail
    email.addTo("contato@xxxxxxxxx.com.br”, “Destinatario”); //destinatário
    email.setFrom("xxxxxxxx@gmail.com", “Remetente”); // remetente
    email.setSubject(“Teste de email em HTML”); // assunto do e-mail
    email.setMsg(“Teste de Envio de Email no formato HTML, caso tenha recebido este email entrar em contato no tel (xx) xxxx-xxxx”); //conteudo do e-mail
    email.setAuthentication("xxxxxxxxxxx@gmail.com",“xxxxxxxxxxx”);
    email.setSmtpPort(465);
    email.setSSL(true);
    email.setTLS(true);
    // envia email
    email.send();
    JOptionPane.showMessageDialog(null, “email enviado com sucesso!”);
    }
    }
  1. Não sei responder.

Nesse try, você está “chamando” o construtor de CommonsMail; e esse construtor chama os métodos “enviaEmailSimples” e “enviaEmailFormatoHtml”, o que já dá dois emails enviados. E, ainda no try, você chama o método “enviaEmailSimples” outra vez, ou seja, mais 1 email enviado.

Obrigado!

Quanto a questão de quanto cobrar fiz o seguinte, dividi o valor total que cobrei pela quantidade de horas gasta para finalizar o programa e obtive o valor/hora. Estou determinando o tempo que levarei pra desenvolver este módulo para chegar a um valor final (já determinei que o minimo que vou cobrar são 20 horas), também levei em consideração os outros módulos do programa para não cobrar demais.

Olá, eu tentei assim:
`

package pacote;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JDialog;
import javax.swing.JTextField;

import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;

import javax.swing.JButton;

public class Main extends JDialog implements ActionListener{
 JTextField field = new JTextField();
 JButton bt = new JButton("Enviar");
public Main() {
	setLayout(new BorderLayout());
	add(field,BorderLayout.NORTH);
	add(bt,BorderLayout.CENTER);
	bt.addActionListener(this);
	setSize(new Dimension(500,100));
	setTitle("Envia email");
	setVisible(true);
	setLocationRelativeTo(null);
}
public static void main(String[]args){
	new Main();
}
public void actionPerformed(ActionEvent evento) {
	if(evento.getSource()==bt){
		SimpleEmail mail = new SimpleEmail();
		try {
			mail.setFrom("xxxxx@gmail.com");
			mail.setSubject("E-mail exemplo");
			mail.setMsg("E-mail de exemplo");
			mail.setSSLOnConnect(true);
			mail.setAuthentication("xxxx@gmail.com", "xxxx");
			mail.setHostName("smtp.gmail.com");
			mail.setSmtpPort(465);
			mail.addTo("xxxx@gmail.com");
			mail.send();
		} catch (EmailException e) {
			e.printStackTrace();
		}
	}
}
}

`
Porém foi retornado issso:

`

org.apache.commons.mail.EmailException: Sending the email to the following server failed :     smtp.gmail.com:465
at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1421)
at org.apache.commons.mail.Email.send(Email.java:1448)
at pacote.Main.actionPerformed(Main.java:44)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: 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
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1961)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:654)
at javax.mail.Service.connect(Service.java:317)
at javax.mail.Service.connect(Service.java:176)
at javax.mail.Service.connect(Service.java:125)
at javax.mail.Transport.send0(Transport.java:194)
at javax.mail.Transport.send(Transport.java:124)
at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1411)
... 38 more
Caused by: 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
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
at sun.security.ssl.Handshaker.processLoop(Unknown Source)
at sun.security.ssl.Handshaker.process_record(Unknown Source)
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:549)
at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:354)
at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:211)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1927)
... 45 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
at sun.security.validator.Validator.validate(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
... 57 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(Unknown Source)
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
at java.security.cert.CertPathBuilder.build(Unknown Source)
... 63 more

`

Olá,

Outro dia fiz algo semelhante.

Existem aplicativos que simulam um servidor SMTP, assim você pode testar seu código.

No meu caso, criei uma VM com SO Ubuntu e servidor SMTP Postfix, assim testei meu código enviando e-mail para uma caixa postal nesse. Dentro da VM, usei o cliente mutt para ler o conteúdo da caixa postal.

Antes de testar seu código, o teste básico: telnet nomedoservidorsmtp 25 ou telnet ipdoservidorsmtp 25; teste também a porta 587.
Se tiver comunicação então a infraestrutura básica está OK.

Assim você terá mais controle sobre o teste do seu código.

E uma vantagem, quando precisar novamente, você já terá seu próprio servidor configurado e pronto para teste.

Olá,

Veja: https://www.hmailserver.com

E como outro colega disse, é um questionamento muito comum, assim também concordo que o fórum seja pesquisado primeiro antes de colocar sua dúvida.

1 curtida

Olá, eu não sei muito pouco sobre servidores e trabalhar com esse tipo de coisa no java, mais eu já tentei a porta 587 e não funcionou

Me esqueci de um detalhe, eu tenho instalado na minha máquina o wamp server, isso muda alguma coisa?

Não vi erro em seu código. Isso pode ser uma ferramenta de segurança do gmail contra apps não “confiáveis”. Eu sugiro que tente com outro “sistema” de emails (Outlook, Yahoo, etc). Se funcionar, é a ferramenta da qual falei.

se for para o outlook ou yahoo o smtp fica assim smtp.outlook.com, smtp.yahoo.com?

eu tentei assim:
`

SimpleEmail mail = new SimpleEmail();
		try {
			mail.setFrom("xxx@gmail.com");
			mail.setSubject("E-mail exemplo");
			mail.setMsg("E-mail de exemplo");
			mail.setSSLOnConnect(true);
			mail.setAuthentication("xxx@gmail.com", "xxxx");
			mail.setHostName("smtp.outlook.com");
			mail.setSmtpPort(587);
			mail.addTo("xxxx@outlook.com");
			mail.send();
		} catch (EmailException e) {
			e.printStackTrace();
		}

`
e não funcionou


http://www.serversmtp.com/en/smtp-hotmail

Eu devo enviar para o meu email do yahoo ou enviar dele para outro?