Anexo com javaMail [Resolvido]

O probrema está nesse trecho do código:

[code]MimeBodyPart mbp1 = new MimeBodyPart();
msg.setText(text);

// cria a segunda parte da mensage
MimeBodyPart mbp2 = new MimeBodyPart();

   // anexa o arquivo na mensagem
FileDataSource source = new FileDataSource(
		"/home/tcarvalho/Desktop/newfile.txt");
mbp2.setDataHandler(new DataHandler(source));
mbp2.setFileName(source.getName());[/code]

Fiz um teste rodando com java application e deu tudo certo, enviou a mensagem com o anexo.
Só que quando eu faço o deploy da aplicação no apache Geronimo ocorre:

javax.mail.MessagingException: IOException while sending message; nested exception is: java.io.IOException: No content

Gostaria de saber se eu tenho que fazer um upload do arquivo para o servidor?

Vou tentar ser mais específico…
agora tentei fazer o upload.

O problema é so quando eu instalo a webapp no application server.
Tentei fazer um upload no meu servlet usando multipart/form-data:

pw.println("<form name='upload' method='POST' enctype='multipart/form-data' action='" + response.encodeURL(request.getContextPath() + "/wm/Attach") + "'>"); pw.println("<input type='file' name='file'>"); pw.println("<input type='submit' name='upload' value='Upload'>"); pw.println("</form>");

Não sei como fazer para anexar, pois o erro:
javax.mail.MessagingException: IOException while sending message; nested exception is: java.io.IOException: No content

é porque realmente o caminho não existe pois eu não estou testando na minha maquina local.
O que eu queria saber e como posso pegar o arquivo enviado e colocar em FileDataSource(???)

    // anexa o arquivo na mensagem  
     FileDataSource source = new FileDataSource(???????????);  
     mbp2.setDataHandler(new DataHandler(source));  
     mbp2.setFileName(source.getName()); 

Qualquer ajuda é válida!

Ta usando o commons mail para enviar emails?
Se não tiver dá uma olhada nele pq ele facilita pra caramba a tarefa de anexar arquivos.

Não estou, mas dei uma olhada na API e acho que terei o mesmo problema com o caminho do anexo,
pois não testarei localmente.

EmailAttachment attachment = new EmailAttachment();
  attachment.setPath("/home/tcarvalho/Desktop/newfile.txt");

Pois como mostrei eu quero pegar o anexo no meu servlet:

 pw.println("<form name='upload' method='POST' enctype='multipart/form-data' action='"  
                             + response.encodeURL(request.getContextPath()  
                                     + "/wm/Attach") + "'>");  
             pw.println("<input type='file' name='file'>");  
             pw.println("<input type='submit' name='upload' value='Upload'>");  
             pw.println("</form>");

Eu não quero colocar o caminho, quero fazer um upload e depois anexar o arquivo no Email.

salva o arquivo uploadado em algum lugar temporario.
e então parametriza o caminho. Se for local usa um se for no servidor usa outro.

Entao cara, vc realmente precisa salvar o arquivo em disco?
Imagine se dois usuarios executarem isso ao msm tempo?
Quital montar o anexo com o arquivo empregadavetor de bytes?
Seria mais seguro e vc nao depende de acesso ao disco etc e tal…
Sei como te ajudar nisso, mas preciso estar na minha maquina pra isso. Amanha posto aqui pra vc, ok?

Beleza!
Estarei aguardando. :lol:

Ta aqui cara, vou por comentários pra explicar:

byte[] anexo = criaAnexo(); //seu anexo em vetor de bytes (adote a estrategia de conversão que melhor lhe convir)

MimeBodyPart partPhoto = new MimeBodyPart(); //cria seu bodypart normalmente
partPhoto.setDataHandler(new DataHandler(new ByteArrayDataSource(anexo, "aplication/pdf"))); //note o ByteArrayDataSource, esse é o pulo do gato. Vc diz qual é o seu anexo (o vetor de bytes) e o mime type dele, no meu caso foi um pdf
partPhoto.setFileName("MeuAnexo.pdf"); //diz o nome que vc quer que seu anexo vá, senao fica um nome zuadissimo.

Cara, é isso, muito simples!
O que demorei pra encontrar foi esse ByteArrayDataSource, é ai que ta o pulo do gato! Ele é do pacote javax.mail.util.ByteArrayDataSource.

Espero que lhe seja util, abraços!

Problema resolvido!
Estava dando erro com o vetor de bytes que eu mesmo tinha implementado para o upload do arquivo, resolvi seguir a dica do furutani e usei Commons FileUpload
ficou assim:

items = upload.parseRequest(request);
iterator iter = items.iterator();
item = (FileItem) iter.next();

item.get() retorna byte [ ] e o ContentType resolve o problema do tipo

MimeBodyPart parte2 = new MimeBodyPart();
anexo.setDataHandler(new DataHandler(new ByteArrayDataSource(item.get(), item.getContentType())));

Valeu galera! :smiley:

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("gp@hwhost.com.br"));
			message.addRecipient(Message.RecipientType.TO, new InternetAddress("teste@gmail.com"));
			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.

Carlos, você deveria retirar esse trecho:

tr.connect(host, fromAccount, password);  
tr.sendMessage(message, message.getAllRecipients());  

Você já deveria ter setado o host na Properties, não sei se você fez isso.
Depois é só chamar o método estático send de Transpote.
Ficando assim:

Properties p = System.getProperties();
p.put("mail.smtp.host", host);
   
Session session = Session.getInstance(p, null);  
      
Message message = new MimeMessage(session);  
message.setFrom(new InternetAddress("gp@hwhost.com.br"));  
message.addRecipient(Message.RecipientType.TO, new InternetAddress("teste@gmail.com"));  
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.send(message); 

Tenta aí e diz o que acontece com o teu email.