[RESOLVIDO]Problema de envio de email com API JavaMail

Feras,

To tentando enviar um anexo com o seguinte código:


			MimeBodyPart messageAttachment = new MimeBodyPart();

			ByteArrayDataSource byteArrayDataSource = new ByteArrayDataSource(attachment,"application/octet-stream");
			messageAttachment.setDataHandler(new DataHandler(byteArrayDataSource));
			messageAttachment.setFileName(fileName);
			
			Multipart multipart = new MimeMultipart();
			multipart.addBodyPart(messagePart);
			multipart.addBodyPart(messageAttachment);

Mas na hora que chega na linha messageAttachment.setDataHandler(new DataHandler(byteArrayDataSource));, eu recebo a exceção:

Alguém tem alguma idéia do que pode ser?

Abraços

Quanto ao problema, não sei exatamente o que pode ser. Mas gostaria de te perguntar se você precisa usar a JavaMail API no teu código. Existe uma API chamada Commons Email API do pessoal da Apache que facilita bastante o processo do envio de e-mail. Caso você não conheça, sugiro que dê uma olhada.

Escrevi um post uma vez sobre esse assunto no meu blog. Se tiver interesse, o link é http://www.softblue.com.br/blog/home/postid/1/ENVIANDO+EMAILS+NO+JAVA.

Abraço!

Tenho um pequeno exemplo que fiz:

[code]package main;
import java.util.Date;
import java.util.Properties;
import info.clearthought.layout.TableLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.WindowConstants;

@SuppressWarnings(“serial”)
public class SendEmail extends javax.swing.JFrame {

{
	//Set Look & Feel
	try {
		javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
	} catch(Exception e) {
		e.printStackTrace();
	}
}
private JLabel lbSeuNome;
private JLabel lbSeuEmail;
private JLabel lbDest;
public static JTextField tfNomeRemet;
public static JCheckBox ckEternamente;
public static JTextField tfQtde;
private JLabel lbQtde;
private JPanel paQtde;
public static JTextField tfPorta;
private JLabel lbPorta;
public static JComboBox cbServidores;
private JLabel lbServidor;
private static JTextField tfAnexo;
private JButton btAnexar;
private JLabel lbAnexo;
public static JTextField tfAssunto;
private JLabel lbAssunto;
public static JTextField tfDestEmail;
public static JTextField tfDestNome;
public static JPasswordField pfRemetSenha;
public static JTextField tfEmailRemet;
private JButton btLimpar;
public static JButton btEnviar;
private JPanel paBotoes;
public static JTextPane tpBody;
private JScrollPane spBody;
private JLabel lbParaEmail;
private JLabel lbSuaSenha;

/**
 * Auto-generated main method to display this JFrame
 */
public static void main(String[] args) {	

	SendEmail inst = new SendEmail();
	inst.setLocationRelativeTo(null);
	inst.setVisible(true);
}

public SendEmail() {
	try {
		this.setTitle("EMAIL");

		TableLayout thisLayout = new TableLayout(new double[][] {{7.0, 125.0, 307.0, 179.0, 100.0, TableLayout.FILL, 7.0}, {7.0, 33.0, 34.0, 33.0, 23.0, 34.0, 34.0, 32.0, 27.0, 30.0, 149.0, 74.0, TableLayout.FILL, 7.0}});
		thisLayout.setHGap(5);
		thisLayout.setVGap(5);
		getContentPane().setLayout(thisLayout);
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		{
			lbSeuNome = new JLabel();
			getContentPane().add(lbSeuNome, "1, 1");
			lbSeuNome.setText("Seu nome:");
		}
		{
			lbSeuEmail = new JLabel();
			getContentPane().add(lbSeuEmail, "1, 2");
			lbSeuEmail.setText("Seu e-mail:");
		}
		{
			lbSuaSenha = new JLabel();
			getContentPane().add(lbSuaSenha, "1, 3");
			lbSuaSenha.setText("Sua senha:");
		}
		{
			lbDest = new JLabel();
			getContentPane().add(lbDest, "1, 5");
			lbDest.setText("Nome do destinatario");
		}
		{
			lbParaEmail = new JLabel();
			getContentPane().add(lbParaEmail, "1, 6");
			lbParaEmail.setText("E-mail de destino");
		}
		{
			spBody = new JScrollPane();
			getContentPane().add(spBody, "1, 10, 5, 10");
			{
				tpBody = new JTextPane();
				spBody.setViewportView(tpBody);
				tpBody.setPreferredSize(new java.awt.Dimension(754, 221));
			}
		}
		{
			paBotoes = new JPanel();
			getContentPane().add(paBotoes, "1, 12, 5, 12");
			{
				btEnviar = new JButton();
				paBotoes.add(btEnviar);
				btEnviar.setText("Enviar");
				btEnviar.setPreferredSize(new java.awt.Dimension(120, 25));
				btEnviar.addActionListener(new ActionListener() {
					@SuppressWarnings("deprecation")
					public void actionPerformed(ActionEvent evt) {
						if (validaCampos())
						{
							try{
								enviarEmail(tfDestEmail.getText(), tfDestNome.getText(), tfEmailRemet.getText(), tfNomeRemet.getText(), tfAssunto.getText(), tpBody.getText(),cbServidores.getSelectedItem().toString(), tfEmailRemet.getText(), pfRemetSenha.getText(),tfPorta.getText(),Integer.parseInt(tfQtde.getText()), ckEternamente.isSelected());
							}
							catch(Exception ex)
							{
								ex.printStackTrace();
							}
						}
						else
						{
							JOptionPane.showMessageDialog(null, "Preencha todos os campos corretamente", "E-mail", JOptionPane.WARNING_MESSAGE);
						}
					}
				});
			}
			{
				btLimpar = new JButton();
				paBotoes.add(btLimpar);
				btLimpar.setText("Limpar");
				btLimpar.setPreferredSize(new java.awt.Dimension(118, 25));
				btLimpar.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent evt) {
						limpar();
					}
				});
			}
		}
		{
			tfNomeRemet = new JTextField();
			getContentPane().add(tfNomeRemet, "2, 1, 5, 1");
			tfNomeRemet.setText("Conde Dracula...");
		}
		{
			tfEmailRemet = new JTextField();
			getContentPane().add(tfEmailRemet, "2, 2, 5, 2");
		}
		{
			pfRemetSenha = new JPasswordField();
			getContentPane().add(pfRemetSenha, "2, 3, 5, 3");
		}
		{
			tfDestNome = new JTextField();
			getContentPane().add(tfDestNome, "2, 5, 5, 5");
		}
		{
			tfDestEmail = new JTextField();
			getContentPane().add(tfDestEmail, "2, 6, 5, 6");
		}
		{
			lbAssunto = new JLabel();
			getContentPane().add(lbAssunto, "1, 7");
			lbAssunto.setText("Assunto:");
		}
		{
			tfAssunto = new JTextField();
			getContentPane().add(tfAssunto, "2, 7, 5, 7");
			
		}
		{
			lbAnexo = new JLabel();
			getContentPane().add(lbAnexo, "1, 9");
			lbAnexo.setText("Anexo");
		}
		{
			btAnexar = new JButton();
			getContentPane().add(btAnexar, "5, 9");
			btAnexar.setText("...");
			btAnexar.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent evt) {

					JFileChooser fileChooser = new JFileChooser();
					fileChooser.setDialogTitle("Anexar");
					fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
					while(true)
					{
						int a = fileChooser.showOpenDialog(null);
						// Se a for igual a zero e porque o usuario clicou em salvar, se for 1 e porque clicou em cancelar
						if (a==0)
						{	
							String arquivo = fileChooser.getSelectedFile().getAbsolutePath();// Aqui estou pegando o nome do arquivo e o endereco dele
							tfAnexo.setText(arquivo);
							break;
						}
						else
						{
							break;
						}
					}
				}
			});
		}
		{
			tfAnexo = new JTextField();
			getContentPane().add(tfAnexo, "2, 9, 4, 9");
			tfAnexo.setEnabled(false);
		}
		{
			lbServidor = new JLabel();
			getContentPane().add(lbServidor, "1, 8");
			lbServidor.setText("Servidor:");
		}
		{
			ComboBoxModel cbServidoresModel = 
				new DefaultComboBoxModel(
						new String[] { "smtp.live.com", "smtp.mail.yahoo.com.br" });
			cbServidores = new JComboBox();
			getContentPane().add(cbServidores, "2, 8");
			cbServidores.setModel(cbServidoresModel);
			cbServidores.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent evt) {
					if (cbServidores.getSelectedIndex()== 0)
					{
						tfPorta.setText("25");
					}
					else
					{
						tfPorta.setText("");
					}
				}
			});
		}
		{
			lbPorta = new JLabel();
			getContentPane().add(lbPorta, "3, 8");
			lbPorta.setText("Porta (para yahoo! n\u00e3o precisa):");
		}
		{
			tfPorta = new JTextField();
			getContentPane().add(tfPorta, "4, 8, 5, 8");
			tfPorta.setText("25");
		}
		{
			paQtde = new JPanel();
			getContentPane().add(paQtde, "1, 11, 5, 11");
			{
				lbQtde = new JLabel();
				paQtde.add(lbQtde);
				lbQtde.setText("Qtde de emails a enviar:");
				lbQtde.setPreferredSize(new java.awt.Dimension(145, 14));
			}
			{
				tfQtde = new JTextField();
				paQtde.add(tfQtde);
				tfQtde.setText("1");
				tfQtde.setPreferredSize(new java.awt.Dimension(647, 28));
				tfQtde.addKeyListener(new KeyListener() {

					@Override
					public void keyPressed(KeyEvent arg0) {
						// TODO Auto-generated method stub
						try
						{
							Long.parseLong(tfQtde.getText());	
						}
						catch(Exception ex)
						{
							tfQtde.setText("1");
						}
					}

					@Override
					public void keyReleased(KeyEvent arg0) {
						// TODO Auto-generated method stub
						try
						{
							Long.parseLong(tfQtde.getText());	
						}
						catch(Exception ex)
						{
							tfQtde.setText("1");
						}
					}

					@Override
					public void keyTyped(KeyEvent arg0) {
						// TODO Auto-generated method stub
						try
						{
							Long.parseLong(tfQtde.getText());	
						}
						catch(Exception ex)
						{
							tfQtde.setText("1");
						}
					}
				});
			}
			{
				ckEternamente = new JCheckBox();
				paQtde.add(ckEternamente);
				
				ckEternamente.setPreferredSize(new java.awt.Dimension(253, 18));
				ckEternamente.setVisible(false);
			}
		}
		//this.setSize(800,600);
		this.setSize(800,650);

	} catch (Exception e) {
		e.printStackTrace();
	}
}
public static void enviarEmail(String emailDest, String nomeDest,
		String emailRemet, String nomeRemet, String assunto, String corpo,String servidor,final String user, final String password,String porta,int qtde,boolean forever)
throws Exception {

	Properties props = System.getProperties();
	props.put("mail.smtp.host", servidor);
	props.put("mail.smtp.auth", "true");
	props.put ( "mail.smtp.starttls.enable", "true");
	props.put("mail.stmtp.port",porta);
	props.put("mail.mime.charset", "ISO-8859-1"); 

	Authenticator auth = new Authenticator() {
		public PasswordAuthentication getPasswordAuthentication() {
			return new PasswordAuthentication(user, password);
		}};

		Session session = Session.getInstance(props, auth);
		MimeMessage message = new MimeMessage(session);
		message.setFrom(new InternetAddress(emailRemet, nomeRemet));
		message.addRecipient(Message.RecipientType.TO,
				new InternetAddress(emailDest, nomeDest));
		message.setSubject(assunto);
		// cria a primeira parte da mensagem

		MimeBodyPart mbp1 = new MimeBodyPart();
		mbp1.setText(corpo);

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

		if (tfAnexo.getText().length()>0){
			// anexa o arquivo na mensagem
			FileDataSource fds = new FileDataSource(tfAnexo.getText());
			mbp2.setDataHandler(new DataHandler(fds));
			mbp2.setFileName(fds.getName());
		}

		// cria a Multipart
		Multipart mp = new MimeMultipart();
		mp.addBodyPart(mbp1);
		if (tfAnexo.getText().length()>0){
			mp.addBodyPart(mbp2);
		}

		// adiciona a Multipart na mensagem
		message.setContent(mp);

		// configura a data: cabecalho
		message.setSentDate(new Date());
		
		tpBody.setText("");
		if (forever)
		{
			
			while (true)
			{
				// envia a mensagem
				Transport.send(message);
				
			}
		}  
		else
		{
			for (int i=0;i<qtde;i++){
				// envia a mensagem
				Transport.send(message);
				
			}
		}
		//message.setContent(corpo, "text/plain");

		/*if (tfAnexo.getText().length()>0)
	{
		// anexa o arquivo na mensagem
      FileDataSource fds = new FileDataSource(tfAnexo.getText());
      message.setDataHandler(new DataHandler(fds));
      message.setFileName(fds.getName());
	}*/

		//Transport.send(message);
		JOptionPane.showMessageDialog(null, "PARABENS", "MAIL", JOptionPane.WARNING_MESSAGE);
		btEnviar.setText("Enviar");
}
@SuppressWarnings("deprecation")
public boolean validaCampos()
{
	boolean ok = true;
	if (tfDestEmail.getText().length()==0)
		ok = false;
	else if (tfDestNome.getText().length()==0)
		ok = false;
	else if (tfEmailRemet.getText().length()==0)
		ok = false;
	else if (tfNomeRemet.getText().length()==0)
		ok = false;
	else if (pfRemetSenha.getText().length()==0)
		ok = false;
	if (tfQtde.getText().equals("") || tfQtde.getText().equals("1"))
	{
		
		tfQtde.setText("1");
	}
	return ok;
}
public static void limpar()
{
	tfAnexo.setText("");
	tfAssunto.setText("");
	tfDestEmail.setText("");
	tfDestNome.setText("");
	tfEmailRemet.setText("");
	tfNomeRemet.setText("");
	tfPorta.setText("25");
	tfQtde.setText("1");
	cbServidores.setSelectedIndex(0);
	tpBody.setText("");
	btEnviar.setText("Enviar");
}

}
[/code]

Cara, parece ser um problema bizarro de classloader. Verifique seu classpath e remova TUDO o que vc não estiver usando.

Pessoal…desculpa a demora pra responder!

Obrigado pelo exemplo, mas esta da mesma maneira que eu utilizo =)

Quanto ao apache commons-mail, eu já tentei e deu exatamente o mesmo problema.

peczenyj, eu não sei mais o que fazer com relação ao classloader…no meu build path só tem os jars q estou utilizando na aplicação

Abraço

Galera, depois de muita briga eu descobri que esse classloader maluco está ocorrendo por que está dentro de um WAR.

Criei um EAR, EJBs desnecessarios e empacotei o envio de email dentro de um JAR e o negócio funcionou que é uma beleza!

Não tem como mandar do WAR? É um projeto super pequeno que não necessita de EJBs ou JPA.

Resolvido…removi TUDO que era jar do projeto…até os que eu usava e deixei ele buscar os que vinham por padrão no jbos** :smiley:

Valeu