Melhor maneira de enviar e-mail com Java

35 respostas
G

Galeraa,

dei uma vasculhada aqui na busca, no google. Encontrei e consegui implementar algumas.

Gostaria de saber qual a melhor maneira de enviar email.

Ex. quando o usuario abrir chamado quero mandar email para o analista responsavel e para o usuario que abriu o chamado.

javax.mail é suficiente ??
commons mail ??

agradeço !

35 Respostas

T

Se você quer mandar um email de alerta (bem estúpido, só com texto puro, sem HTML nem nada), então JavaMail é suficiente.

Se você quer deixar todo enfeitado (como se fosse um papel timbrado, em HTML, cheio de figuras etc - você sabe, usuários gostam de firulas) você precisa usar o Commons Email.

G

thingol:
Se você quer mandar um email de alerta (bem estúpido, só com texto puro, sem HTML nem nada), então JavaMail é suficiente.

Se você quer deixar todo enfeitado (como se fosse um papel timbrado, em HTML, cheio de figuras etc - você sabe, usuários gostam de firulas) você precisa usar o Commons Email.

Email de alerta mesmo que eu quero enviar … o unico porem é que eu vou ter que criar varios templates … pois serão varios estilos de email que serão enviados …

se eu quiser apenas colocar o logotipo da empresa no email, ja será necessario o commons mail ???

obrigadooo

R

Acho que de todo jeito é possível só com o java mail puro, mas usar o commons mail irá facilitar muito a sua vida, então não vejo porque não utilizar.

T

Eu já fiz coisas bem complicadas com HTML e JavaMail puro (fui obrigado a isso porque tinha de enfiar tudo isso em um applet) mas digo: só de você pôr uma única figura no seu email ele fica muito mais complicado, e você é obrigado a ler um monte de documentação esquisita para você entender como as coisas funcionam.
Use Commons Email para não ter esse tipo de dor de cabeça.

F

só pra ilustrar o tópico, exemplo simples usando o commons mail + gmail

import java.net.MalformedURLException;
import java.net.URL;

import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.apache.commons.mail.MultiPartEmail;
import org.apache.commons.mail.SimpleEmail;

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("[email removido]", "Guilherme"); //destinatário
		email.setFrom("[email removido]", "Eu"); // remetente
		email.setSubject("Teste -> Email simples"); // 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);
		email.send();	
	}
	
	
	/**
	 * 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("[email removido]", "Guilherme"); //destinatário
		email.setFrom("[email removido]", "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(&quot;&lt;html&gt;Logo do Apache - <img >&lt;/html&gt;&quot;);

		// configure uma mensagem alternativa caso o servidor não suporte HTML
		email.setTextMsg(&quot;Seu servidor de e-mail não suporta mensagem HTML&quot;);
		
		email.setHostName(&quot;smtp.gmail.com&quot;); // o servidor SMTP para envio do e-mail
		email.addTo(&quot;[email removido]&quot;, &quot;Guilherme&quot;); //destinatário
		email.setFrom(&quot;[email removido]&quot;, &quot;Eu&quot;); // remetente
		email.setSubject(&quot;Teste -&gt; Html Email&quot;); // assunto do e-mail
		email.setMsg(&quot;Teste de Email HTML utilizando commons-email&quot;); //conteudo do e-mail
		email.setAuthentication(&quot;teste&quot;, &quot;xxxxx&quot;);
		email.setSmtpPort(465);
		email.setSSL(true);
		email.setTLS(true);
		// envia email
		email.send();
	}
	
	
	/**
	 * @param args
	 * @throws EmailException 
	 * @throws MalformedURLException 
	 */
	public static void main(String[] args) throws EmailException, MalformedURLException {
		new CommonsMail();
	}

}
G

vou usar o commons mesmo …

obrigado ae galera pelas opinioes !!!

legal que este topico ficou com um belissimo exemplo de envio de email …

mto bom !!!

C

olá!

muito bacana isto!

eu usava o JavaMail mas esse commons achei mais prático.

só um detalhe: o envio pelo GMail é lento mesmo? Pq quando vai enviar email mesmo com um texto simples, leva uns 7 segundos e minha conexão não é discada: 1MB.

ou faltou alguma configuração? fiz a mesma coisa do exemplo HTML acima.

vlw!

H

Mas se você estiver utilizando oracle dá pra fazer assim também.

http://emdia.wordpress.com/2008/11/01/enviar-e-mail-via-procedure-oracle/

J

Tentei rodar o exemplo acima e deu esse erro, alguém sabe porque?
Estou usando o eclipse e relacionei o jar no meu Build Path, não estou entendendo.

Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/Message
	at CommonsMail.enviaEmailSimples(CommonsMail.java:24)
	at CommonsMail.&lt;init&gt;(CommonsMail.java:13)
	at CommonsMail.main(CommonsMail.java:117)

a linha 24 é:

SimpleEmail email = new SimpleEmail();

Obrigado!

G

cassitos:
olá!

muito bacana isto!

eu usava o JavaMail mas esse commons achei mais prático.

só um detalhe: o envio pelo GMail é lento mesmo? Pq quando vai enviar email mesmo com um texto simples, leva uns 7 segundos e minha conexão não é discada: 1MB.

ou faltou alguma configuração? fiz a mesma coisa do exemplo HTML acima.

vlw!

é eu tbm achei lentoo … mas eu acho q é por causa da autenticação, ssl … eu testei usando o smtp da uol e foi rapidinho !

C

hummm então está tranqüilo!
estou utilizando GMail temporariamente mesmo.
vlw!

J

Olá…
Mas como ficaria o jsp que envia o arquivo em anexo, pq pelo que entendi o já tem o caminho com o arquivo anexado…eu gostaria de anexar o arquivo.
Abraço

C

olá!
pessoal, estava conseguindo utilizar este commons mail para enviar no format html na boa.

até que hoje tive que anexar arquivo .html também.

o que está ocorrendo é que agora o texto que antes ia no ‘corpo’ do e-mail, está sendo enviado agora como um anexo, chamado ‘noname.html’!

ou seja, está indo o anexo que coloquei na mão e mais este noname que na verdade é o texto que deveria estar sendo exibido no corpo.

só acontece se enviar e-mail com anexo.

alguma idéia?

estou procurando na documentação alguma alternativa mas não encontrei nada até agora.

vlw

F

Boa noite Galera

Eu estou utilizando o codigo postado pelo finotti e apenas enviando o email simples para o servidor smtp.yahoo.com.br e estou com o seguinte erro que segue logo abaixo:

Alguem sabe o motivo do erro?

init:

deps-jar:

compile-single:

run-single:

Exception in thread main org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtp.yahoo.com.br:465

at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1138)

at org.apache.commons.mail.Email.send(Email.java:1163)

at br.com.farzacsystem.CommonsMail.enviaEmailSimples(CommonsMail.java:45)

at br.com.farzacsystem.CommonsMail.(CommonsMail.java:24)

at br.com.farzacsystem.CommonsMail.main(CommonsMail.java:128)

Caused by: javax.mail.MessagingException: Unknown SMTP host: smtp.yahoo.com.br;

nested exception is:

java.net.UnknownHostException: smtp.yahoo.com.br

at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1389)

at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:412)

at javax.mail.Service.connect(Service.java:310)

at javax.mail.Service.connect(Service.java:169)

at javax.mail.Service.connect(Service.java:118)

at javax.mail.Transport.send0(Transport.java:188)

at javax.mail.Transport.send(Transport.java:118)

at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1128)

 4 more

Caused by: java.net.UnknownHostException: smtp.yahoo.com.br

at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:177)

at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)

at java.net.Socket.connect(Socket.java:519)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:550)

at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:141)

at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:233)

at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:163)

at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1359)

 11 more

Java Result: 1

CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)
S

Experimenta usar um servidor SMTP próprio ao invés de smtp.yahoo.com.br

F

Ola amigo

Como assim servidor proprio?

M

Valeu cara, obrigado, resolveu o meu problema!!!

F

pow farzac , creio que seja a porta smtp que vc ta colocando errada, dei uma olhada na internet e achei pro yahoo o smtp numero 25, tenta ai e retorna pra gente :wink:

F

aff, tinha duas paginas…rs, nao vi, fora que o post era velho q ele só…rsrs

R

Pessoal, achei muito legal esse forum, mas sou novato e estou desenvolvendo uma aplicação em que precisa mandar email. Eu baixei o .zip do commons mail e gostaria de saber como instalar/utilizar para enfim poder estudar esse fórum. Obrigado.

R

Desculpe reviver o tópico depois de tanto tempo mas talvez a minha resposta ajude outras pessoas que caírem aqui.
Cassitos isso acontece pois o gmail e hotmail não aceitam envio de mensagens html no corpo do email, algumas versões do outlook e alguns servidores de email próprios para este tipo de envio (geralmente servidores de email marketing) permitem que vc envie codigo html no corpo do email.
Farzac esse erro ocorreu pois o endereço de smtp que vc está utilizando está incorreto ou não lhe dá permissão para ser usado, recomendo usar o do gmail ou do uol.
Abraço.

W

Joaozava:
Tentei rodar o exemplo acima e deu esse erro, alguém sabe porque?
Estou usando o eclipse e relacionei o jar no meu Build Path, não estou entendendo.

Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/Message
	at CommonsMail.enviaEmailSimples(CommonsMail.java:24)
	at CommonsMail.&lt;init&gt;(CommonsMail.java:13)
	at CommonsMail.main(CommonsMail.java:117)

a linha 24 é:

SimpleEmail email = new SimpleEmail();

Obrigado!

Amigo, você conseguiu resolver esse problema? esta dando esse erro pra mim também!
Me ajuda por favor?

R

Oi Wesleyobs,
Esse erro acontece pois está faltando o jar na pasta lib do projeto, vc pode resolver importando a biblioteca com os jars referentes ao simple mail pro seu projeto ou copiando e colando os jars diretamente na pasta onde estão os outros jars.
Verifique e poste aí o código da classe problemática caso não tenha resolvido.
Abs.

ww.raulferreira.com.br

W

raulsenaferreira:
Oi Wesleyobs,
Esse erro acontece pois está faltando o jar na pasta lib do projeto, vc pode resolver importando a biblioteca com os jars referentes ao simple mail pro seu projeto ou copiando e colando os jars diretamente na pasta onde estão os outros jars.
Verifique e poste aí o código da classe problemática caso não tenha resolvido.
Abs.

ww.raulferreira.com.br

Bom dia raulferreira.






R

Oi Wesley,
faça o seguinte:
crie uma nova classe e copie e cole os códigos abaixo e faça um teste:

1) colocamos uma ação no botão que enviará o email
try {
            enviaEmailComAnexo();
        } catch (EmailException ex) {
            Logger.getLogger(EnviaEmail.class.getName()).log(Level.SEVERE, null, ex);
        }
2)Colocamos uma ação no botão que anexa arquivos (JFileChooser), criei um textField e chamei de jTFAnexar
JFileChooser fileChooser = new JFileChooser();
                int result = fileChooser.showOpenDialog(null);
                File file = fileChooser.getSelectedFile();
                 if (file != null && result == JFileChooser.APPROVE_OPTION) {
                    jTFAnexar.setText(file.getAbsolutePath());
                }
3)Criamos a função de envio de emails (com ou sem anexo) que foi descrita no passo 1
public void enviaEmailComAnexo() throws EmailException{
		
		// cria o anexo.
		EmailAttachment anexo = new EmailAttachment();
		anexo.setPath(jTFAnexar.getText());

                //informações do destinatário
                destinatario ="email do destinatario";// coloque aqui o email do destinatario - MODIFIQUE AQUI
                nick = "nome do destinatario"; // coloque aqui o nome do destinatario - MODIFIQUE AQUI

                //se não houver anexo no email
                if(jTFAnexar.getText().equals("")){
				
		              // configura o email
               
		              MultiPartEmail email = new MultiPartEmail();
		              email.setHostName("smtp.gmail.com"); // o servidor SMTP para envio do e-mail
		              email.addTo(destinatario, nick); //destinatário
                              email.setFrom("[email removido]", "Seu Nome"); // remetente - MODIFIQUE AQUI
		
		              email.setSubject("assunto do e-mail"); // MODIFIQUE AQUI
		              email.setMsg("conteudo do e-mail"); //MODIFIQUE AQUI
                              email.setAuthentication("usuariodoemail", "senhadoemail");// MODIFIQUE AQUI
		
		              email.setSmtpPort(465);
		              email.setSSL(true);
		              email.setTLS(true);
		
		
		              // envia o email
		              email.send();
                              JOptionPane.showMessageDialog(null, "Mensagem enviada para "+ nick +" - "+ destinatario +" com sucesso!!");
                    }
                
                    else{//se houver anexo na mensagem
		              anexo.setDisposition(EmailAttachment.ATTACHMENT);
		              anexo.setDescription("Contém arquivo anexado");
		              anexo.setName("Titulo - Anexo");		
		  
		              // configura o email
               
		              MultiPartEmail email = new MultiPartEmail();
		              email.setHostName("smtp.gmail.com"); // o servidor SMTP para envio do e-mail
		              email.addTo(destinatario, nick); //destinatário
                              email.setFrom("[email removido]", "seu nome");//MODIFIQUE AQUI
		
		              email.setSubject("assunto do e-mail"); // MODIFIQUE AQUI
		              email.setMsg("conteudo do e-mail"); // MODIFIQUE AQUI
                              email.setAuthentication("usuario", "senha");//MODIFIQUE AQUI
		
		              email.setSmtpPort(465);
		              email.setSSL(true);
		              email.setTLS(true);
		
		              // adiciona arquivo(s) anexo(s)
		              email.attach(anexo);
		
		             // envia o email
		             email.send();
                            JOptionPane.showMessageDialog(null, "Mensagem enviada para "+ nick +" - "+ destinatario +" com sucesso!!");
                }
 }
Não se esqueça de incluir no início os imports:
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.MultiPartEmail;

Faça as substituições necessárias no passo 3, colocando os seus dados e faça o teste, se der erro posta aqui.
OBS: Eu uso esse código em programa desktop com BD embarcado, ou seja, ele funciona em qualquer lugar, provavelmente funcionará para você tambem. O mesmo foi baseado em um código aqui mesmo do fórum.

Abs

www.raulferreira.com.br
linkedin: http://www.linkedin.com/in/raulsenaferreira

R

Como fazer para enviar anexos que estão em memória e não arquivo físico?

P

Cara eu tenho um arquivo html e um jpeg como faço para enviar eles no corpo do email com o commons- email . grato

R

Mano, usa o código abaixo que vc se dá bem

public static void enviarEmail(String titulo, String mensagem,
			String destinatario, byte[] anexo, String nomeDoArquivo,
			FormatosDeArquivo formatoDoArquivo) throws Exception,
			MensagemException {

		if (Caracter.stringIsNullOrEmpty(destinatario))
			throw new MensagemException(
					Mensagens
							.getMensagem("O e-mail de destino não foi informado."));

		if (anexo == null || anexo.length == 0)
			throw new MensagemException(
					Mensagens.getMensagem("O anexo está vazio."));

		MultiPartEmail email = new MultiPartEmail();

		email.setHostName(smtp);
		email.setSmtpPort(587);
		email.setTLS(true);
		email.setFrom("[email removido]", "assunto");
		email.setAuthenticator(new DefaultAuthenticator(userName, password));

		email.setSubject(titulo);
		email.setMsg(mensagem);
		email.addTo(destinatario);

		ByteArrayDataSource source = new ByteArrayDataSource(anexo,
				Caracter.getContentType(formatoDoArquivo));

		email.attach(source, nomeDoArquivo, "");

		email.send();
	}

[url]http://www.vetusweb.com.br/[/url]

P

Mas esse código não vai colocar eles no anexo e não no corpo do email como os newsletters de lojas.

P

Daria para enviar um email para vários destinatários com o org.commons mail. grato

M

Bom dia,

estou tentando enviar um e-mail de teste mas não consigo de jeito nenhum.

private void EnviarEmail() throws EmailException{
     SimpleEmail email = new SimpleEmail();
 	email.setHostName("smtp.mail.yahoo.com.br");
        
 	email.setFrom("[email removido]");
        email.setAuthenticator(new DefaultAuthenticator("marcosacsj", "xxxx")); 

 	email.addTo("[email removido]");
        email.setSmtpPort(587);
 	//email.addCc("[email removido]");
 	//email.addBcc("[email removido]");
 	email.setSubject("Meu primeiro e-mail");
 	email.setMsg("Olá, estou usando o Commons E-mail API!");
 	email.setSSL(true);  
        email.setTLS(false);
        email.send();
    }
e o erro q está dando é
org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtp.mail.yahoo.com.br:587
	at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1242)
	at org.apache.commons.mail.Email.send(Email.java:1267)
	at javaapplication7.tela.EnviarEmail(tela.java:150)

alguem poderia me ajudar?

P

BOM DIA!!!

Gostei desse recurso de enviar email, senti facilidade de implementar … já utilizei muito isso no PHP. Porém… agora estou trabalhando com uma rede que está monitorada por um servidor PROXY onde preciso autenticar

IP-DO-SERVIDOR-PROXY ... PORTA-DO-SERVIDOR-PROXY.
DOMINIO/USUARIO-DE-REDE e ...  SENHA-DE-REDE.

Teria como fazermos isso para a máquina/servidor interno enviar o email?

Obrigadão!!!

R

to querendo saber tbm…
acho q por isso da esse erro:

Exception in thread "main" 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:1401) at org.apache.commons.mail.Email.send(Email.java:1428) at br.com.cdi.admlog.test.CommonsMail.enviaEmailSimples(CommonsMail.java:45) at br.com.cdi.admlog.test.CommonsMail.<init>(CommonsMail.java:24) at br.com.cdi.admlog.test.CommonsMail.main(CommonsMail.java:128)

Caused by: javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465; nested exception is:

Caused by: java.net.ConnectException: Connection timed out: connect
A

[size=12]Could not connect to SMTP host: smtp.gmail.com, port: 465[/size]

[size=18]Could not connect to SMTP host: smtp.gmail.com, port: 465[/size]

[size=24]Could not connect to SMTP host: smtp.gmail.com, port: 465[/size]

Tente a porta 587.

Abs []

R

já tentei…

eu acho que é pq estou na empresa o glassfish deve ter q ser configurado de acordo com o servido de desenvolvimento :confused:

vo testar em casa… quando der

Criado 14 de outubro de 2008
Ultima resposta 2 de ago. de 2013
Respostas 35
Participantes 21