Duvida sobre javamail e jaspersoft

Primeiramente gostaria de agradecer a atenção de todos, tenho um programa que criei em java no netbeans para controle de estoque, criei a classe para envio de e-mail, esta funcionando normal, mas necessito enviar no e-mail o status do estoque, basicamente é a substituição dos dados informados como assunto no e-mail por uma variavel contendo a pesquisa no banco dos materiais abaixo da media.
Pensei em 2 opções
1= realizar a pesquisa no banco e simplesmente atribuir o resultado a uma variavel string e inserir a mesma como assunto do e-mail. (Sem sucesso)
2=realizar a pesquisa no banco e gerar um relatorio por meio do jaspersoft com os resultados , mas seria necessario as linhas de codigo para realizar a pesquisa, compilar o relatorio, gerar o relatorio em .PDF indicando um caminho para armazenamento, e modificar o envio do e-mail para inserir o anexo enviando-o. (Sem sucesso)

Peço a ajuda de vocês por meio de exemplos , sou iniciante em programação.

Grato!

Pelas informações que você passou, isso não é mais um trabalho de iniciante. Então não se dê mais esse título.

Porquê não teve sucesso? Esse caminho não é tão difícil, mostra o que você fez.

Em qualquer escolha, você teria que fazer linhas de código, e por mais que pareça que seriam N linhas de código, essa escolha não haveria tanto “esforço”, se você já sabe gerar um relatório, você só teria o trabalho de salvar como .PDF.

Enfim, resumindo, você já fez algo? Se sim, mande-nos.

1 curtida

@rodriguesabner Muito obrigado pelos conselhos, minha vontade era de enviar o anexo gerado pelo jaspersoft no e-mail o codigo abaixo descreve a classe para envio do e-mail,

public void enviarEmail(){

Properties props = new Properties();
/** Parâmetros de conexão com servidor Outlook */
props.put(“mail.smtp.auth”, “true”);
props.put(“mail.smtp.starttls.enable”, “true”);
props.put(“mail.smtp.host”, “outlook.office365.com”);
props.put(“mail.smtp.port”, “587”);

        Session session = Session.getDefaultInstance(props,
                    new javax.mail.Authenticator() {
                         protected PasswordAuthentication getPasswordAuthentication() 
                         {
                               return new PasswordAuthentication(emaillogar, senhalogar);
                         }
                    });

        /** Ativa Debug para sessão */
        session.setDebug(true);
        
        try {

              Message message = new MimeMessage(session);
              message.setFrom(new InternetAddress(emaillogar)); //Remetente

              Address[] toUser = InternetAddress //Destinatário(s)
                         .parse(EmailCopia1);
                           

              message.setRecipients(Message.RecipientType.TO, toUser);
              message.setSubject("Enviando email de teste");//Assunto
              message.setText(EmailStatusEstoque);
              /**Método para enviar a mensagem criada*/
              Transport.send(message);


         } catch (MessagingException e) {
              throw new RuntimeException(e);
        }

}
}

Este é o código para gerar o relatório;

public void RelatorioEnviar(){
ModuloConex con = new ModuloConex();
con.conectar();
String sql = “SELECT * FROM tbepi WHERE quantepi < quantmedepi AND quantepi <= quntminepi”;
try {
pst = con.criaPS(sql);
rs = pst.executeQuery();
JRResultSetDataSource rrs = new JRResultSetDataSource(rs);

        String caminho = new File("modeloRel.jrxml").getAbsolutePath();
        //Preenche o Jasper e gera o arquivo.jrprint
        JasperPrint remat = JasperFillManager.fillReport("modeloRel.jasper",new HashMap(),rrs);
        JasperCompileManager.compileReportToFile(caminho);
        
        JasperExportManager.exportReportToPdfFile("modeloRel.jasper");
        
        con.desconectar();

    }catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Não foi possível acessar os dados solicitados \n" +
            e.getLocalizedMessage());
    }  

}

Ao executar exibe o erro abaixo;

Você consegue gerar o relatório sem enviar pra o email? Tá falando que o % não tem definição, você queria dividir?

@rodriguesabner Utilizo para emitir outros relatórios e funciona bem, no código abaixo mostra um que utilizo para emitir o status geral do estoque.

private void subM9ActionPerformed(java.awt.event.ActionEvent evt) {
// Emitir relatório de Status do estoque
PreparedStatement pst = null;
Statement st = null;
ResultSet rs = null;
// Exibindo relatorio de epi
int resMAT = JOptionPane.showConfirmDialog(null, “Precione SIM para gerar o relatório de Status do estoque em baixa quantidade \n Ou não para cancelar”, “Atenção”,JOptionPane.YES_NO_OPTION);
// Gerando relatório utilizando o framework JasperReports
if (resMAT == JOptionPane.YES_OPTION) {
ModuloConex con = new ModuloConex();
con.conectar();
String sql = “SELECT * FROM tbepi WHERE quantepi < quantmedepi AND quantepi <= quntminepi”;
st = con.criaSTT();
// Utilizando a classe Jasperprint
try {

            pst = con.criaPS(sql);
            rs = pst.executeQuery();
            JRResultSetDataSource rrs = new JRResultSetDataSource(rs); 
            JasperPrint remat = JasperFillManager.fillReport("ModelEstoque.jasper",new HashMap(),rrs);
            //JasperViewer jv = new JasperViewer(remat);
            //jv.setVisible(true);
            JasperViewer.viewReport(remat,false);
            con.desconectar();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Não foi possível acessar os dados solicitados \n" +
            e.getLocalizedMessage());
}
    }
    
}  

A diferença é que para envia-lo por e-mail preciso das linha de código funcionais para que ele seja compilado , gere o arquivo pdf e armazene-o em um caminho tudo por via código, no exemplo acima ele gera o relatorio mas o usuario que deve salva-lo em algum caminho no formato escolhido.

conecta.executaSQL("Sua SQL aqui");
conecta.rs.first();
JRResultSetDataSource relatResul = new JRResultSetDataSource(rs);
JasperPrint jpPrint = JasperFillManager.fillReport(getClass().getResourceAsStream("Caminho do Relatorio"), new HashMap(), relatResul);

String nomeArquivo = "Arquivo X.pdf"; //Nome do arquivo que será exportado.
JasperExportManager.exportReportToPdfFile(jpPrint, "C:\\Nova Pasta\\" + nomeArquivo);
System.out.println("PDF Gerado.");

Adapta esse código pra você, está funcionando.

Tentei assim, mas sem sucesso

public void RelatorioEnviar(){
ModuloConex con = new ModuloConex();
con.conectar();
String sql = “SELECT * FROM tbepi WHERE quantepi < quantmedepi AND quantepi <= quntminepi”;
try {
pst = con.criaPS(sql);
rs = pst.executeQuery();
JRResultSetDataSource rrs = new JRResultSetDataSource(rs);

        JasperPrint jpPrint = JasperFillManager.fillReport(getClass().getResourceAsStream("C:/db/modeloemail.jasper"), new HashMap(), rrs);
        String nomeArquivo = "C:/db/modeloemail.jrxml"; //Nome do arquivo que será exportado.
        JasperCompileManager.compileReportToFile("C:/db/modeloemail.jrxml", "C:/db/modeloemail.jasper");
        JasperExportManager.exportReportToPdfFile(jpPrint, "C:\\Nova Pasta\\" + nomeArquivo);
        System.out.println("PDF Gerado.");
        con.desconectar();

    }catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Não foi possível acessar os dados solicitados \n" +
            e.getLocalizedMessage());
    }  

}

E qual o erro?

Dados nulos , nem realiza a pesquisa.

Joga essa SQL no seu banco de dados, vê se retorna algo, se não retornar, o problema é no SQL

Ali onde tá comentado “nome do arquivo que será exportado”, precisa ser .pdf, pq é o arquivo final