Problema com JavaMail

3 respostas
mateusviccari
Pessoal, tenho um programa que envia sempre 3 anexos para uma lista de emails, porem venho reparando que as vezes funciona e as vezes nao funciona, mesmo sem ter mexido no código. O erro que da é esse aqui:
com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388)
o código que eu uso pra mandar o email:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Classes;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
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.JOptionPane;

/**
 *
 * @author adm
 */
public class EnviarEmail {

    /**
     * @param args the command line arguments
     */
    public static String lista=Configs_Etc.CarregarConfiguracoes.emailsEnviar; //lista vai guardar tipo [email removido];[email removido];[email removido]
    String from = Configs_Etc.CarregarConfiguracoes.emailEmail;
    String host = Configs_Etc.CarregarConfiguracoes.emailHost;
    
    public void enviarEmailAnexos() throws Exception {
        String nomeArquivoXmlAssinado=Telas.EnviarNFe_Integrador.nomeArquivoXmlAssinado;
        String filename = nomeArquivoXmlAssinado.substring(0,nomeArquivoXmlAssinado.indexOf("-env-lot.xml")) + "-procNFe.xml";
        String filename2 = nomeArquivoXmlAssinado.substring(0,nomeArquivoXmlAssinado.indexOf("-env-lot.xml")) + ".pdf";
        String filename3 = nomeArquivoXmlAssinado;
        
        //aqui vai botar o numero da nfe no email.
        String msgText1 = Configs_Etc.CarregarConfiguracoes.emailCorpo;
        msgText1=msgText1.replaceAll("%numeronfe",Telas.EnviarNFe_Integrador.numeronfe);
        String subject = Configs_Etc.CarregarConfiguracoes.emailTitulo;
        subject=subject.replaceAll("%numeronfe",Telas.EnviarNFe_Integrador.numeronfe);
        
        ArrayList teste=new ArrayList();
        //criar lista de emails no arraylist e depois passar ele pra um vetor de InternetAddress
        String[] listaEmails = lista.split(";"); //essa vai ser um vetor com cada email em uma posição
        System.out.println(lista);
        for(int i=0;i<listaEmails.length;i++){
            System.out.println(listaEmails[i]);
            //JOptionPane.showMessageDialog(null,listaEmails[i]);
            teste.add(new InternetAddress(listaEmails[i]));
        }
        //remover emails repetidos e tal, pq as vez se configura o email do remetente junto com o remetente e
        //o mesmo email pode ta no destinatario. isso acontece pq hashset nao permite vlres repetidos.
        HashSet teste2=new HashSet();
        teste2.addAll(teste);
        teste.clear();
        teste.addAll(teste2);
        InternetAddress[] vetor=(InternetAddress[])teste.toArray(new InternetAddress[teste.size()]);

        // create some properties and get the default Session
        Properties props = System.getProperties();
        props.put("mail.smtp.host", host);
        props.setProperty("mail.smtp.quitwait", "false");

        Session session = Session.getInstance(props, null);

        try {
            // criar mensagem
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(from));
            msg.setRecipients(Message.RecipientType.TO, vetor);
            msg.setSubject(subject);

            // criar a primeira parte da mensagem
            MimeBodyPart mbp1 = new MimeBodyPart();
            mbp1.setText(msgText1);

            // criar a segunda parte da mensagem, responsavel pelos anexos
            MimeBodyPart mbp2 = new MimeBodyPart();
            MimeBodyPart mbp3 = new MimeBodyPart();
            MimeBodyPart mbp4 = new MimeBodyPart();

            // isnerir anexo 1
            FileDataSource fds = new FileDataSource(filename);
            mbp2.setDataHandler(new DataHandler(fds));
            mbp2.setFileName(fds.getName());

            // isnerir anexo 2
            FileDataSource fds2 = new FileDataSource(filename2);
            mbp3.setDataHandler(new DataHandler(fds2));
            mbp3.setFileName(fds2.getName());
            
            // isnerir anexo 3
            FileDataSource fds3 = new FileDataSource(filename3);
            mbp4.setDataHandler(new DataHandler(fds3));
            mbp4.setFileName(fds3.getName());

            // cria o objeto multipart e adiciona as partes a ele
            Multipart mp = new MimeMultipart();
            mp.addBodyPart(mbp1);
            mp.addBodyPart(mbp2); //anexo1
            mp.addBodyPart(mbp3); //anexo2
            mp.addBodyPart(mbp4); //anexo3

            // adicionar o multipart na mensagem
            msg.setContent(mp);

            // setar data atual
            msg.setSentDate(new Date());

            // enviar msg
            Transport.send(msg);

        } catch (MessagingException mex) {
            /*mex.printStackTrace();
            Exception ex = null;
            if ((ex = mex.getNextException()) != null) {
                ex.printStackTrace();
            }*/
            StackTraceElement[] ste=mex.getStackTrace();
            String erro="";
            for(int i=0;i<ste.length;i++){
                erro+="--"+ste[i].toString()+"\n";
            }
            JOptionPane.showMessageDialog(null,"Erro ao enviar email, verifique os emails dos destinatários e a configuração\n\n"+erro);
        }
    }
}

Alguma ideia?

3 Respostas

A

cara,

da uma olhada no Commons Email muito simples e facil de usar.

t+

mateusviccari

Pelo que vi o commons mail foi feito baseado no javamail, e o codigo que vi muda praticamente nada do meu.
O que eu achei estranho em ambos os casos foi nao precisar configurar senha do email… assim da pra mandar emails falsos pra quem quiser que nao vai haver risco de recusão?

A

Cara,

com certeza vai ficar muito mais simples que do seu, agora se seu email nao necessita de autenticação, qualquer enviador de email vai enviar.

t+

Criado 27 de dezembro de 2011
Ultima resposta 27 de dez. de 2011
Respostas 3
Participantes 2