Rotina de Anexar PDF ao Email

Bom dia Pessoal;

Estou com uma dúvida,

Criei um relatório estou chamando ele na tela, está funcionando perfeitamente, mas quero anexa-ló para enviar por e-mail de forma automática.

Segue as rotinas que eu criei:

******* ROTINA QUE CRIA O RELATÓRIO ********

public String relatorio() {
try {

		InputStream arquivo = FacesContext.getCurrentInstance().getExternalContext()
				.getResourceAsStream("/ExtratoAgua.jasper");

		Map<String, Object> map = new HashMap<String, Object>();

		map.put("cod_cad01", buscado.getCodigo());
		// map.put("data_da_leitura",
		// lista_leituras.get(lista_leituras.size()).getData_da_leitura());

		byte[] pdf;
		// byte[] pdf2;

		pdf = JasperRunManager.runReportToPdf(arquivo, map,
				HibernateUtil.getSessionFactory().openSession().connection());

		HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext()
				.getResponse();

		ServletOutputStream out = response.getOutputStream();
		out.write(pdf);

		out.flush();
		out.close();

		// Finalizar o ciclo de vida do jsf (nao voltar para o .xhtml)
		FacesContext.getCurrentInstance().responseComplete();

	} catch (Exception e) {
		e.printStackTrace();
	}
	return null;
}

****** CLASSE QUE ENVIA O EMAIL ******

public class EmailUtil {

public static Email conectaEmail() throws EmailException {
	Email email = new SimpleEmail();
	email.setHostName(HOSTNAME);
	email.setSmtpPort(587);
	email.setAuthentication(USERNAME, PASSWORD);
	email.setTLS(true);
	email.setSSL(true);
	email.setFrom(USERNAME, USERNAME);

	return email;
}

public static String enviarEmail(Mensagem m, EmailAttachment anexo) throws Exception {
	HtmlEmail email = new HtmlEmail();

	// anexo.setPath(arquivo);
	anexo.setDisposition(EmailAttachment.ATTACHMENT);
	// anexo.setName(arquivo);
	email.attach(anexo);

	email = (HtmlEmail) conectaEmail();
	for (int i = 1; i < 2; i++) {
		email.setSubject("Extrato do Consumo de Água " + i);
		email.addTo(m.getPara());
		email.setMsg("Segue em anexo seu extrato do consumo de água");
		email.send();
	}
	return "Email enviado com Sucesso";
}

}


Eu imagino que tenha que passar usar o método enviarEmail passando o arquivo em pdf, Mas não consegui converter o arquivo jasper em pdf.

Desde já agradeço.

Fico no Aguardo.

Sabe estas linhas de código `byte[] pdf;
// byte[] pdf2;

	pdf = JasperRunManager.runReportToPdf(arquivo, map,
			HibernateUtil.getSessionFactory().openSession().connection());

? São elas que convertem o .jasper em um array de bytes para pdf. Como aqui você simplesmente retorna para o browser, consegue visualizar sem problemas. Para usar o envio por email, precisará instanciar um objeto da classe EmailAttachment e nele informar que está anexando um arquivo pdf. Ai é só chamar o métodoenviarEmail`

A questão é que para o EmailAttachment eu preciso passar o caminho do pdf. E isso que não to conseguindo fazer exportar esse arquivo em pdf para algum lugar que depois eu possa recuperar com o EmailAttachment. To tentando usar o método exportReportToPdf até agora sem sucesso.

estou com o mesmo problema Robson

Como está seu código ?

Sim, você precisa escrever o arquivo em um determinado diretório.
Teu projeto é desktop/batch ou web?
Creio que seja web, por isso, dependendo do teu container (tomcat, jetty) ou application server (glassfish, jboss, wildfly, weblogic, websphere, etc) você terá mais ou menos facilidades para isso.
Em geral, você consegue escrever no mesmo diretório onde o teu war/ear foi colocado no deploy.
Isso pode te ajudar

É um projeto WEB estou utilizando o Tomcat.

Chegou a ver o link que sugeri?

Sim.

Consegui resolver os métodos ficaram assim:

public String Enviarelatorio() {
	try {

		InputStream arquivo = FacesContext.getCurrentInstance().getExternalContext()
				.getResourceAsStream("/ExtratoAgua2.jasper");

		Map<String, Object> map = new HashMap<String, Object>();

		map.put("cod_cad01", buscado.getCodigo());
		map.put("OBS01", "Robson David");

		JasperPrint jp = JasperFillManager.fillReport(arquivo, map,
				HibernateUtil.getSessionFactory().openSession().connection());

		try {
			JasperExportManager.exportReportToPdfFile(jp,
					"C:/Relatorio/" + "Extrato_Cond_" + buscado.getNomfant_apel().trim() + ".pdf");
		} catch (JRException e) {
			System.out.println(e);
		}

	} catch (Exception e) {
		e.printStackTrace();
	}

	EnviarEmail();
	return null;
}

public void EnviarEmail() {
	try {

		Mensagem m = new Mensagem();
		m.setPara(buscado.getEmail());
		String msg = new EmailUtil().enviarEmail(m,
				"C:/Relatorio/" + "Extrato_Cond_" + buscado.getNomfant_apel().trim() + ".pdf");

		System.out.println(msg);
	} catch (Exception ex) {
		System.out.println("Error :" + ex.getMessage());

	}
}

Muito Obrigado.

Na boa, você “resolveu”, mas, esta não é uma boa prática.
Vamos supor que teu código seja aplicado em um ambiente unix. Com certeza não existe o diretório C:…
Assim sendo, o ideal é evitar caminhos como este e partir para algo como “./”, que, naturalmente teria permissão de escrita/leitura (ou poderia solicitar) ou, então, designar uma propriedade onde se possa definir qual o diretório a ser utilizado para geração dos relatórios em pdf, para estas situações.

Sim. Vou colocar depois em ftp ou no próprio server como no link que vc mandou. Isso ai é mais para teste. Precisava ver como funcionava.