Fórum salvar Relatorio gerado pelo jasper via anottation do struts 2 no banco #415448

15/04/2012

0

Ola pessoal, estou desenvolvendo um projeto, e me deparei com a necessidade de gerar relatorios com struts 2 , até ae td bem , mas queria enviar o relatorio gerado por email .

segue meu codigo da minha action q gera o pdf usando anotations do Struts 2:

@Action(value=montaPdfFrota, results={ @Result(name=ok,type=jasper,
			location=/pdf/frota.jasper,
			params={dataSource,frotabanco,format,PDF}),
			@Result(name=ok, type=redirectAction, 
			params={actionName, ActionEnviaEmail}),
			@Result(name=input, location=/erro.jsp)
			
					})
		




A outra action que envia o email




@Action(value=ActionEnviaEmail, results={
			@Result(name=ok, location=/sucesso.jsp),
			@Result(name=input, location=/cadastro-frota.jsp)
	})
	
	public String execute() { 

		// cria o anexo 1.  
       
		
		try {
		EmailAttachment anexo1 = new EmailAttachment();  
        anexo1.setPath(C:/workspace/PortalBonanza/WebContent/pdf/frota.jasper); //caminho do arquivo (RAIZ_PROJETO/teste/teste.txt)  
        anexo1.setDisposition(EmailAttachment.ATTACHMENT);  
        anexo1.setDescription(Exemplo de arquivo anexo);
       
        anexo1.setName(frota.jasper);          
          
       
        
        // configura o email  
        MultiPartEmail email = new MultiPartEmail();  
        email.setHostName(smtp.gmail.com); // o servidor SMTP para envio do e-mail  
        email.addTo(autopostobonanza@homail.com, Guilherme); //destinatário  
        email.setFrom(rogeriowebteste@gmail.com, Eu); // remetente  
        email.setSubject(Teste -> Email com anexos); // assunto do e-mail  
        email.setMsg(Teste de Email utilizando commons-email); //conteudo do e-mail  
        email.setAuthentication(rogeriowebteste, xxxxxxx);  
        email.setSmtpPort(465);  
        email.setSSL(true);  
        email.setTLS(true);  
          
        // adiciona arquivo(s) anexo(s)  
        email.attach(anexo1);  
         
        // envia o email  
        email.send();  
    
		return ok;






é enviado o email do arquivo jasper, e nao do pdf como faço pra mandar o arquivo PDF gerado por email alguem tem uma luz?
Rogerio Reis

Rogerio Reis

Responder

Posts

16/04/2012

Davi Costa

Vc vai criar essa classe:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.activation.DataSource;

// statement DataSource
public class InputStreamDataSource implements DataSource {

private String name;
private String contentType;
private ByteArrayOutputStream baos;

InputStreamDataSource(String name, String contentType,
InputStream inputStream) throws IOException {
int read;
this.name = name;
this.contentType = contentType;

baos = new ByteArrayOutputStream();

byte[] buff = new byte[256];
while ((read = inputStream.read(buff)) != -1) {
baos.write(buff, 0, read);
}
}

public String getContentType() {
return contentType;
}

public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(baos.toByteArray());
}

public String getName() {
return name;
}

public OutputStream getOutputStream() throws IOException {
throw new IOException(Cannot write to this read-only resource);
}
}



E para mandar por email:

// cria e preenche a primeira parte da mensagem (Texto)
MimeBodyPart mbpTexto = new MimeBodyPart();
mbpTexto.setText(mensagem do email);
// Cria o Multipart e adiciona as partes da mensagem a ele
Multipart mp = new MimeMultipart();
mp.addBodyPart(mbpTexto);
// cria e preenche a segunda parte da mensagem (arq. anexo)
//input stream foi passado por parametro é um InputStream que vc pode pegar
if (inputStream != null){
DataSource ids = new InputStreamDataSource(nomeDoArquivo.pdf, application/octet-stream, inputStream);
DataHandler dh = new DataHandler(ids);
MimeBodyPart anexo = new MimeBodyPart();
anexo.setDataHandler(dh);
anexo.setFileName(email.getFileName());
mp.addBodyPart(anexo);
}
// Depois vc usa um objeto Message para mandar seu email e nele vc seta e (import javax.mail.Message;)
// Adiciona o Multipart a mensagem message.setContent(mp);
//e envia email através de Transport.send(mensagem); (import javax.mail.Transport;)



Vai ter só que dar uma pesquisada
Com o Jasper vc consegue o inputStream

att Davi
Responder

Gostei + 0

16/04/2012

Rogerio Reis

Não entendi mto nao, mas vou da uma pesquisada sobre e posto aki!!!! por enquanto obrigado
Responder

Gostei + 0

16/04/2012

Rogerio Reis

teria como explicar melhor o uso dessa classe em relação ao meu problema?
Responder

Gostei + 0

17/04/2012

Davi Costa

Com ela é possível vc fazer um meio de campo para passar o inputStream que o relatório do jasper gera para enviar por email.

De qualquer forma passando outra implementação mais simples para vc:

public void validarEmail(String email) throws Exception {
if(email == null || email.isEmpty()){
throw new Exception(E-mail não preenchido.);
}
Pattern padraoEmail = Pattern.compile(^[\\w-]+(\\.[\\w-]+)*@([\\w-]+\\.)+[a-zA-Z]{2,7}$);
Matcher ocorrencias = padraoEmail.matcher(email);
if (!ocorrencias.matches()) {
throw new Exception(O e-mail \ + email + \ é inválido.);
}
}

private InternetAddress[] criarListaInternetAddress(List<String> destinatarios) throws Exception {
InternetAddress[] lListaAddress = new InternetAddress[destinatarios.size()];
for (int i = 0; i < destinatarios.size(); i++) {
lListaAddress[i] = new InternetAddress(destinatarios.get(i));
}
return lListaAddress;
}

public void enviarEmail(List<String> destinatarios, String assunto, String conteudo, Map<String, InputStream> anexos) throws Exception {
configurarEmail();
validarEmail(emailOrigem);
//Foi comentado para validar somente na criação do contato para evitar o não envio dos destinatarios validos.
/*for (String destinatario : destinatarios) {
validarEmail(destinatario);
}*/
try {
// E-mail de Origem:
InternetAddress lAddressOrigem = new InternetAddress(emailOrigem, nomeUsuarioOrigem);
// E-mail(s) de Destino:
InternetAddress[] lListaAddressDestino = criarListaInternetAddress(destinatarios);

Session lSession = Session.getInstance(configuracaoEmail, null);
MimeMessage lMineMessage = new MimeMessage(lSession);
lMineMessage.setSentDate(new Date());
lMineMessage.setFrom(lAddressOrigem);
lMineMessage.addRecipients(Message.RecipientType.BCC, lListaAddressDestino);

// Assunto do e-mail:
lMineMessage.setSubject(assunto);
// add handlers for main MIME types
if (anexos == null || anexos.isEmpty()) {
// Conteúdo do e-mail:
lMineMessage.setContent(conteudo, text/html);

} else {
MimeMultipart lMultiPartRoot = new MimeMultipart(mixed);

// Cria o BodyPart do conteúdo do e-mail:
MimeBodyPart lBodyPartCorpo = new MimeBodyPart();
lBodyPartCorpo.setContent(conteudo, text/html);
lMultiPartRoot.addBodyPart(lBodyPartCorpo);

// Cria os BodyParts para os anexos do e-mail:
for (String nomeArquivo : anexos.keySet()) {
// Cria um arquivo temporário para o anexo:
File lArquivoTemporario = criarArquivoTemporario(anexos.get(nomeArquivo));
DataSource lFileDataSource = new FileDataSource(lArquivoTemporario);
// Cria o BodyPart do anexo:
MimeBodyPart lBodyPartAnexo = new MimeBodyPart();
lBodyPartAnexo.setDisposition(Part.ATTACHMENT);
lBodyPartAnexo.setDataHandler(new DataHandler(lFileDataSource));
lBodyPartAnexo.setFileName(nomeArquivo);
lMultiPartRoot.addBodyPart(lBodyPartAnexo);
}
lMineMessage.setContent(lMultiPartRoot);
}
lMineMessage.saveChanges();

// Conecta-se ao servidor e envia o e-mail:
Transport lTranportEnvio = lSession.getTransport(smtp);
lTranportEnvio.connect(smtpHost, smtpPort, emailOrigem, senhaUsuarioOrigem);
lTranportEnvio.sendMessage(lMineMessage, lMineMessage.getAllRecipients());
lTranportEnvio.close();
} catch (Exception pEx) {
throw new Exception(MSG_ERRO_INESPERADO, pEx);
}
}

public void enviarEmail(List<String> destinatarios, String assunto, String conteudo, InputStream anexo, String filename) throws Exception {
configurarEmail();
validarEmail(emailOrigem);
//Foi comentado para validar somente na criação do contato para evitar o não envio dos destinatarios validos.
/*for (String destinatario : destinatarios) {
validarEmail(destinatario);
}*/
try {
// E-mail de Origem:
InternetAddress lAddressOrigem = new InternetAddress(emailOrigem, nomeUsuarioOrigem);
// E-mail(s) de Destino:
InternetAddress[] lListaAddressDestino = criarListaInternetAddress(destinatarios);

Session lSession = Session.getInstance(configuracaoEmail, null);
MimeMessage lMineMessage = new MimeMessage(lSession);
lMineMessage.setSentDate(new Date());
lMineMessage.setFrom(lAddressOrigem);
lMineMessage.addRecipients(Message.RecipientType.BCC, lListaAddressDestino);

// Assunto do e-mail:
lMineMessage.setSubject(assunto);
// add handlers for main MIME types
if (anexo == null) {
// Conteúdo do e-mail:
lMineMessage.setContent(conteudo, text/html);

} else {
MimeMultipart lMultiPartRoot = new MimeMultipart(mixed);

// Cria o BodyPart do conteúdo do e-mail:
MimeBodyPart lBodyPartCorpo = new MimeBodyPart();
lBodyPartCorpo.setContent(conteudo, text/html);
lMultiPartRoot.addBodyPart(lBodyPartCorpo);

// Cria o BodyPart para o anexo do e-mail:
DataSource ids = new InputStreamDataSource(filename, application/octet-stream, anexo);
DataHandler dh = new DataHandler(ids);
MimeBodyPart lBodyPartAnexo = new MimeBodyPart();
lBodyPartAnexo.setDataHandler(dh);
lBodyPartAnexo.setFileName(filename);
lMultiPartRoot.addBodyPart(lBodyPartAnexo);
lMineMessage.setContent(lMultiPartRoot);
}
lMineMessage.saveChanges();

// Conecta-se ao servidor e envia o e-mail:
Transport lTranportEnvio = lSession.getTransport(smtp);
lTranportEnvio.connect(smtpHost, smtpPort, emailOrigem, senhaUsuarioOrigem);
lTranportEnvio.sendMessage(lMineMessage, lMineMessage.getAllRecipients());
lTranportEnvio.close();
} catch (Exception pEx) {
throw new Exception(MSG_ERRO_INESPERADO, pEx);
}
}

public void enviarEmail(List<String> destinatarios, String assunto, String conteudo, byte[] anexo, String filename) throws Exception {
configurarEmail();
validarEmail(emailOrigem);
//Foi comentado para validar somente na criação do contato para evitar o não envio dos destinatarios validos.
/*for (String destinatario : destinatarios) {
validarEmail(destinatario);
}*/
try {
// E-mail de Origem:
InternetAddress lAddressOrigem = new InternetAddress(emailOrigem, nomeUsuarioOrigem);
// E-mail(s) de Destino:
InternetAddress[] lListaAddressDestino = criarListaInternetAddress(destinatarios);

Session lSession = Session.getInstance(configuracaoEmail, null);
MimeMessage lMineMessage = new MimeMessage(lSession);
lMineMessage.setSentDate(new Date());
lMineMessage.setFrom(lAddressOrigem);
lMineMessage.addRecipients(Message.RecipientType.BCC, lListaAddressDestino);

// Assunto do e-mail:
lMineMessage.setSubject(assunto);
// add handlers for main MIME types
if (anexo == null) {
// Conteúdo do e-mail:
lMineMessage.setContent(conteudo, text/html);

} else {
MimeMultipart lMultiPartRoot = new MimeMultipart(mixed);

// Cria o BodyPart do conteúdo do e-mail:
MimeBodyPart lBodyPartCorpo = new MimeBodyPart();
lBodyPartCorpo.setContent(conteudo, text/html);
lMultiPartRoot.addBodyPart(lBodyPartCorpo);

// Cria o BodyPart para o anexo do e-mail:
DataSource ids = new InputStreamDataSource(filename, application/octet-stream, anexo);
DataHandler dh = new DataHandler(ids);
MimeBodyPart lBodyPartAnexo = new MimeBodyPart();
lBodyPartAnexo.setDataHandler(dh);
lBodyPartAnexo.setFileName(filename);
lMultiPartRoot.addBodyPart(lBodyPartAnexo);
lMineMessage.setContent(lMultiPartRoot);
}
lMineMessage.saveChanges();

// Conecta-se ao servidor e envia o e-mail:
Transport lTranportEnvio = lSession.getTransport(smtp);
lTranportEnvio.connect(smtpHost, smtpPort, emailOrigem, senhaUsuarioOrigem);
lTranportEnvio.sendMessage(lMineMessage, lMineMessage.getAllRecipients());
lTranportEnvio.close();
} catch (Exception pEx) {
throw new Exception(MSG_ERRO_INESPERADO, pEx);
}
}


/**
* Cria um arquivo temporário a partir do inputStream
*
* @param inputStream
* @return Arquivo temporário.
* @throws Exception
*/
private File criarArquivoTemporario(InputStream inputStream) throws Exception {
File arquivoTemporario = File.createTempFile(sgp, null);
arquivoTemporario.deleteOnExit();
FileOutputStream lFos = new FileOutputStream(arquivoTemporario);
int readByte;
while ((readByte = inputStream.read()) != -1) {
lFos.write(readByte);
}
lFos.close();
return arquivoTemporario;
}


att Davi

Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar