Erro ao enviar e-mail usando javax.mail

Dae pessoal,

estou tentando rodar um exemplo simples de envio de e-mail, usando a biblioteca javax.mail, mas ocorre o seguinte erro :

Exception in thread “main” javax.mail.MessagingException: Could not connect to SMTP host: smtp.bol.com.br, port: 25;
nested exception is:
java.net.ConnectException: Connection timed out: connect
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1282)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:370)
at javax.mail.Service.connect(Service.java:275)
at javax.mail.Service.connect(Service.java:156)
at javax.mail.Service.connect(Service.java:105)
at javax.mail.Transport.send0(Transport.java:168)
at javax.mail.Transport.send(Transport.java:98)
at test.MailExample.main(MailExample.java:42)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:364)
at java.net.Socket.connect(Socket.java:507)
at java.net.Socket.connect(Socket.java:457)
at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:232)
at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:189)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1250)
… 7 more

Segue abaixo o código fonte :

import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;

public class MailExample {
  
	public static void main (String args[]) throws Exception {
    
	    String host = "smtp.bol.com.br";
	    String from = "mleiras@bol.com.br";
	    String to = "mleiras@gmail.com";
	    
	    // Get system properties
	    Properties props = System.getProperties();
	
	    // Setup mail server
	    props.put("mail.smtp.host", host);
	    //props.put("mail.smtp.port", port);
	
	    // Get session
	    Session session = Session.getDefaultInstance(props, null);
	
	    // Define message
	    MimeMessage message = new MimeMessage(session);
	
	    // Set the from address
	    message.setFrom(new InternetAddress(from));
	
	    // Set the to address
	    message.addRecipient(Message.RecipientType.TO, 
	      new InternetAddress(to));
	
	    // Set the subject
	    message.setSubject("Hello JavaMail");
	
	    // Set the content
	    message.setText("Welcome to JavaMail");
	
	    // Send message
	    Transport.send(message);
	    
	    System.out.println("E-mail sent!");
	}
}

Alguém saberia me dizer o q estou fazendo de errado?

Valeu,
Leiras

Está conectado a internet ? o bol não requer autenticação ?

Opa,

estou conectado na internet sim.
E o BOL não requer autenticação.
Será q pode ser algum Firewall no meio do caminho?

Hummm, acho que não. O que pode estar acontecendo é que o bol é uma *&%%&¨¨ para conectar via smtp/pop. Aconselho usar outro.

:okok:

Hehe, concordo com sua opinião sobre o BOL Marcos.
É q só conheço ele com servidor smtp sem autenticação.
Vc conhce algum outro?
Se puder me passar algum outro servidor smtp+porta pra que eu possa testar eu agradeço.

Valeu,
Leiras

Opa,

aconselho você já usar autenticação direto é melhor, aqui tem um exemplinho http://www.experts-exchange.com/Programming/Programming_Languages/Java/Q_21133318.html

:okok:

Cara, o pior é q eu já fiz exemplos usando autenticação, e tb não funcionou.
Deve ser alguma urucubaca dessa rede aqui da minha empresa.
Vou testar em casa, os mesmos exemplos, pra ver o q acontece.

Opa,

Posta a exceções aí que nós podemos lhe ajudar a resolver este problema.

:okok:

Bom Marcos, aproveitando a sua boa vontade… :slight_smile:
Segue o código q eu fiz pra envio de e-mails com autenticação :

Primeiro minha classe autenticadora

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class SMTPAuthenticator extends Authenticator {

	private String user;
	private String password;
	
	public SMTPAuthenticator( String user, String password ) {
		this.user = user;
		this.password = password;
	}
			
	@Override
	protected PasswordAuthentication getPasswordAuthentication() {
	    return new PasswordAuthentication(this.user, this.password);
	}

}

Agora a classe principal.

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.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendMail {

	public static void main(String[] args) {
		
		String user = "mano_x_br";
		String password = "123456";
		
		String host = "smtp.mail.yahoo.com.br";
		String port = "587";
		String from = "mano_x_br@yahoo.com.br";
	        String to = "leiras@inf.ufsc.br";
		
		try {
			SMTPAuthenticator auth = new SMTPAuthenticator( user, password );
			
		    // Get system properties
		    Properties props = System.getProperties();
		    props.put("mail.smtp.host", host);
		    props.put("mail.smtp.port", port);
		    props.put("mail.smtp.auth", "true");  
			
		    Session session = Session.getDefaultInstance(props, auth);
			
		    MimeMessage msg = new MimeMessage(session);
			msg.setFrom(new InternetAddress(from));
		    msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
		    msg.setSentDate(new Date());
		    msg.setSubject("Testando envio de e-mails com JAVA");
		    msg.setText("Se este texto estiver aparecendo é porque fungou! Uhu!");
		    
		    System.out.println("Enviando a Mensagem...");
		    
		    // evniando mensagem (tentando)
		    Transport.send(msg);
		    
		    System.out.println("E-mail enviado com sucesso!!!");
		}
		catch (AddressException e) {
		    e.printStackTrace();
		}
		catch (MessagingException e) {
		    e.printStackTrace();
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}

Criei uma conta no yahoo

user : mano_x_br
password : 123456

só pra efeito de teste.

Neste caso, dá uma exceção de falha na autenticação.
Dá uma olhada no console :

Enviando a Mensagem…
javax.mail.AuthenticationFailedException
at javax.mail.Service.connect(Service.java:306)
at javax.mail.Service.connect(Service.java:156)
at javax.mail.Service.connect(Service.java:105)
at javax.mail.Transport.send0(Transport.java:168)
at javax.mail.Transport.send(Transport.java:98)
at test.mail3.SendMail.main(SendMail.java:65)

Opa,

Bem teu código está quase certo…

Primeiro tire o objeto auth, bem ele não é necessário.

Session session = Session.getDefaultInstance(props, auth); 

e troque

Transport.send(msg); 

por

msg.saveChanges(); Transport transport = session.getTransport("smtp"); transport.connect(host, user, pass); transport.sendMessage(message, message.getAllRecipients()); transport.close();

:okok:

Cara, tá difícl…

Eis o novo código fonte

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

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendMail {

	public static void main(String[] args) {
		
		String user     = "mano_x_br";
		String password = "123456";

		String host     = "smtp.mail.yahoo.com.br";
		int port        = 587;
		String from     = "mano_x_br@yahoo.com.br";
		String to       = "leiras@inf.ufsc.br";
		
		try {
			Properties props = System.getProperties();
			props.put("mail.smtp.host", host);
			props.put("mail.smtp.port", port);
			props.put("mail.smtp.auth", "true");

			Session session = Session.getDefaultInstance(props, null);

			MimeMessage msg = new MimeMessage(session);
			msg.setFrom(new InternetAddress(from));
			msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
			msg.setSentDate(new Date());
			msg.setSubject("Testando envio de e-mails com JAVA");
			msg.setText("Se este texto estiver aparecendo é porque fungou! Uhu!");
			msg.saveChanges();

			Transport transport = session.getTransport("smtp");
			System.out.println("Tentando conectar ao servidor ...");			
			transport.connect(host, port, user, password);
			System.out.println("Enviando Mensagem ...");
			transport.sendMessage(msg, msg.getAllRecipients());
			transport.close();
			System.out.println("E-mail enviado com sucesso!");

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

E o console

Tentando conectar ao servidor …
javax.mail.AuthenticationFailedException
at javax.mail.Service.connect(Service.java:306)
at com.leiras.SendMail.main(SendMail.java:42)

Opa,

tire mais estas duas linhas:

props.put("mail.smtp.host", host); props.put("mail.smtp.port", port);

você já está passando o host no método connect.

:okok:

Cara, tirei estas 2 linhas de código, mas continua dando o mesmo erro.
E eu já entrei no site do yahoo várias vezes pra testar este login e senha… Estão corretos.
Não faço idéia por que está dando este tipo de erro.
E eu achei q mandar e-mails com JAVA seria tranquilinho… Hehe…

Opa,

várias coisas que você deixou de fazer, primeiro não habilitou a opção de receber e enviar tuas mensagens via pop no teu e-mail.
Segundo não precisa de colocar esta porta.

Rodei esta classe tua, enviou o e-mail depois de autorizar tua conta a receber e enviar e-mail via pop.

:okok:

É Marcos,

agora finalmente funcionou! :grin:
Fiz um teste com e sem a porta, e funcionou das 2 maneiras realmente.
O problema estava mesmo nas configurações da conta lá no yahoo.
Brigadão pela ajuda velho.