Problema com javamail

8 respostas
B

Ola, esse eh meu primeiro topico aqui no forum o guj :D, apesar de q eu ja acessei-o muitas vez pra procurar sobre algumas duvidas minhas XD

Essa duvida agora, ta dificil de achar a solucao.
Estou querendo usar o javamail para mandar e-mails para confirmacao de cadastro.
Eu usei o servidor smtp do gmail, e funcionou, mas mesmo setando quem mandou (setFrom), o gmail muda para o endereco de email no qual foi feito a autenticacao.
Ex:

(...)
msg.setFrom(new InternetAddress("opa@funcionou")); 
(...)
Transport transport = session.getTransport("smtp");  
transport.connect("smtp.gmail.com","[email removido]","minhasenha123");

E funcinou! So q ao abrir o email recebido, o endereco de quem mandou era: [email removido]
Eu preciso que ele mande com o endereço q eu quiser (no exemplo: opa@funcionou).

Dai pesquisei e encontrei a soluçao de criar meu proprio servidor smtp.
Baxei este programa: Free Smtp Server (site: http://www.softstack.com/)

Dai a minha funcao de enviar ficou assim:

public static void mandaEmail(String to) throws AddressException, MessagingException
	{
		Properties props = new Properties();
		props.put("mail.smtp.host","localhost");        
		
		Session session = Session.getInstance(props, null);
		session.setDebug(true);
		MimeMessage msg = new MimeMessage(session);
		
		msg.setFrom(new InternetAddress("opa@funcionou"));
		msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
		msg.setContent (":D", "text/HTML"); 
		msg.setSentDate(new Date());
		msg.setSubject("xD");
		
		msg.saveChanges();
		Transport.send(msg);
	}

Mas eu recebo a mensagem de erro:

com.sun.mail.smtp.SMTPSendFailedException: 550 Invalid recipient: [email removido]

E nao importa qual email seja, tentei o meu do yahoo, da bol, do hotmail, todos com esse mesmo erro.
Pesquisei sobre ele e descobri q esses servidores de email bloqueiam emails q venham marcados com o servidor smtp como localhost!
Tentei mudar a linha:

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

Para:

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

Onde esses numeros representam meu ip, mas continua com o msm erro…
Alguem pode me ajudar?

Vlw!

8 Respostas

leandroeschiavi

Dá uma olhada nesta classe e ve se te ajuda…
Abs…

package br.com.tokiomarine.seguradora.exchange;

import br.com.tokiomarine.seguradora.exchange.util.PropertyServer;

import java.util.Calendar;
import java.util.Date;

import javax.mail.Message;

import javax.mail.MessagingException;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

/**

  • Classe responsável pelo envio de e-mails contendo os Logs do Agente.
  • @author Leandro Eschiavi - ORACLE CONSULTING
  • @version 1.0
    */

public class SendMailLog{

private static String          host;
private static PropertyServer  prop;
private static Session         session;
private static Message         msg;
private InternetAddress[]      destinatarioTo;
private InternetAddress[]      destinatarioCc;

/**
 * Construtor da classe
 */
public SendMailLog(){}

static {
    prop      =  new PropertyServer("parametros.properties");
    host      =  prop.getProperty("param.servidor");
    session   =  Session.getDefaultInstance(prop, null);
    msg       =  new MimeMessage(session);
    prop.put("mail.smtp.host", host);
}
/**
 * Método para envio do e-mail
 * @param subject Assunto da Mensagem
 * @param messageText Texto do corpo do E-mail
 * @param pFrom From do E-mail
 * @param pTo To do E-mail
 * @param pCc CC do E-mail
 */
public void enviaEmail( String   subject,
                        String   messageText,
                        String   pFrom,
                        String   pTo,
                        String   pCc,
                        Date     pData
                      ){
    try{

           msg.setFrom(new InternetAddress(pFrom));
           this.destinatarioTo = InternetAddress.parse(pTo);
           msg.setRecipients(Message.RecipientType.TO, this.destinatarioTo);
           
             if (pCc != null){
                 this.destinatarioCc = InternetAddress.parse(pCc);
                 msg.setRecipients(Message.RecipientType.CC, this.destinatarioCc);
              }
            msg.setSubject(subject);
            //msg.setSentDate(calendar.getTime());

            msg.setSentDate(pData);
            msg.setText(messageText);
            Transport.send(msg);
    }catch(MessagingException mes){
           mes.printStackTrace();
    }//try
}
public static void main(String args[]){
    for(int i =0; i < 2; i++){
    SendMailLog send = new SendMailLog();
    send.enviaEmail( "Sendmail " + i,
                     "Bom dia...\n" +
                     "Geração da massa de teste..." +
                     "\nGrato pela atenção !",
                     "[email removido]",
                     "[email removido],[email removido]",
                     "[email removido],@oracle.com",
                     new Date()
                   );
    }
    System.out.println("E-mails enviados com sucesso !");
}

}//class Sendmail

A

Sua classe nao esta errada… eu acho :wink:
Acontece que determinados servidores de email nao permitem enviar com remetentes diferentes do usuário logado…

ME CORRIJAM SE EU ESTIVER ERRADO pois tbm tenho duvida!!!

B

Mas qual o servidor smtp q vc ta usando?
O q seria essa classe: PropertyServer?

Flw!

T

Mudar o remetente do email via código é desaconselhado e proibido por diversos servidores de email porque pode ser usado para enviar spams. Você viu, por exemplo, que o GMail simplesmente ignora isso.

Entretanto, mudar o “reply-to” (endereço de retorno) não é proibido; isso pode ser feito para que a resposta ao email seja direcionada ao email correto.
Digamos, por exemplo, que você tenha criado uma conta no gmail com o endereço "[email removido] <Empresa Fantasma>", e você mude o “reply-to” para "[email removido] <Empresa Fantasma>".
Quando um destinatário receber o email, o remetente mostrado será “Empresa Fantasma”, e ao responder o email, a resposta será mandada para "[email removido]", como provavelmente é o que você quer fazer.

B

Eh exatamente isso q eu quero fazer.
So q n vou mandar spam de email n, eh apenas uma confirmacao de cadastro XD.

Eh so mudar assim?

msg.setReplyTo("[email removido]");

Mas e pra ao inves de mostrar o remetente assim (o email de quem enviou):

"[email protected]"

Mostrar:

“MeuSite”

Qual propriedade da mensagem devo mudar?
Vlw!

T

em vez de usar

msg.setReplyTo("[email removido]");

use

msg.setReplyTo(new InternetAddress ("[email removido]", "José Bündchen Conceição Soteropolitano", "iso-8859-1"));

onde “José Bündchen Conceição Soteropolitano” é o nome que vai aparecer na mensagem de retorno.

B

Vlw! Vo testar quando chegar em casa, la pelas 7,8h da noite eu respondo se deu certo!

Flw!

B

Desse jeito q vc disse:

msg.setReplyTo(new InternetAddress ("[email removido]", "José Bündchen Conceição Soteropolitano", "iso-8859-1"));

Nao ta aceitando, o eclipse acusa q tem q usar Adress[].

Dai eu tentei:

InternetAddress teste[] = { new InternetAddress("[email removido]"), new InternetAddress("MeuSite"), new InternetAddress("iso-8859-1") };
		msg.setReplyTo(teste);

Mas dai eu recebo no meu email e aparece o meu email do bol e nao o “MeuSite” q eu queria q aparecesse :frowning:

Alguma ideia? Vlw!

Criado 9 de janeiro de 2008
Ultima resposta 11 de jan. de 2008
Respostas 8
Participantes 4