Java Mail anexo com problemas [RESOLVIDO]

11 respostas
T

Olá galera estou com um problema na API JavaMail que não consigo resolver...
Qdo anexo um pdf ele volta assim...

------=_Part_10_32628960.1251038363795
Content-Type: text/plain; name=anexo.pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=anexo.pdf
 
JVBERi0xLjQKJeLjz9MKMyAwIG9iaiA8PC9UeXBlL1hPYmplY3QvQ29sb3JTcGFjZS9EZXZpY2VS
R0IvU3VidHlwZS9JbWFnZS9CaXRzUGVyQ29tcG9uZW50IDgvV2lkdGggMTcyL0xlbmd0aCA0MTk3
L0hlaWdodCA4NS9GaWx0ZXIvRENURGVjb2RlPj5zdHJlYW0K/9j/4AAQSkZJRgABAQEBLAEsAAD/
2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0
Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABVAKwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEA
AAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJx
FDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNk
ZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJ
Tenho a inplementacao do DataSource
public class InputStreamDataSource implements DataSource {

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

    public 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() {
        System.out.println("ContentType->>>" + contentType);
        return contentType;
    }

    public InputStream getInputStream() throws IOException {
        // TODO Auto-generated method stub
        return new ByteArrayInputStream(baos.toByteArray());
    }

    public String getName() {
        // TODO Auto-generated method stub
        return name;
    }

    public OutputStream getOutputStream() throws IOException {
        // TODO Auto-generated method stub
        throw new IOException("Cannot write to this read-only resource");
    }
}

Pego os bytes[] do pdf

ByteArrayInputStream attachStream = new ByteArrayInputStream(bts);
        //call constructor class:InputStreamDataSource

e esse é o metodo para envio
[code]protected void sendMail(InputStreamDataSource attach, Usuario usuario, Fornecedor fornecedor) throws IOException {
        Session session = Session.getInstance(props, new MailAuthenticator(usuario.getUsuario(), usuario.getEmailSenha()));

        try {
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(usuario.getEmail()));
            InternetAddress[] address = {new InternetAddress(fornecedor.getEmail())};
            msg.setRecipients(Message.RecipientType.TO, address);
            msg.setSubject("Assunto teste.");

            MimeBodyPart bp1 = new MimeBodyPart();
            bp1.setText("Texto teste.");


            MimeBodyPart bp2 = new MimeBodyPart();
            bp2.setDataHandler(new DataHandler(attach));
            bp2.setFileName(attach.getName());
      

            Multipart mp = new MimeMultipart();
            mp.addBodyPart(bp2);
            mp.addBodyPart(bp1);


            msg.setContent(mp);
            msg.setSentDate(new Date());

            Transport.send(msg);
            System.out.println("Email enviado com sucesso !");

        } catch (MessagingException mex) {
            mex.printStackTrace();
            Exception ex = null;
            if ((ex = mex.getNextException()) != null) {
                ex.printStackTrace();
            }
        }
    }

Se alguem puder me ajudar, desde já agredeço...
InputStreamDataSource isds = new InputStreamDataSource("anexo.pdf", "application/pdf", attachStream);[/code]

11 Respostas

T

ninguém ?

L

Vc está fazendo isso apartir de um formulario web?

T

Não nao estou fazeendo de um formulario Web…

Estou fazendo de um servlet msm. O pior é que qdo eu rodo o serlvet a partir daminha maquina ele manda o anexo, normal.
Mas quando coloco no servidor ele anexa dessa forma aí.

Será que é alguma configuração do Tomcat?

L

Nome caso eu envio o arquivo por upload e uso esse trecho de código para anexar o arquivo que está em disco no servidor e envia-lo por email

mbp2 = new MimeBodyPart();
		FileDataSource fds = new FileDataSource(getServletContext().getRealPath("/") + nomeArquivo);
		mbp2.setDataHandler(new DataHandler(fds));
		mbp2.setFileName(fds.getName());
		mbp2.setFileName("nomeArquivo"));
		mp.addBodyPart(mbp2);
		message.setContent(mp);
		Transport.send(message);
T

Já tentei isso também. O que acontece é que no Tomcat local, funciona, mas no Tomcat do Servidor ele envia o anexo desse jeito aí.
Já tentei usar a biblioteca do Commons-mail, e também deu a mesma coisa, só pode ser alguem coisa no Tomcat, mas o que será?

T

Já tentei isso também. O que acontece é que no Tomcat local, funciona, mas no Tomcat do Servidor ele envia o anexo desse jeito aí.
Já tentei usar a biblioteca do Commons-mail, e também deu a mesma coisa, só pode ser alguem coisa no Tomcat, mas o que será?

L

cara eu gero em pdf salvo no disco e envio funciona normalmente, veja:
http://www.guj.com.br/posts/list/133903.java#720780

T

Igweb,

Obrigado pela ajuda. Veja bem no meu computador, com o Tomcat local ele envia o e-mail, normal.
Já mudei esse código aí em cima. Simplifiquei um pouco.

public void send(Message msg) throws NoSuchProviderException, MessagingException, IOException {
        this.msg = msg;
        Session mailSession = Session.getInstance(this.props, auth);
        mailSession.setDebug(false);

        message = new MimeMessage(mailSession);
        message.setFrom(new InternetAddress(msg.getMailFrom()));
        InternetAddress[] address = {new InternetAddress(msg.getMailTo())};
        message.setRecipients(javax.mail.Message.RecipientType.TO, address);
        message.setSubject(msg.getSubject());

        MimeBodyPart mbp1 = new MimeBodyPart();
        mbp1.setText(msg.getContents());


        MimeBodyPart mbp2 = new MimeBodyPart();

   mbp2.setDataHandler(new DataHandler(new ByteArrayDataSource(msg.getBytes(), "application/x-any")));
        mbp2.setFileName("p.pdf");
        mbp2.setDisposition(Part.ATTACHMENT);


        Multipart mp = new MimeMultipart();
        mp.addBodyPart(mbp1);
        mp.addBodyPart(mbp2);

        message.setContent(mp);

        message.setSentDate(new Date());
        message.saveChanges();


        Transport.send(message);

Já perdi q conta de qtos vezes mudei esse código. Ah lembrando que eu não estou gravbando o arquivo PDf em disco, ele é um relatório gerado pelo jasper.

Já tentei anexá-lo como um pdf físico, mas ele dá o mesmo erro. Anexa o arquivo dequele jeito.

T

Galera, tô pensando em posta isso no site do Javamail…

T

Depois de muito pesquisar, testar… o problema era a versao da JRE que o servidor estava usando, 1.3, meio antiga…

Atualizei e tudo funciounou… que beleza.

Fica aqui a dica, veja sempre qual JRE seu Tomcat está usando.

Valeu galera.

C

Galera… to tendo problemas aqui, mas estou utilizando somente a API Javamail mesmo, versão 1.3

O que acontece é o seguinte, já tentei com vários códigos que peguei na net por aí, mas meu e-mail nunca chega com anexo.
Na verdade o anexo chega no corpo em forma de texto, assim:

------=_Part_0_4875744.1272501496859
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Textando texto no meio
------=_Part_0_4875744.1272501496859
Content-Type: text/plain; name="C:\arquivo_em_anexo.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="C:\arquivo_em_anexo.txt"

conteudo do arquivo em anexo 123
conteudo do arquivo em anexo 456
conteudo do arquivo em anexo 789
conteudo do arquivo em anexo 012
conteudo do arquivo em anexo 345
------=_Part_0_4875744.1272501496859--

O código java que estou utilizando é o seguinte:

Session session = Session.getInstance(p, null);

			Message message = new MimeMessage(session);
			message.setFrom(new InternetAddress("[email removido]"));
			message.addRecipient(Message.RecipientType.TO, new InternetAddress("[email removido]"));
			message.setSubject("Hello JavaMail Attachment");

			BodyPart messageBodyPart = new MimeBodyPart();

			messageBodyPart.setText("Textando texto no meio");

			Multipart multipart = new MimeMultipart();
			multipart.addBodyPart(messageBodyPart);

			messageBodyPart = new MimeBodyPart();
			DataSource source = new FileDataSource("C:\arquivo_em_anexo.txt");
			messageBodyPart.setDataHandler(new DataHandler(source));
			messageBodyPart.setFileName("C:\arquivo_em_anexo.txt");
			multipart.addBodyPart(messageBodyPart);

			message.setContent(multipart);

			Transport tr = session.getTransport("smtp");
			tr.connect(host, fromAccount, password);
			tr.sendMessage(message, message.getAllRecipients());
			tr.close();

Detalhe: estou utilizando um exemplo da própria SUN… http://java.sun.com/developer/onlineTraining/JavaMail/contents.html#SendingAttachments

Já estou há dois dias vendo isso, sei lá, deve ser uma coisa pequena, mas já tentei com vários outros códigos e nada.

Alguém sabe o que pode estar acontecendo???

Valeu galera.

Criado 23 de agosto de 2009
Ultima resposta 28 de abr. de 2010
Respostas 11
Participantes 4