Enviar email com anexo [Resolvido]

Boa tarde! Implementei minha classe Email pra mandar emails, duh! Tá funcionando legal, só que agora queria também enviar um anexo junto com a mensagem. Alguma luz? Estou usando struts 2 e java 6.

[code]public static void sendEmail(List to, String subject, String body) {
Properties p = getProps();

    Authenticator auth = new SMTPAuthenticator();
	
	Session session = Session.getInstance(p, auth);
	MimeMessage msg = new MimeMessage(session);

	try {
		// "de" e "para"!!
		msg.setFrom(new InternetAddress("mdapp@mobilescience.mobi"));
		
		InternetAddress [] emails = new InternetAddress[to.size()];
		int i = 0;
		for (Iterator iterator = to.iterator(); iterator.hasNext();) {
			String toAddr = (String) iterator.next();
			emails[i] = new InternetAddress(toAddr);
			i++;
		}
		//msg.setRecipient(Message.RecipientType.TO, new InternetAddress("henriqueor@terra.com.br"));
		msg.setRecipients(Message.RecipientType.TO, emails);
		msg.setSentDate(new Date());
		msg.setSubject(subject);
		msg.setText(body);

		// enviando mensagem
		Transport.send(msg);
	} catch (AddressException e) {
		e.printStackTrace();
	} catch (MessagingException e) {
		e.printStackTrace();
	}
	System.out.println("Enviado com sucesso!");
}[/code]

Mandar anexos é possível com o JavaMail puro, mas requer você ler atentamente tanto a documentação do javamail, quanto você entender o formato MIME, o que provavelmente irá requerer você ler algumas RFCs e fazer muitos testes para ver se está funcionando tudo direitinho (acredite, eu já fiz isso e é muito chato).
Se você não tiver tanta paciência ou tempo assim, use o Jakarta Apache Commons Email, que é um encapsulamento do JavaMail de forma que você não precisa conhecer esses detalhes sangrentos.

http://commons.apache.org/email/

Com o javamail , dê uma pesquisada sobre as classes

        MimeMultipart 
        MimeMultipart  
        MimeBodyPart

que são utilizadas para anexar arquivos no email

Boa tarde! Ok, está feito. Demorei mais tempo achando os jars do que implementando o código. Usei o MimeBodyPart e o Multipart. Vlw!

Quem quiser dar uma olhada…

[code]
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Part;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.Multipart;

import org.apache.commons.mail.*;

public class Email {
public static void sendAttachEmail(List to, String subject, String body, String attach)
{
Properties p = getProps();

    Authenticator auth = new SMTPAuthenticator();
	
	Session session = Session.getInstance(p, auth);
	MimeMessage msg = new MimeMessage(session);
	MimeBodyPart mbp = new MimeBodyPart();

	try {
		// "de" e "para"!!
		msg.setFrom(new InternetAddress("mdapp@mobilescience.mobi"));
		
		InternetAddress [] emails = new InternetAddress[to.size()];
		int i = 0;
		for (Iterator iterator = to.iterator(); iterator.hasNext();) {
			String toAddr = (String) iterator.next();
			emails[i] = new InternetAddress(toAddr);
			i++;
		}
		msg.setRecipients(Message.RecipientType.TO, emails);
		msg.setSentDate(new Date());
		msg.setSubject(subject);
		msg.setText(body);
		
		//enviando anexo
		DataSource fds = new FileDataSource(attach);
		mbp.setDisposition(Part.ATTACHMENT);
		mbp.setDataHandler(new DataHandler(fds));
		mbp.setFileName(fds.getName());
		
		
                                            Multipart mp = new MimeMultipart();   
		mp.addBodyPart(mbp);
		msg.setContent(mp);
		
		// enviando mensagem
		Transport.send(msg);
	} catch (AddressException e) {
		e.printStackTrace();
	} catch (MessagingException e) {
		e.printStackTrace();
	}
	System.out.println("Enviado com sucesso!");
}

private static Properties getProps() {
	Properties p = new Properties();		
	p.put("mail.transport.protocol", "smtp");
	p.put("mail.smtp.starttls.enable","true");
    p.put("mail.smtp.host", "smtp.gmail.com");
    p.put("mail.smtp.auth", "true");
    
    return p;
}

}

class SMTPAuthenticator extends javax.mail.Authenticator {

public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication ("mdapp@mobilescience.mobi", "marketd");
}

}[/code]

Opa, e como eu coloco o tópico como resolvido? Usuário é fogo… hehe!

1 curtida

Edite o título de seu tópico (infelizmente não há nenhum botãozinho)