Porque nao consigo enviar emails para hotmail com java.mail?

Boas. Eu fiz um programa simples para enviar emails pelo localhost, com a ‘ajuda’ de um servidor local SMTP.

Quando eu envio para a minha conta de email sapo.pt (uma empresa de Portugal para quem nao souber) tudo corre as mil maravilhas e eu recebo o email.

Porem, quando tento enviar para a minha outra conta do Hotmail nao funciona e da-me este erro:

com.sun.mail.smtp.SMTPSendFailedException: 550 Invalid recipient: xxxxxx@hotmail.com

O servidor local de SMTP, por sua vez, recebe um erro e nao envia nada.

Aqui esta o codigo do meu programa:

import java.io.*;  
import javax.mail.*;  
import javax.mail.internet.*;  
import java.util.*;   
   
public class Main  
{  
      
    public static void main (String[] args)  
    {  
        try  
        {  
            postMail ();  
        }  
        catch (MessagingException e)  
        {  
            System.out.println ("Erro: " + e);  
        }  
    }  
      
    public static void postMail () throws MessagingException  
    {  
        final boolean debug = false;  
          
        Properties p = new Properties ();  
        p.put ("mail.smtp.host", "localhost");  
        p.put("mail.smtp.port", "2525");  
          
        Session session = Session.getDefaultInstance (p, null);  
        session.setDebug (debug);  
          
        Message msg = new MimeMessage (session);  
          
        InternetAddress addressFrom = new InternetAddress ("olatodos@oladeus.com");  
        Address to = new InternetAddress ();  
         
        msg.setFrom (addressFrom);  
   msg.setSubject ("Mensagem teste");  
          
        StringBuffer mensagem = new StringBuffer ();  
        String message;  
   String linha;  
          
        try  
        {              
            mensagem.append ("Ola a todos isto e uma mensagem teste!");  
              
            message = mensagem.toString ();  
            msg.setContent (message, "text/html");  
              
            to = new InternetAddress ("xxxxxxx@hotmail.com");  
            msg.setRecipient (Message.RecipientType.TO, to);  
              
            Transport.send (msg);  
            Thread.sleep (10);  
        }  
        catch (Exception e)  
        {  
            System.out.println (e);  
        }  
    }  
}  

Podem-me ajudar?

Boa tarde,

Voce pode tentar duas coisas…Fazer com autenticação usando Authenticator


Authenticator auth = new SMTPAuthenticator(user,password);
Session session = Session.getInstance(props, auth);

Classe:



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




public class SMTPAuthenticator extends Authenticator {
	
    private String username;
    private String password;
    public SMTPAuthenticator(String username, String password) {
        super();
        this.username = username;
        this.password = password;
    }
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(username, password);     }
}

E pode tentar colocar a porta SMTP:


			props.put("mail.smtp.user", "email@gmail.com"); 
			props.put("mail.smtp.host", "colocar o host"); 
			props.put("mail.smtp.auth", "true"); 
			props.put("mail.debug", "false"); 
			props.put("mail.smtp.starttls.enable", "true"); 
			props.put("mail.smtp.port", 465); // porta smtp
			props.put("mail.smtp.socketFactory.port", 465); // porta smtp
			props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
			props.put("mail.smtp.socketFactory.fallback", "false");

Tenta ai…

acho que é pq seu ip não bate com o dns cadastrado na fapesp para o dominio do email que vc está tentando enviar…

alguns servidores validam isso outros não…

Conectar-se a um servidor de email em "localhost" indica que sua máquina tem um programa que faz "relay" de email, como o Microsoft SMTP Service.
Os servidores de email corporativos normalmente recusam emails que foram enviados dessa maneira, via "relay".
(Relay em inglês quer dizer que está sendo feito um "revezamento" - isso era muito comum nos dias mais antigos do email, em que as conexões entre servidores eram feitas por modems muito lentos.

O que ocorria antigamente, naqueles tempos da vovozinha:

  • Eu tinha uma conta thingol@guj.com.br
  • Eu quero mandar um email para kafka@franz.com
  • Como o servidor guj.com.br e o franz.com não estão conectados à Internet, mas sim indiretamente via modems, é necessário especificar o caminho que a mensagem deve fazer.
    Digamos que guj.com.br tenha uma ligação via modem para fapesp.br, e fapesp.br tenha uma ligação via modem para harvard.edu, e harvard.edu tenha uma ligação para franz.com.
    Eu teria de especificar o email como:
    kafka!fapesp.br!harvard.edu@franz.com --&gt note a rota que a mensagem tem de fazer, especificada no endereço!
    e enviaria o email usando um servidor do guj.com.br, que iria se comunicar com fapesp.br e pôr isso no servidor de email da fapesp.br, onde ele iria ficar acumulado até que conseguisse se conectar com harvard.edu. Aí o harvard.edu, quando tiver tempo, vai conectar-se com o franz.com, para finalmente mandar a mensagem. Que coisa!
    Hoje em dia é possível, pela Internet, comunicar-se diretamente com franz.com, e todo esse esquema de "relay" não é mais necessário, e é até perigoso.

Você deve especificar um servidor de email válido.
Se você tem uma conta do sapo.pt, então deve especificar o servidor de SMTP do sapo.pt por exemplo.

Como faço isso? Isso nao implicaria ter de usar um email meu registado do sapo.pt para aparecer como sendo o remetente da mensagem que enviei?

É que eu precisamente queria poder usar emails com nomes quaisquer, assim como esta no codigo que postei, por exemplo olatodos@oladeus.com.

Se calhar percebi mal, é que comecei a experimentar isto hoje e ainda estou um bocado à toa com os protocolos todos…

P.S.: Também nao percebi bem o que é que o Rockstorm diz que é suposto fazer. Desculpem a ignorancia :frowning:

Você deve especificar um smtp válido, no seu caso smtp.sapo.pt e também especificar o usuário e senha para autenticar no servidor smtp do sapo.

Os servidores de envio(SMTP) na sua maioria exigem uma autenticação para que você o utilize. Coloque seu email e senha de email que vai funcionar.

Nosso colega postou o código mastigado acima, aproveite.

Ps: Não resisti de usar a nova tag code do GUJ :oops:

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

  
public class SMTPAuthenticator extends Authenticator {   
       
    private String username;   
    private String password;   
    public SMTPAuthenticator(String username, String password) {   
        super();   
        this.username = "dir@sapo.pt";   
        this.password = "SenhaQueUsoParaVerMeusEmailsNoSapo.PT";   
    }   
    protected PasswordAuthentication getPasswordAuthentication() {   
        return new PasswordAuthentication(username, password);     }   
}  

[]'s

Ok. Vou fazer isso.

Mas fazendo isso ja nao da para escolher uma email remetente aleatorio como tinha no meu codigo (neste caso ‘olatodos@oladeus.com’), ou da?

Obrigado pelas vossas respostas, têm me ajudado em forca nisto.

Não, para fazer o que vc quer procure por servidores SMTP que aceitem enviar mensagens sem autenticação, a implementação de autenticação nos servidores SMTP foi criada exatamente para evitar o que vc quer fazer.

[]'s

Ok. alterei o meu codigo para ficar com isto da autenticação mas agora da-me o seguinte erro:

javax.mail.MessagingException: Could not connect to SMTP host: smtp.sapo.pt, port: 2525;
nested exception is:
java.net.ConnectException: Connection timed out: connect

o codigo é o seguinte:

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

public class Main
{
    
    public static void main (String[] args)
    {
        try
        {
            postMail ();
        }
        catch (MessagingException e)
        {
            System.out.println ("Erro: " + e);
        }
    }
    
    public static void postMail () throws MessagingException
    {
        final boolean debug = false;
        String user;
        String password;
        
        Properties p = new Properties ();
        p.put("mail.smtp.user", "dir@sapo.pt");
        p.put ("mail.smtp.host", "smtp.sapo.pt");
        p.put("mail.smtp.port", "2525");
        p.put("mail.smtp.auth", "true"); 
        
        Authenticator auth = new SMTPAuthenticator ();
        
        Session session = Session.getInstance (p, auth);
        session.setDebug (debug);
        
        Message msg = new MimeMessage (session);
        
        Address to = new InternetAddress ();
	    
        msg.setSubject ("Mensagem teste");
        
        StringBuffer mensagem = new StringBuffer ();
        String message;
	String linha;
        
        try
        {            
            mensagem.append ("Ola isto é uma mensagem teste");
            
            message = mensagem.toString ();
            msg.setContent (message, "text/html");
            
            to = new InternetAddress ("dir@hotmail.com");
            msg.setRecipient (Message.RecipientType.TO, to);
            
            Transport.send (msg);
            Thread.sleep (10);
        }
        catch (Exception e)
        {
            System.out.println (e);
        }
    }
    
    public static class SMTPAuthenticator extends Authenticator
    {      
        private String username;      
        private String password;      
        
        public SMTPAuthenticator ()
        {      
            super ();      
            this.username = "dir@sapo.pt";      
            this.password = "minhapassword";      
        }      
    
        protected PasswordAuthentication getPasswordAuthentication ()
        {      
            return new PasswordAuthentication (username, password);
        }      
    }
}

O que é que está mal e o que é que é preciso adicionar??

Mais uma vez obrigado pela ajuda que estao a dar.

Olá, dei uma pesquisa e de acordo com esta tela de ajuda http://ajuda.sapo.pt/comunicacao/email/utilizacao_do_servico/Utiliza_o_via_POP3_Outlook_E.html, acredito que o smtp do Sapo use a porta padrão. Resumindo, tente trocar a linha:

p.put(“mail.smtp.port”, “2525”);

por:

p.put(“mail.smtp.port”, “25”);

A exception que postou, diz que ele não conseguiu conectar (provavelmente a porta 2525).

boa sorte.

Roger Leite

Não posso fazer isso porque o meu Local Relay SMTP Server diz me que existe outro programa qualquer a usar essa porta e por isso não pode usa-la… como eu eu nao sei qual e o tal programa nao posso desliga lo por isso usei esta porta alternativa…

De qualquer forma antes eu conseguia enviar emails para a conta do sapo.pt. Agora, desde que fiz estas alteracoes da autenticação, já nao da…