JavaMail ora envia, ora não

18 respostas
G

Olá Galera boa noite,

estou com um problemão com o JAVAMAIL. Quando vou implementar no código o métodos gets para recuperar das classe dele mesmo os dados pra o e-mail. Ele executa o método ENVIAR mas não envia :shock:

Alguém poderia me ajudar?

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jdbc.mvc.controller;

import com.mysql.jdbc.PreparedStatement;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
import java.io.*;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Properties;
import javax.swing.JOptionPane;
import jdbc.mvc.model.ConfiguracoesSmtp;
import jdbc.mvc.model.EmailModel;
import jdbc.mvc.model.Pessoa_model;



public class Email_CRUD  {
    
  public Email_CRUD() {
      leDadosSMTP();
  }

protected String usuario;
protected String senha;
private String arquivo = "configSMTP.dll";
private String mensagem;
private String assunto;
private String remetente;
private List<Pessoa_model> destinatarios;
private String host;
private String porta;

    public String getAssunto() {
        return assunto;
    }

    public void setAssunto(String assunto) {
        this.assunto = assunto;
    }

    public List<Pessoa_model> getDestinatarios() {
        return destinatarios;
    }

    public void setDestinatario(List<Pessoa_model> destinatarios) {
        this.destinatarios = destinatarios;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public String getMensagem() {
        return mensagem;
    }

    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }

    public String getPorta() {
        return porta;
    }

    public void setPorta(String porta) {
        this.porta = porta;
    }

    public String getRemetente() {
        return remetente;
    }

    public void setRemetente(String remetente) {
        this.remetente = remetente;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }
    
public void enviar()  throws AddressException, MessagingException, SendFailedException {
                    System.out.println("Usuario:" + getUsuario());
                    System.out.println("Senha:" + getSenha());
                    System.out.println("Remetente:" + getRemetente());
                    System.out.println("Host:" + getHost());
                    System.out.println("Porta:" + getPorta());
                    
    Properties props = new Properties();
    String protocol = "smtp";
    props.put("mail." + protocol + ".auth", "true");
    props.put("mail.smtp.host", getHost());
    props.put("mail.smtp.port", getPorta());
    props.put("mail.from", getRemetente());
    Session session = Session.getInstance(props, null);

    try {
        MimeMessage msg = new MimeMessage(session);
        InternetAddress para[] = new InternetAddress[getDestinatarios().size()];
        msg.setFrom();
        for(int i = 0 ; i < getDestinatarios().size(); i++) {
            para[i] = new InternetAddress(getDestinatarios().get(i).getEmailpessoa());
            System.out.println("Para: " + getDestinatarios().get(i).getEmailpessoa());
        }
        msg.setRecipients(Message.RecipientType.TO,
                          para);
        msg.setSubject(getAssunto());
        msg.setSentDate(new Date());
        msg.setText(getMensagem());
        msg.saveChanges();
        
        Transport t = session.getTransport(protocol);
    try {
        t.connect(getUsuario(), getSenha());
        t.sendMessage(msg, msg.getAllRecipients());
    } finally {
        t.close();
        System.out.println("Enviado!");
    }
    } catch (MessagingException mex) {
        System.out.println("send failed, exception: " + mex);
    }

}

    private void leDadosSMTP() {
        ObjectInputStream is;
        ConfiguracoesSmtp c = new ConfiguracoesSmtp();
            try {
                is = new ObjectInputStream(new FileInputStream(arquivo));
                try {
                    c = (ConfiguracoesSmtp) is.readObject();
                    setUsuario(c.getUsuario());
                    setSenha(c.getSenha());
                    setHost(c.getEndereco());
                    setRemetente(c.getUsuario());
                    setPorta(String.valueOf(c.getPorta()));
                    //System.out.println("Usuario:" + getUsuario());
                    //System.out.println("Senha:" + getSenha());
                    //System.out.println("Host:" + getHost());
                    //System.out.println("Porta:" + getPorta());
                    is.close();
                } catch (ClassNotFoundException ex) {

                    JOptionPane.showMessageDialog(null, "Erro ao configurar servidor SMTP!","Erro",JOptionPane.ERROR_MESSAGE);
                }

            } catch (IOException ex) {
                    JOptionPane.showMessageDialog(null, "Erro ao configurar servidor SMTP!","Erro",JOptionPane.ERROR_MESSAGE);
            }
    }
    
    public void cadastraEmailEnviado(EmailModel dados) {
        
        try
        {
            Conexao_crm co = new Conexao_crm();
            PreparedStatement stmt = (PreparedStatement) co.con.prepareStatement(
            "INSERT INTO Email (Data, Assunto, Descricao) " +
            "VALUES(?,?,?)");
            
           DateFormat dataform = new SimpleDateFormat("yyyyMMdd");
           String data =  dataform.format(dados.getData());

            stmt.setString(1, data);
            stmt.setString(2, dados.getAssunto());
            stmt.setString(3, dados.getDescricao());
            
          
            stmt.execute();
            stmt = null;
              for(int i = 0; i < dados.getPessoa().size(); i++) {
                stmt = (PreparedStatement) co.con.prepareStatement(
                        "INSERT INTO emailenviado (Data, Assunto, Descricao) " +
                        "VALUES(?,?,?)");
            }
            
            stmt.close();
            JOptionPane.showMessageDialog(null, "Pessoa cadastrada com sucesso");
        }//try
        catch(SQLException e)
        {
            JOptionPane.showMessageDialog(null, "ERRO..." + e.getMessage(), "Cadastro Email",0);
        }//catch    
        
    }

}

Obrigado.

18 Respostas

mauricioadl

cara, ele gera algum erro?

G

Nenhum cara.
Nenhuma exceção. E o servidor SMTP tá certinho.

mauricioadl

verifica se realmente esta chamando o enviar sempre, as vezes depende de alguma condicao para isso. E se nao existe nenhum catch em branco.

romarcio

Se não está dando exceção, seta a propriedade: session.setDebug(true);
Pode ver alguma informação relevante nela.

G

Tá simmm, pode ver que no método enviar na linha 139 deixei para ele exibir “Enviado” e está exibindo.

G

não vi problema nenhum :(

/*
DEBUG: setDebug: JavaMail version 1.4.4
Para: [email removido]
Para: [email removido]
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "mail.gmtwebservices.com", port 25, isSSL false
220 venus.locadados.com.br ESMTP MailEnable Service, Version: 5.51--5.51 ready at 10/13/11 21:08:31
DEBUG SMTP: connected to host "mail.gmtwebservices.com", port: 25

EHLO GUI-NOTE
250-venus.locadados.com.br [201.58.97.224], this server offers 5 extensions
250-AUTH LOGIN
250-SIZE 5120000
250-HELP
250-AUTH=LOGIN
250 XSAVETOSENT
DEBUG SMTP: Found extension "AUTH", arg "LOGIN"
DEBUG SMTP: Found extension "SIZE", arg "5120000"
DEBUG SMTP: Found extension "HELP", arg ""
DEBUG SMTP: Found extension "AUTH=LOGIN", arg ""
DEBUG SMTP: Found extension "XSAVETOSENT", arg ""
DEBUG SMTP: Attempt to authenticate
DEBUG SMTP: check mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM 
AUTH LOGIN
334 VXNlcm5hbWU6
cHJvamV0b0BnbXR3ZWJzZXJ2aWNlcy5jb20=
334 UGFzc3dvcmQ6
c3ViYWNv
235 Authenticated
DEBUG SMTP: use8bit false
MAIL FROM:<[email removido]>
250 Requested mail action okay, completed
RCPT TO:<[email removido]>
250 Requested mail action okay, completed
RCPT TO:<[email removido]>
250 Requested mail action okay, completed
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   [email removido]
DEBUG SMTP:   [email removido]
DATA
354 Start mail input; end with <CRLF>.<CRLF>
Date: Thu, 13 Oct 2011 21:08:29 -0300 (BRT)
From: [email removido]
To: [email removido], [email removido]
Message-ID: <[email removido]>
Subject: sdas
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

<html>
  <head>
    
  </head>
  <body>
    sadasd
  </body>
</html>
.
250 Requested mail action okay, completed
QUIT
221 Service closing transmission channel
Enviado!

*/
romarcio

Coloca essa propriedade: props.setProperty("mail.smtp.starttls.enable", "true");

G

Nada cara :?

/*DEBUG: setDebug: JavaMail version 1.4.4
Para: [email removido]
Para: [email removido]
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "mail.gmtwebservices.com", port 25, isSSL false
220 venus.locadados.com.br ESMTP MailEnable Service, Version: 5.51--5.51 ready at 10/13/11 21:32:22
DEBUG SMTP: connected to host "mail.gmtwebservices.com", port: 25

EHLO GUI-NOTE
250-venus.locadados.com.br [201.58.97.224], this server offers 5 extensions
250-AUTH LOGIN
250-SIZE 5120000
250-HELP
250-AUTH=LOGIN
250 XSAVETOSENT
DEBUG SMTP: Found extension "AUTH", arg "LOGIN"
DEBUG SMTP: Found extension "SIZE", arg "5120000"
DEBUG SMTP: Found extension "HELP", arg ""
DEBUG SMTP: Found extension "AUTH=LOGIN", arg ""
DEBUG SMTP: Found extension "XSAVETOSENT", arg ""
DEBUG SMTP: Attempt to authenticate
DEBUG SMTP: check mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM 
AUTH LOGIN
334 VXNlcm5hbWU6
cHJvamV0b0BnbXR3ZWJzZXJ2aWNlcy5jb20=
334 UGFzc3dvcmQ6
c3ViYWNv
235 Authenticated
DEBUG SMTP: use8bit false
MAIL FROM:<[email removido]>
250 Requested mail action okay, completed
RCPT TO:<[email removido]>
250 Requested mail action okay, completed
RCPT TO:<[email removido]>
250 Requested mail action okay, completed
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   [email removido]
DEBUG SMTP:   [email removido]
DATA
354 Start mail input; end with <CRLF>.<CRLF>
Date: Thu, 13 Oct 2011 21:32:23 -0300 (BRT)
From: [email removido]
To: [email removido], [email removido]
Message-ID: <[email removido]>
Subject: sadas
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

<html>
  <head>
    
  </head>
  <body>
    asdasdas
  </body>
</html>
.
250 Requested mail action okay, completed
QUIT
221 Service closing transmission channel
Enviado!
*/
lucasmurata

Eu já passei por mesmo problema um tempo atrás. Ele ficava por um tempo enviando. Depois parava. Depois voltava.

Não mexi mais por o projeto está pausado. Mas se alguem souber, vamos compartilhar.

Assim que eu souber de alguma coisa, tambem irei postar aqui para ajudar a comunidade.

Abraço.

G

Realmente muito estranho.

romarcio

Talvez seja alguma coisa com o hotmail. Tentou testar enviando por outro servidor, gmail, bol… Testa para ver se acontece a mesma coisa.

G

Cara nem to usando Hotmail. Tentei com outros provedores e a mesma coisa :?

romarcio
G

Sim ja tentei mandar para outros mas não deu certo mesmo. Só que agora aumentei o numero de e-mails deu o seguinte erro:


send failed, exception: javax.mail.MessagingException: Could not connect to SMTP host: mail.gmtwebservices.com, port: 25;
nested exception is:
java.net.SocketException: No buffer space available (maximum connections reached?): connect

E na outra tentativa deu certo de executar o método mas não enviou.

romarcio

Tem certeza que a porta é a 25? Não existe um bloqueio no servidor para a porta SMTP? Já conferiu isso?

G

Já verifiquei, porta 25. Pelo Microsoft Outlook envia normalmente.

G

Ninguem tem uma solução ou um código funcionando??? :frowning:

G

Bom galera, eu consegui resolver adicionando a API Commons-Emiail

O link para Download está aqui: http://commons.apache.org/email/download_email.cgi

Tutorial básico: http://commons.apache.org/email/userguide.html

E minha classe ficou assim:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jdbc.mvc.controller;

import com.mysql.jdbc.PreparedStatement;
import java.net.MalformedURLException;
import java.util.*;
import java.io.*;
import java.net.URL;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import javax.swing.JOptionPane;
import jdbc.mvc.model.ConfiguracoesSmtp;
import jdbc.mvc.model.EmailModel;
import jdbc.mvc.model.Pessoa_model;
import org.apache.commons.mail.*;


public class Email_CRUD  {
    
  public Email_CRUD() {
      leDadosSMTP();
  }

protected String usuario;
protected String senha;
private String arquivo = "configSMTP.dll";
private String mensagem;
private String assunto;
private String remetente;
private List<Pessoa_model> destinatarios;
private String host;
private String porta;

    public String getAssunto() {
        return assunto;
    }

    public void setAssunto(String assunto) {
        this.assunto = assunto;
    }

    public List<Pessoa_model> getDestinatarios() {
        return destinatarios;
    }

    public void setDestinatario(List<Pessoa_model> destinatarios) {
        this.destinatarios = destinatarios;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public String getMensagem() {
        return mensagem;
    }

    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }

    public String getPorta() {
        return porta;
    }

    public void setPorta(String porta) {
        this.porta = porta;
    }

    public String getRemetente() {
        return remetente;
    }

    public void setRemetente(String remetente) {
        this.remetente = remetente;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }
    
public void enviar() throws EmailException, MalformedURLException  {
                    System.out.println("Usuario:" + getUsuario());
                    System.out.println("Senha:" + getSenha());
                    System.out.println("Remetente:" + getRemetente());
                    System.out.println("Host:" + getHost());
                    System.out.println("Porta:" + getPorta());
                    
  for(int i = 0; i < getDestinatarios().size(); i++)  {
     // Create the email message
      HtmlEmail email = new HtmlEmail();
      email.setHostName(getHost());
      email.addTo(getDestinatarios().get(i).getEmailpessoa(), getDestinatarios().get(i).getNomepessoa());
      email.setSubject(getAssunto());
      email.setAuthentication(getUsuario(), getSenha());
      email.setDebug(true);
      email.setCharset("utf-8");

      // embed the image and get the content id
      //URL url = new URL("http://www.apache.org/images/asf_logo_wide.gif");
      //String cid = email.embed(url, "Apache logo");

      // set the html message
      //email.setHtmlMsg("<html>The apache logo - <img src=\"cid:"+cid+"\"></html>");
      email.setHtmlMsg(getMensagem());

      // set the alternative message
      email.setTextMsg("Seu e-mail não suporta mensagens HTML");

      // send the email
      email.send();
  }
  
}

    private void leDadosSMTP() {
        ObjectInputStream is;
        ConfiguracoesSmtp c = new ConfiguracoesSmtp();
            try {
                is = new ObjectInputStream(new FileInputStream(arquivo));
                try {
                    c = (ConfiguracoesSmtp) is.readObject();
                    setUsuario(c.getUsuario());
                    setSenha(c.getSenha());
                    setHost(c.getEndereco());
                    setRemetente(c.getUsuario());
                    setPorta(String.valueOf(c.getPorta()));
                    //System.out.println("Usuario:" + getUsuario());
                    //System.out.println("Senha:" + getSenha());
                    //System.out.println("Host:" + getHost());
                    //System.out.println("Porta:" + getPorta());
                    is.close();
                } catch (ClassNotFoundException ex) {

                    JOptionPane.showMessageDialog(null, "Erro ao configurar servidor SMTP!","Erro",JOptionPane.ERROR_MESSAGE);
                }

            } catch (IOException ex) {
                    JOptionPane.showMessageDialog(null, "Erro ao configurar servidor SMTP!","Erro",JOptionPane.ERROR_MESSAGE);
            }
    }
    
    public void cadastraEmailEnviado(EmailModel dados) {
        
        try
        {
            Conexao_crm co = new Conexao_crm();
            PreparedStatement stmt = (PreparedStatement) co.con.prepareStatement(
            "INSERT INTO Email (Data, Assunto, Descricao) " +
            "VALUES(?,?,?)");
            
           DateFormat dataform = new SimpleDateFormat("yyyyMMdd");
           String data =  dataform.format(dados.getData());

            stmt.setString(1, data);
            stmt.setString(2, dados.getAssunto());
            stmt.setString(3, dados.getDescricao());
            
          
            stmt.execute();
            stmt = null;
              for(int i = 0; i < dados.getPessoa().size(); i++) {
                stmt = (PreparedStatement) co.con.prepareStatement(
                        "INSERT INTO emailenviado (idPessoa, idEmail) " +
                        "VALUES(?,?)");
                stmt.setString(1, data);
                stmt.setString(2, dados.getAssunto());
                stmt.execute();
            }
            
            stmt.close();
            JOptionPane.showMessageDialog(null, "Pessoa cadastrada com sucesso");
        }//try
        catch(SQLException e)
        {
            JOptionPane.showMessageDialog(null, "ERRO..." + e.getMessage(), "Cadastro Email",0);
        }//catch    
        
    }

}

Agora vou dar aquela garimpada para ela exibir uma JDialog com o status do envio!

Abraçosss

Criado 13 de outubro de 2011
Ultima resposta 14 de out. de 2011
Respostas 18
Participantes 4