Enviar email com anexo [Resolvido]

4 respostas
F

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.

public static void sendEmail(List<String> 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("[email removido]"));
			
			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("[email removido]"));
			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!");
	}

4 Respostas

T

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/

L

Com o javamail , dê uma pesquisada sobre as classes

MimeMultipart 
        MimeMultipart  
        MimeBodyPart

que são utilizadas para anexar arquivos no email

F

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...

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<String> 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("[email removido]"));
			
			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 ("[email removido]", "marketd");
	}
}

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

T

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

Criado 25 de setembro de 2008
Ultima resposta 25 de set. de 2008
Respostas 4
Participantes 3