[RESOLVIDO]Problema de envio de email com API JavaMail

6 respostas
P

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

6 Respostas

C

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!

G
Tenho um pequeno exemplo que fiz:
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");
	}
}
P

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

P

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

P

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.

P

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

Criado 1 de abril de 2010
Ultima resposta 8 de abr. de 2010
Respostas 6
Participantes 4