Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Erro ao enviar email

bom dia, desculpe abri um tópico sem muito haver com o curso mais envolve web.

estou fazendo uma API simples que faz conexão com o banco pega algumas informações e manda email pro cliente com essas informações,

segue abaixo o código:

import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;

public class ConsultaInadimplencia {
    public static void main(String[] args) throws SQLException, EmailException {
        Connection con = Conection.getConection();

        Statement smt = con.createStatement();

        ResultSet resultSet = smt.executeQuery(" select cr.FRE_IN_NUMERO, "
                + " cr.MOV_ST_PARCELA, " + " cr.MOV_DT_DATADOCTO, "
                + " cr.MOV_DT_VENCTO, " + " agn.agn_st_nome, "
                + " agn_st_email," + " cr.SALDO_EM_ABERTO "

                + " from mgfin.fin_vw_contasreceber cr, "
                + " mgglo.glo_agentes agn "

                + " where cr.agn_in_codigo = agn.agn_in_codigo "
                + " and cr.MOV_CH_SITUACAO <> 'C'"
                + " AND cr.MOV_DT_VENCTO = trunc(sysdate) - 2 "
                + " AND cr.AGN_IN_CODIGO <> 3 "
                + " AND cr.AGN_IN_CODIGO <>  103 "
                + " and cr.SALDO_EM_ABERTO > 10 ");

        while (resultSet.next()) {
            int fatura = resultSet.getInt("FRE_IN_NUMERO");
            System.out.println("Fatura: " + fatura);

            int parcela = resultSet.getInt("MOV_ST_PARCELA");
            System.out.println("Parcela: " + parcela);

            double saldo = resultSet.getDouble("cr.SALDO_EM_ABERTO");
            System.out.println(saldo);

            Date dataEmissao = resultSet.getDate("MOV_DT_DATADOCTO");
            System.out.println("Data de emissão: " + dataEmissao);

            Date vencimento = resultSet.getDate("MOV_DT_VENCTO");
            System.out.println("Data de vencimento: " + vencimento);

            String nome = resultSet.getString("agn_st_nome");
            System.out.println("Nome do cliente: " + nome);

            String email = resultSet.getString("agn_st_email");
            System.out.println("Email: " + email + "\n");

            SimpleEmail Email = new SimpleEmail();
            Email.setHostName("smtp.gmail.com");
            Email.setFrom(email);
            Email.setAuthentication("gabriel@radex.com.br", "********");
            Email.addTo("gabriel@radex.com.br");
            Email.addBcc("gabriel@radex.com.br");
            Email.setSubject("Pendência");
            Email.setSmtpPort(587);
            Email.setStartTLSEnabled(true);
            Email.setMsg("Não identificamos em nosso sistema o pagamento do Cliente: "
                    + nome
                    + "NF: "
                    + fatura
                    + ","
                    + "parcelas "
                    + parcela
                    + "no valor de R$"
                    + saldo
                    + ","
                    + "com vencimento em "
                    + vencimento
                    + "Deste modo solicitamos entrar em contato para negociação, ou caso o débito "
                    + "tenha sido regularizado, por favor nos envie cópia do comprovante para verificação"
                    + "junto ao banco.\n");
            Email.send();
        }

        con.close();
        smt.close();
        resultSet.close();

    }
}

so que no fim ele me apresenta esse erro.

Exception in thread "main" java.lang.IllegalStateException: The MimeMessage is already built.
    at org.apache.commons.mail.Email.buildMimeMessage(Email.java:1273)
    at org.apache.commons.mail.Email.send(Email.java:1447)
    at TesteEmail.main(Unknown Source)

alguem sabe oq seria isso?

muito obriigado.

2 respostas
solução

Olá Gabriel, tudo bem?

Uma vez tive um problema parecido, o que eu acredito que aconteça é que o quando você você instancia o objeto email, a classe SimpleEmail que herda da classe abstrata Email já chama internamente o método buildMimeMessage(). Esse método só pode ser invocado uma vez e ao chamar o método send(), internamente ocorre a chamada para o método buildMimeMessage() novamente e por isso ocorre a Exception.

The MimeMessage is already built.

Como sugestão, tente ao invés de chamar o método send(), chamar o método sendMimeMessage(), tal método não faz a chamada interna para o buildMimeMessage()

Segue documentação: https://commons.apache.org/proper/commons-email/apidocs/src-html/org/apache/commons/mail/Email.html#line.471

Espero que essa informação ajude!

Abs

Rafael obrigado, mas nao era isso, era erro de sql sintaxe, mas estranho foi a mensagem pouco clara,

mesmo assim obrigado pela atenção